我们在学习 linux 内核时,会涉及到很多 numa 的知识,那我们该如何在 qemu 中模拟这种情况,来配合我们的学习呢?
我们该如何模拟 如下的 numa 架构
Qemu 模拟 NUMA 架构
shell
-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 \
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
: 进一步指定虚拟平台类型
2. CPU 配置
-cpu cortex-a57 -nographic -m 4G
-
-cpu cortex-a57
: 模拟 ARM Cortex-A57 处理器 -
-nographic
: 不使用图形界面,直接输出到控制台 -
-m 4G
: 为虚拟机分配 4GB 内存
3. SMP (对称多处理) 配置
-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
4. 内存后端配置
-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
匹配
5. NUMA 配置
-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
-
-
6. 这种配置的特点
-
NUMA 特性:CPU 访问本地节点内存比访问远程节点内存更快
-
CPU 拓扑:
-
Socket 0: CPU 0-3 (关联 Node 0)
-
Socket 1: CPU 4-7 (关联 Node 1)
-
-
内存分布:内存平均分布在两个节点上,各 2GB
这种配置非常适合测试和开发 NUMA 相关的应用程序或内核功能,比如:
-
NUMA 感知的内存分配策略
-
进程/线程绑定到特定 NUMA 节点
-
内存访问性能优化等
7. 可运行的配置如下:
shell
/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