我們在學習 linux 內核時,會涉及到很多 numa 的知識,那我們該如何在 qemu 中模擬這種情況,來配合我們的學習呢?
我們該如何模擬 如下的 numa 架構
Qemu 模擬 NUMA 架構
-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. 可運行的配置如下:
/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