模拟NUMA系统
有时候我们需要模拟NUMA结构的系统,qemu也可以给我们做到~
qemu命令行参数:
-m 8G -numa node,nodeid=0 -numa node,nodeid=1
这样我们就有一台两个节点的系统了。
进入系统,分析一下内存分布:
[ 0.000000] Early memory node ranges
[ 0.000000] node 0: [mem 0x0000000000001000-0x000000000009efff]
[ 0.000000] node 0: [mem 0x0000000000100000-0x00000000bffdefff]
[ 0.000000] node 0: [mem 0x0000000100000000-0x000000013fffffff]
[ 0.000000] node 1: [mem 0x0000000140000000-0x000000023fffffff]
可以看到在node1上的内存是4G,node0上合计也差不多是4G。所以基本上是平分的。
同时qemu也支持了设定每个节点上的内存大小。
qemu命令行:
-m 8G -numa node,mem=1G,nodeid=0 -numa node,mem=7G,nodeid=1
进入系统,再分析一下内存分布:
[ 0.000000] Early memory node ranges
[ 0.000000] node 0: [mem 0x0000000000001000-0x000000000009efff]
[ 0.000000] node 0: [mem 0x0000000000100000-0x000000003fffffff]
[ 0.000000] node 1: [mem 0x0000000040000000-0x00000000bffdefff]
[ 0.000000] node 1: [mem 0x0000000100000000-0x000000023fffffff]
瞧,在node0上的内存差不多是1G了,而在node2上就有7G了。
热插拔
这个blog写得真不错 memory hotplug
如果想要做热插拔,qemu的参数需要有所改动。
-m 8G,slots=32,maxmem=32G
这表示了
- 最多有32个槽可以进行内存热插拔
- 最大能够支持到的内存是32G
热插拔有两种方式可以实现:
- 纯动态,通过qemu monitor来操作
- 半动态,在qemu命令中指定
其实这两个方式背后的实现是一样的,只是应用场景会有点不一样。前者适用于生产环境上动态添加,后者适用于测试环境避免了每次输入命令行。
我们先来看看纯动态怎么操作。
- 切换到qemu monitor。
- object_add memory-backend-ram,id=ram0,size=1G
- device_add pc-dimm,id=dimm0,memdev=ram0,node=0
完成~简单~
再来看看半动态的命令行怎么写
-object memory-backend-ram,id=mem1,size=256M -object memory-backend-ram,id=mem0,size=256M \
-device pc-dimm,id=dimm1,memdev=mem1,slot=1,node=0 -device pc-dimm,id=dimm0,memdev=mem0,slot=0,node=0
你看,其实长得差不多吧。
啰嗦一句,这里只完成了内存热插拔的物理上线,逻辑上线还需要自己处理哦~