我有用来运行KVM虚拟机的RHEL6.2服务器。
服务器本身有16 GB的RAM。 我想看看我能运行的最大的虚拟机,而不是让qemu-kvm进程交换。 VM内存大约15GB。 (是的,我意识到这是在推动极限,但在回答诸如“15GB太多”之类的问题之前,读到最后。)
[root@xxx libvirt]# virsh dumpxml VM2 | grep -i memory <memory>15000000</memory> <currentMemory>15000000</currentMemory> [root@xxx libvirt]# ps -ef | grep kvm root 872 1 16 10:55 ? 00:03:00 /usr/libexec/qemu-kvm [...] -m 14649 -name VM2 [...] [root@xxx libvirt]# free -k total used free shared buffers cached Mem: 16332640 16194440 138200 0 1544 15700 -/+ buffers/cache: 16177196 155444 Swap: 35651568 7583432 28068136
但KVM进程的RSS仅为880 MB(下面的第6列)。 我预计它会更像12-14 GB。
[root@xxx libvirt]# ps -eF | grep kvm root 872 1 14 4534221 882916 7 10:55 ? 00:03:11 /usr/libexec/qemu-kvm
而且,如果我把所有进程的RSS加起来,它只有1gig。
[root@xxx libvirt]# ps -eF | awk '{print $6}' | grep '[0-9]' | tr '\n' '+' | sed 's/+$/\n/' | bc 1004064
这里是最大的记忆用户(RSS,第6列)的过程。
root 5188 22329 0 27572 1192 4 11:19 pts/0 00:00:00 ps -eF root 31461 1 0 10746 1236 7 Jul25 ? 00:06:22 [...] root 6339 6275 0 272676 3288 4 Jul27 ? 00:13:38 [...] root 2059 1 1 443909 13352 7 Jul17 ? 05:29:11 libvirtd --daemon root 872 1 13 4534221 928300 2 10:55 ? 00:03:24 /usr/libexec/qemu-kvm [...]
我预计虚拟机仍然可以使用大约300-500 MB的内存。
UPDATE
重新启动机器后,我不能再现这一点。 系统现在按我的预期工作。 这是预期的数字。
哦,我应该提到。 在虚拟机中运行一个内存密集型程序。 它分配总内存的80%,并不断向其写入随机数。
虚拟机的RSS:
[root@hb05b15 ~]# ps -eF | grep kvm root 7330 1 97 4520362 12483728 2 11:59 ? 00:39:55 /usr/libexec/qemu-kvm [...]
Mem和交换号码:
[root@hb05b15 ~]# free -k total used free shared buffers cached Mem: 16332640 13277468 3055172 0 21064 215196 -/+ buffers/cache: 13041208 3291432 Swap: 35651568 0 35651568
总结所有进程的RSS:
[root@hb05b15 ~]# ps -eF | awk '{print $6}' | grep '[0-9]' | tr '\n' '+' | sed 's/+$/\n/' | bc 12607180
正在使用的交换机和主动交换机之间有很大的区别。 内核会抢占越来越多的磁盘,因为它看到大量内存的调用。 如果将这些东西移出到磁盘并不经常使用,那么这不一定是个大问题。 如果数据不断被换入,那么通常会有一个很大的问题。 这里真正的措施是看一下像iostat这样的东西来观察在给定的时间间隔内来回传递的数据量。
也就是说,16G机箱上的15G虚拟机可能不会发挥出色。 操作系统本身需要一定的金额,虚拟机总是有一定比例的开销。 如果你实际上正在积极地交换,那么你可能会看到实质性的改进,例如12或13G。
您没有为操作系统,文件系统caching或其他任何内容留下任何内存。
不要在没有足够的空间的情况下将虚拟机内存如此之高。
现在,当然,你可以禁用交换,看看会发生什么…