本文档介绍在QEMU中如何使用内存热插拔特性,该特性从V2.1.0开始存在。
要让内存热插拔工作需要支持Guest。
1 基本RAM的热插
为了能够支持内存热插拔,QEMU需要说明创建多少个内存slot以及guest支持最大的内存大小。这在开始时使用-m命令行选项来实现,格式如下所示:
-m [size=]megs[,slots=n,maxmem=size]
其中,megs为开始时RAM内存大小,它为Guest启动时RAM大小 ,slots为可插拔的内存slot个数,maxmem为Guest支持的最大的RAM大小。
比如,可以使用如下命令:
qemu [...] -m 1G,slot=3,maxmem=4G
创建Guest,1GB大小内存,3个可插拔内存slot。当guest启动时可插拔内存slot为空,因此guest在启动时可看到内存为1G。Guest可达到最大内存为4GB。这意味着3个额外的GB可通过使用内存slot来增加。
两个monitor命令可用于热插拔内存:
- “object_add”: 创建一个内存后端object
- “device_add”: 创建一个前端pc-dimm设备并将其插入第一个空闲slot
比如,如下命令增加另外1GB内存到之前讨论的guest上:
(qemu) object_add memory-backend-ram, id=mem1, size=1GB
(qemu) device_add pc-dimm,id=dimm1,memdev=mem1
2 使用文件后端
除了基本的RAM热插拔,QEMU也支持使用文件作为内存后端。这在LINUX中对于使用hugetlbfs非常有用,它能够提供更大页的访问。
比如,假定host在目录/mnt/hugepages-1GB有1GB大页,可以使用如下命令将1GB有用的大页从之前的section插到guest中。
(qemu) object_add memory-backend-file, id=mem1, size=1GB,mem-path=/mnt/hugepages-1GB
(qemu) device_add pc-dimm,id=dimm1,memdev=mem1
也可能启动内存冷热入可热插拔到内存slot的guest。这看起来有悖常理,但是当使用文件后面时允许更灵活。
在下面命令行例子中,创建8GB的guest,其中6GB来自正常的RAM,1GB为1GB大页而256MB来自2MB页。同时guest有其他内存slot可以热插2GB:
qemu [...] -m 6GB,slot=4,maxmem=10G \
-object memory-backend-file,id=mem1,size=1G,mem-path=/mnt/hugepages-1G \
-device pc-dimm,id=dimm1,memdev=mem1 \
-object memory-backend-file,id=mem2,size=256M,mem-path=/mnt/hugepages-2MB \
-device pc-dimm,id=dimm2,memdev=mem2 \
3 RAM热拔
为了能够热拔pc-dimm设备,QEMU必须pc-dimm设备的ids和内存后端object。当你热插时ids被赋值。
两个monitor命令用来热㧞内存:
- “device_del”: 删去一个前端pc-dimm设备
- “object_del”: 创建一个内存后端object
比如,假定id为”dimm1”的pc-dimm设备已经存在,它的内存后端为”mem1”,如下命令尝试移除它。
(qemu) device_del dimm1
(qemu) object_del mem1
本文翻译来自:
memory-hotplug.txt - docs/memory-hotplug.txt - Qemu source code (v6.2.0) - Bootlin