![为什么我的KVM,RHEL6.2服务器要交换?](https://linux22.com/image/591514/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E7%9A%84KVM%EF%BC%8CRHEL6.2%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%A6%81%E4%BA%A4%E6%8D%A2%EF%BC%9F.png)
我有一台 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 即可。