《Linux内存管理:实验驱动的深度探索》【附录】【实验环境搭建 4】【Qemu 如何模拟numa架构】

我们在学习 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. 这种配置的特点

  1. NUMA 特性:CPU 访问本地节点内存比访问远程节点内存更快

  2. CPU 拓扑

    • Socket 0: CPU 0-3 (关联 Node 0)

    • Socket 1: CPU 4-7 (关联 Node 1)

  3. 内存分布:内存平均分布在两个节点上,各 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
相关推荐
m0_6948455718 分钟前
服务器如何配置防火墙规则开放/关闭端口?
linux·服务器·安全·云计算
阿巴~阿巴~1 小时前
Linux基本命令篇 —— alias命令
linux·服务器·bash
好名字更能让你们记住我2 小时前
Linux多线程(十二)之【生产者消费者模型】
linux·运维·服务器·jvm·windows·centos
学习编程的gas2 小时前
Linux开发工具——gcc/g++
linux·运维·服务器
嵌入式成长家2 小时前
ubuntu rules 使用规则
linux·ubuntu·rules 使用规则
_可乐无糖2 小时前
AWS WebRTC: 判断viewer端拉流是否稳定的算法
linux·服务器·webrtc·aws
数据智能老司机3 小时前
Linux内核编程——Linux设备模型
linux·架构·操作系统
BD_Marathon3 小时前
ubuntu防火墙使用
linux·ubuntu
dessler3 小时前
Kafka-消费者(Consumer)和消费者组(Consumer Group)
linux·运维·kafka
kfepiza3 小时前
Debian-10-standard用`networking`服务的`/etc/network/interfaces`配置文件设置多网卡多IPv6
linux·debian