You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在Linux启动时将内核代码加载到指定NUMA节点?

Linux内核基准测试NUMA节点绑定方案

关键结论

Linux启动时没有直接强制所有内核代码加载到单个NUMA节点的命令行参数,但可以通过以下方法实现你的测试目标——让被测内核代码与绑定的用户态CPU处于同一NUMA节点:

具体实现方案

1. 给被测内核代码添加显式NUMA亲和性

如果被测内核逻辑是你自行实现的(比如自定义系统调用),可以在代码层面指定内存分配的NUMA节点:

  • 用numa_node_id()获取当前运行CPU所属的NUMA节点ID
  • 分配内存时,使用alloc_pages_node()(针对页分配)或kmalloc_node()(针对slab分配),传入目标节点ID
  • 若涉及已存在的内核数据,可调用migrate_pages()将其迁移到目标NUMA节点

2. 用户态与内核态协同传递NUMA信息

既然你已经能在用户态绑定CPU到指定NUMA节点,可在触发系统调用时把该CPU的NUMA节点ID传给内核:

  • 用户态通过numa_node_of_cpu()(libnuma库函数)或读取/sys/devices/system/cpu/cpuX/numa_node文件,获取绑定CPU的节点ID,作为系统调用参数传入
  • 内核态接收该参数后,执行被测逻辑时优先使用对应节点的内存资源

3. 调整系统NUMA内存分配策略

通过sysfs或工具调整内核的NUMA分配倾向:

  • 开启本地节点优先回收:echo 1 > /sys/kernel/mm/numa/zone_reclaim_mode,让内核尽量在本地NUMA节点分配内存
  • 使用numactl给用户态进程设置严格的内存亲和性(比如numactl --cpunodebind=0 --membind=0 ./your_test),内核为该进程服务时会优先使用同节点内存

4. 验证NUMA命中情况

用工具确认测试是否符合预期:

  • 用perf stat -e numa_hit,numa_miss ./your_test统计内存访问的NUMA命中/缺失次数
  • 用numastat查看各NUMA节点的内存使用,确认被测代码的内存分配是否集中在目标节点

补充说明

Linux内核启动时会将核心镜像和初始化代码分散到各个NUMA节点,以保证系统整体性能,因此没有提供强制单一节点加载的命令行参数。但通过上述针对性的亲和性设置,完全可以满足基准测试的需求。

内容的提问来源于stack exchange,提问作者sk_buff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 22:47:37