numastat 是什么
numastat 按 NUMA 节点统计内存分配的命中情况:numa_hit 表示在本节点分配成功,numa_miss 与 numa_foreign 表示实际落到了别的节点上(对分配者而言是 miss,对提供者而言是 foreign)。这两项持续偏高,说明进程的内存分布与它运行的 CPU 不在同一节点,会造成跨节点访存、抬高延迟,是 NUMA 调优最直接的量化信号。
基本信息
| 系统级视图 | numastat(各节点各项计数) |
|---|---|
| 内存视图 | numastat -m(各节点内存总量、已用与空闲) |
| 进程级视图 | numastat -p <pid> |
| 拓扑参考 | numactl --hardware |
| 数据性质 | 多数为累计计数,判断趋势需多次采样 |
| 前提 | 仅在多 NUMA 节点机器上才有意义 |
典型使用场景
- 判断服务是否存在跨节点访存:numa_miss 与 numa_foreign 持续偏高
- 核对绑定策略是否一致:CPU 绑到节点 0 而内存落在节点 1 属于典型错配
- 评估大内存应用(数据库、缓存、JVM)的 NUMA 亲和性收益
- 与延迟指标联动,验证 NUMA 调优前后的实际变化
- 容器与虚机环境确认节点可见性与内存分布是否可控
查看与验证
查看与验证
numastat # 系统级:各节点的 numa_hit/miss/foreign 等累计计数
numastat -m # 各节点内存总量、已用与空闲,判断节点是否失衡
numastat -p 12345 | head # 指定进程的内存节点分布
numactl --hardware | head # 确认节点数量、内存大小与节点间距
# 调整绑定后复测,比较 foreign 与 miss 的变化
numactl --cpunodebind=0 --membind=0 ./service # CPU 与内存同时绑到节点 0计数读法
| 计数 | 含义 | 判读要点 |
|---|---|---|
| numa_hit | 在本节点成功分配的次数 | 越高越好,反映本地命中 |
| numa_miss | 本节点分配失败而落到别处 | 对分配者是跨节点访问 |
| numa_foreign | 别的节点分配失败而落到本节点 | 本节点在为别人供内存,分布失衡 |
| interleave_hit | 交错分配策略的命中次数 | 仅在启用 interleave 策略时有意义 |
| local_node / other_node | 本地与其他节点的分配统计 | 用于对比整体的本地化程度 |
这些统计是累计值,单次读数只反映历史分布。判断当前是否存在跨节点访问压力,需要多次采样对比增量,并与业务延迟指标一起看。
只绑 CPU 不绑内存是常见疏漏:CPU 固定到某节点后,内存仍可能按默认策略落在别的节点,跨节点访存依然存在,必须用 numactl 的 membind 或 mempolicy 同步约束。