qemu-kvm 问题

guest内部显示内存充裕:

 

宿主机内存也充裕:

 

guest 对应的qemu-kvm进程在不停地将内存中的数据交换到swap中:

 

还有相同问题的另一个实例:

宿主机有足够的内存,qemu-kvm占用5.3G的swap,只使用566MB的内存,为什么?

guest内部的内存使用情况如下:

 

分析:

我们可能看见guest中看到的已用内存小于kvm进程的rss, 因为kvm进程的内存不仅包含提供给guest使用的内存,也包含自身其他需要的内存。

我们也可能看见guest中看到的已用内存大于kvm进程的rss,因为guest看到的内存未必是真正的内存,很可能早已被宿主机给交换到swap中去了,这就是我们上面看到的情况;guest刚刚起来的时候,并没有直接分配自己可以使用的最大内存,但是,可能某一个时刻一下子占用了90%的内存,当内存下降到10%的时候,80%的内存并没有还给宿主机,而是闲着,但是,宿主机永远不知道这80%的内存是在闲着的,唯一知道的就是好长时间没有访问了,于是,宿主机可能就会将这部分(不活跃的)内存交换到swap中去;等到guest想用内存的时候,其实访问的并不是内存,而是宿主机上的swap; 疑问: 随着guest中这80%的内存的频繁使用,会使得guest的真实内存变多而swap变少吗?应该会的

 

场景1: 大内存的kvm(16GB),里面只有一个使用很少内存(200MB)的小程序,不断地从外部下载文件,写入到磁盘中,结果就是: 下载过的文件都会被尽量缓存到内存中,16GB的内存大部分用于cache了,而且下载过的文件基本不会再被使用,于是,这部分内存就是in-active的了,于是,表现在宿主机上,这部分内存就会被尽力swap到磁盘上,当宿主机的swap被用尽时,其他进程想swap却很为难:

guest:

宿主机上:

宿主机上的kvm进程的RES远大于guest中内存的used,因为宿主机上的swap已用尽,如果添加更多的swap的话,会继续有更多的RES迁移到swap中去。

 

解决办法:

  1. guest本没必要使用16GB内存,给2GB就可以了; (尽管如此,也会有不必要的cache存在)
  2. guest中可以定期地drop cache,避免cache占用太大; 理论上来讲,一旦guest有大量的cache占用了内存,即使drop cache了,宿主机上也不会释放这部分内存(或swap),因为宿主机根本不知道这部分内存是不再使用了的;(当然,可以通过别的方式真正意义上回收这部分内存),如下:

    guest中drop cache后,buff/cache使用1.2G,宿主机上的RES、swap依然保持不变; 其实,不仅drop cache不能影响宿主机分配给guest的内存大小,reboot guest都不会影响宿主机分配给guest的内存大小的,因为reboot guest是热引导,kvm进程还是原来的进程,宿主机也不知道里面发生了重启的动作,所以,分配给kvm进程的资源也不会有变化

 

参考资料:

https://searchservervirtualization.techtarget.com/tip/Memory-swap-strategies-for-KVM

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据