为什么我的KVM,RHEL6.2服务器要交换?

为什么我的KVM,RHEL6.2服务器要交换?

我有一台 RHEL6.2 服务器,用来运行 KVM 虚拟机。

服务器本身有 16 GB 的 RAM。我想看看我能在其上运行的最大 VM,而不让 qemu-kvm 进程交换。VM RAM 约为 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 的内存。

更新

重启机器后,我无法再重现此问题。系统现在按我预期的方式运行。以下是预期数字。

哦,我应该提一下。虚拟机中正在运行一个内存密集型程序。它分配了总内存的 80%,并不断向其中写入随机数。

VM 的 RSS:

[root@hb05b15 ~]# ps -eF | grep kvm
root      7330     1 97 4520362 12483728 2 11:59 ?     00:39:55 /usr/libexec/qemu-kvm [...]

内存和交换号码:

[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

答案1

没有任何剩余 RAM 可用于操作系统、文件系统缓存或其他任何东西。

在没有留出足够空间的情况下,请勿将虚拟机的 RAM 推得太高。

现在,当然,您可以禁用交换并看看会发生什么......

答案2

正在使用的交换和机器主动交换之间存在很大差异。当内核看到对大量内存的请求时,它会抢先将越来越多的数据移到磁盘上。如果移出到磁盘的内容不是经常使用,那么它不一定是一个大问题。如果数据不断地被换入和换出,那么通常就会有一个大问题。这里真正的衡量标准是查看 iostat 之类的东西,以观察在给定时间间隔内实际来回传递的数据量。

话虽如此,在 16G 的机器上安装 15G 的虚拟机可能效果不佳。操作系统本身需要一定的内存,而且虚拟机总是有一定比例的开销。如果你确实在积极地进行交换,那么你可能会看到显著的改进,只需退回到 12 或 13G 即可。

相关内容