本文档解释了virtio pmem设备的建立和使用。virtio pmem设备为正规存储中的半虚拟化持续内存设备。
1 使用场景
virtio pmem允许绕过guest page cache并直接使用host page cache。这会减少guest内存footprint因为host可以在内存压力下做出有效内存回收。
2 virtio-pmem vs nvdimm模拟
在正常host存储上的NVDIMM模拟不会坚持guest写因为在设备spec中没有定义的语义。virtio pmem设备提供在non-NVDIMM host存储上的guest写。
3 virtio pmem的使用
可以使用QEMU命令行创建一个以memory-backend-file备份的virtio pmem设备,如下面例子所示:
-object memory-backend-file,id=mem1,share,mem-path=./virtio_pmem.img,size=4G
-device virtio-pmem-pci,memdev=mem1,id=nv1
这里,"object memory-backend-file,id=mem1,share,mem-path=<image>,size=<image size>"创建一个指定大小的backend文件。
"device virtio-pmem-pci,memdev=mem1,id=nv1"通过上述内存后端设备创建一个virtio pmem PCI设备
如果提供多个"-object"和"-device"对,多virtio pmem设备将被创建。
4 Hotplug
可以通过QEMU monitor对virtio pmem设备进行热插。首先,通过object_add来增加内存备份;然后通过device_add增加virtio pmem设备。
比如,下面命令对guest增加另外4GB virtio pmem设备:
(qemu) object_add memory-backend-file,id=mem2,share=on,mem-path=virtio_pmem2.img,size=4G
(qemu) device_add virtio-pmem-pci,id=virtio_pmem2,memdev=mem2
5 Guest Data Persistence
在non-NVDIMM上的guest data persistence要求guest用户应用发送fsync/msync。这与真实的nvdimm后端不一样,并不需要另外的fsync/msync。在host后备文件上坚持guest写,这仍在host page cache中,这会在电源失败时导致数据丢失的风险。
对于virtio pmem设备,MAP_SYNC标志不支持。它提供暗示给应用让其对write persistence发fsync。
6 限制
- 不支持真实nvdimm设备后端
- 不支持virtio pmem hotplug
- 不支持ACPI NVDIMM特性如regions/namespaces
- 不支持ndctl命令