| QEMU memory hotplug | |
| =================== | |
| This document explains how to use the memory hotplug feature in QEMU, | |
| which is present since v2.1.0. | |
| Guest support is required for memory hotplug to work. | |
| Basic RAM hotplug | |
| ----------------- | |
| In order to be able to hotplug memory, QEMU has to be told how many | |
| hotpluggable memory slots to create and what is the maximum amount of | |
| memory the guest can grow. This is done at startup time by means of | |
| the -m command-line option, which has the following format: | |
| -m [size=]megs[,slots=n,maxmem=size] | |
| Where, | |
| - "megs" is the startup RAM. It is the RAM the guest will boot with | |
| - "slots" is the number of hotpluggable memory slots | |
| - "maxmem" is the maximum RAM size the guest can have | |
| For example, the following command-line: | |
| qemu [...] -m 1G,slots=3,maxmem=4G | |
| Creates a guest with 1GB of memory and three hotpluggable memory slots. | |
| The hotpluggable memory slots are empty when the guest is booted, so all | |
| memory the guest will see after boot is 1GB. The maximum memory the | |
| guest can reach is 4GB. This means that three additional gigabytes can be | |
| hotplugged by using any combination of the available memory slots. | |
| Two monitor commands are used to hotplug memory: | |
| - "object_add": creates a memory backend object | |
| - "device_add": creates a front-end pc-dimm device and inserts it | |
| into the first empty slot | |
| For example, the following commands add another 1GB to the guest | |
| discussed earlier: | |
| (qemu) object_add memory-backend-ram,id=mem1,size=1G | |
| (qemu) device_add pc-dimm,id=dimm1,memdev=mem1 | |
| Using the file backend | |
| ---------------------- | |
| Besides basic RAM hotplug, QEMU also supports using files as a memory | |
| backend. This is useful for using hugetlbfs in Linux, which provides | |
| access to bigger page sizes. | |
| For example, assuming that the host has 1GB hugepages available in | |
| the /mnt/hugepages-1GB directory, a 1GB hugepage could be hotplugged | |
| into the guest from the previous section with the following commands: | |
| (qemu) object_add memory-backend-file,id=mem1,size=1G,mem-path=/mnt/hugepages-1GB | |
| (qemu) device_add pc-dimm,id=dimm1,memdev=mem1 | |
| It's also possible to start a guest with memory cold-plugged into the | |
| hotpluggable memory slots. This might seem counterintuitive at first, | |
| but this allows for a lot of flexibility when using the file backend. | |
| In the following command-line example, an 8GB guest is created where 6GB | |
| comes from regular RAM, 1GB is a 1GB hugepage page and 256MB is from | |
| 2MB pages. Also, the guest has additional memory slots to hotplug more | |
| 2GB if needed: | |
| qemu [...] -m 6GB,slots=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 | |
| RAM hot-unplug | |
| --------------- | |
| In order to be able to hot unplug pc-dimm device, QEMU has to be told the ids | |
| of pc-dimm device and memory backend object. The ids were assigned when you hot | |
| plugged memory. | |
| Two monitor commands are used to hot unplug memory: | |
| - "device_del": deletes a front-end pc-dimm device | |
| - "object_del": deletes a memory backend object | |
| For example, assuming that the pc-dimm device with id "dimm1" exists, and its memory | |
| backend is "mem1", the following commands tries to remove it. | |
| (qemu) device_del dimm1 | |
| (qemu) object_del mem1 |