numactl --membind 未生效的主因是 NUMA 未启用,须先用 numactl --hardware 确认多节点存在;再配对使用 --cpunodebind 和 --membind,并预分配对应节点的大页。
numactl --membind 为什么没生效?检查 NUMA 节点拓扑是前提
直接跑
却发现内存还是从其他节点分配,大概率是因为你没确认当前系统真实的 NUMA 布局。Linux 内核启动时若未启用 NUMA 支持(比如内核参数缺
),或 BIOS 中关闭了 NUMA,
就会退化为无操作。
务必先执行:
看输出里是否有多个
及其对应 CPU 和内存大小。若只显示
,说明 NUMA 实际未启用,后续所有亲和性配置都无效。
BIOS 中需开启 Node Interleaving(通常要关)、NUMA mode(开)
GRUB 配置中确保内核命令行含
,重启后验证
下有
和
应显示 “NUMA node(s)” 数量 > 1
用 --membind 还是 --cpunodebind?二者必须配对才防跨核访问
只约束内存分配节点,不绑 CPU;
只绑 CPU 核心,不约束内存。单独用任一参数,进程仍可能在节点 1 的 CPU 上运行,却从节点 0 分配内存——这正是跨 NUMA 访问延迟的根源。
正确做法是显式指定同一节点的 CPU + 内存:
若应用是多线程且线程数固定,优先用
绑定整组 CPU,再用
锁定对应内存节点
避免混用
和
:跨节点 CPU 会强制触发远程内存访问
是软策略,仅作为 fallback,不能替代
进程启动后如何验证内存真的落在目标节点?别信 top,要看 numastat
或
显示的内存总量无法区分 NUMA 节点来源。
也看不到页级分配位置。真正有效的验证工具是
。
CentOS Linux 7.9.2009
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离线兼容性测试。
下载
先拿到进程 PID,再执行:
重点关注输出中的
列:它表示该进程在各节点实际使用的物理内存字节数。若
后,
显著高于其他节点(尤其
接近 0),说明生效。
若
报错 “No such process”,说明进程已退出或权限不足(需 root 或同用户)
注意区分
全局统计(无
)和进程级统计,后者才是关键
某些容器环境(如 Docker)中,
需在容器内执行,宿主机上查不到进程级 NUMA 分布
大页内存 + numactl 怎么配合?hugepages 必须预分配且节点对齐
启用大页(hugepage)能进一步降低 TLB miss,但
不会自动帮你把大页映射到指定节点。若大页只在 node1 预分配,而你
,进程将 fallback 到普通页,失去大页优势。
步骤必须严格按顺序:
先用
在目标节点预分配(替换
和数值)
确认分配成功:
和
启动时加
参数:
验证:
/smaps | grep -i "hugetlb" 应有非零值,且
中 hugepage 使用量集中在目标节点
漏掉预分配或节点不匹配,
会静默失效,进程照常跑但没走大页路径。
numactl --membind=0 ./appnuma=onnumactlnumactl --hardwarenodeavailable: 1 nodesnuma=on/sys/firmware/acpi/tables/SRATSLITlscpu | grep -i numa--membind--cpunodebindnumactl --cpunodebind=0 --membind=0 ./app--cpunodebind--membind--cpunodebind=0,1--membind=0--preferred=0--membindtophtoppsnumastatnumastat -p PIDMemUsed--membind=0node0 MemUsednode1 MemUsednumastat -pnumastat-pnumactlnumactl--membind=0echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepagesnode0grep HugePages_Total /proc/meminfonumastat | grep -A5 "Huge"--hugenumactl --cpunodebind=0 --membind=0 --huge ./appcat /proc/PIDnumastat -p PID--huge