我们在学习 linux 内核时,会涉及到很多 numa 的知识,那我们该如何在 qemu 中模拟这种情况,来配合我们的学习呢?
-M virt,gic-version=3,virtualization=on,type=virt \
-cpu cortex-a57 -nographic -m 4G \
-smp cores=4,threads=1,sockets=2 \
-object memory-backend-ram,id=mem0,size=2G \
-object memory-backend-ram,id=mem1,size=2G \
-numa node,memdev=mem0,cpus=0-3,nodeid=0 \
-numa node,memdev=mem1,cpus=4-7,nodeid=1 \
-M virt,gic-version=3,virtualization=on,type=virt
-M virt
: 指定机器类型为 virt
,这是一个通用的虚拟平台
gic-version=3
: 使用 GICv3 (Generic Interrupt Controller version 3) 中断控制器
virtualization=on
: 启用虚拟化支持
type=virt
: 进一步指定虚拟平台类型
-cpu cortex-a57 -nographic -m 4G
-cpu cortex-a57
: 模拟 ARM Cortex-A57 处理器
-nographic
: 不使用图形界面,直接输出到控制台
-m 4G
: 为虚拟机分配 4GB 内存
-smp cores=4,threads=1,sockets=2
cores=4
: 每个 CPU socket 有 4 个核心
threads=1
: 每个核心 1 个线程 (无超线程)
sockets=2
: 2 个 CPU sockets
总 CPU 数 = sockets × cores × threads = 2 × 4 × 1 = 8 个 CPU
-object memory-backend-ram,id=mem0,size=2G
-object memory-backend-ram,id=mem1,size=2G
创建两个内存后端对象:
mem0
: 2GB RAM
mem1
: 2GB RAM
总共 4GB (2G + 2G) 内存,与 -m 4G
匹配
-numa node,memdev=mem0,cpus=0-3,nodeid=0
-numa node,memdev=mem1,cpus=4-7,nodeid=1
定义两个 NUMA 节点:
节点 0:
使用 mem0
内存后端 (2GB)
关联 CPU 0-3 (即第一个 socket 的 4 个核心)
节点 ID 为 0
节点 1:
使用 mem1
内存后端 (2GB)
关联 CPU 4-7 (即第二个 socket 的 4 个核心)
节点 ID 为 1
NUMA 特性:CPU 访问本地节点内存比访问远程节点内存更快
CPU 拓扑:
Socket 0: CPU 0-3 (关联 Node 0)
Socket 1: CPU 4-7 (关联 Node 1)
内存分布:内存平均分布在两个节点上,各 2GB
这种配置非常适合测试和开发 NUMA 相关的应用程序或内核功能,比如:
NUMA 感知的内存分配策略
进程/线程绑定到特定 NUMA 节点
内存访问性能优化等
/home/leo/data_4t/github/kernel_version/qemu-7.2.0-rc1/build/aarch64-softmmu/qemu-system-aarch64 \
-nographic \
-M virt,gic-version=3,virtualization=on,type=virt \
-cpu cortex-a57 -nographic -m 4G \
-smp cores=4,threads=1,sockets=2 \
-object memory-backend-ram,id=mem0,size=2G \
-object memory-backend-ram,id=mem1,size=2G \
-numa node,memdev=mem0,cpus=0-3,nodeid=0 \
-numa node,memdev=mem1,cpus=4-7,nodeid=1 \
-kernel /home/leo/data_4t/github/kernel_version/linux-5.4/build/arch/arm64/boot/Image \
-append "nokaslr root=/dev/ram init=/linuxrc console=ttyAMA0 console=ttyS0" \
-initrd /home/leo/data_4t/github/kernel_version/initrd.ext4