qemu热迁移后内存占用突增问题
1.问题描述
虚拟机配置了memoryBacking=memfd的情况下,热迁移虚拟机后,在目的节点 qemu-kvm 进程占用 rss 会突增很多。
如果去掉这个配置没这个现象。
<memoryBacking><source type='memfd'/>
</memoryBacking>
2.问题现象
2.1 不配置 memoryBacking=memfd
的情况
- 热迁移前 rss 占用如下:
- 热迁移后 rss 占用如下:
可以看到 rss 占用还有所减少(减小原因是迁移过程中对 零页面 进行了lazy 处理),迁移前后变化不大, 多次反复迁移rss占用基本维持在 400M 左右。
2.2 配置 memoryBacking=memfd
的情况
- 热迁移前 rss 占用如下:
- 热迁移后 rss 占用如下:
可以看到 rss 占用突然 从 468M 增到 1087M, 多次反复迁移rss占用基本维持在 1080M 左右。
3.问题分析
迁移前 memfd 占用如下:
迁移后 memfd 占用如下:
可以看出,迁移前后内存突增基本是来自memfd的 rss 占用
如下图,qemu代码中中对memfd 申请的内存,都是非匿名的:
如下图代码,是qemu迁移时候,对全零页的处理,对于 memfd 申请的内存,调用 buffer_is_zero() 函数会出发缺页异常,因而会进行内存分配。
4.结论
使用了memfd的虚拟机,热迁移后qemu内存rss占用会增大到虚拟机设置大小,原因是热迁移时候会读取整个虚拟机内存页面,对于memfd内存,读操作会分配物理页面,而mmap分配的普通匿名内存则不会。