Linux CPUInfo中NUMA架构的应用具体如何快速掌握?

更新于
2026-08-11 00:28:11
4阅读来源:SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

如果你在多核服务器上跑高性能应用。却总感觉“内存访问慢”或“进程迁移频繁”,那很可能是你没有利用NUMA架构。下面用最直白的语言拆解NUMA在Linux CPUInfo中的实战,让你能迅速上手。

1️⃣ 先把SMP和NUMA的区别想清楚

SMP是早期设计:所有CPU通过同一条总线共享同一块物理内存。因为主要数增多,总线竞争成了瓶颈。导致内存访问延迟飙升。说起来,

Linux CPUInfo中NUMA架构的应用具体如何快速掌握?

NUMA则把内存划分为若干本地 node每个CPU只能最快访问自己的本地内存。跨 node 的访问要慢一些。换个角度把热点数据放到它使用的 CPU 所在的 node 上,就是打败总线瓶颈的关键。

Linux CPUInfo中NUMA架构的应用具体如何快速掌握?

2️⃣ Linux 对 NUMA 的抽象与工具

  • /proc/cpuinfo – 查看 CPU 与其对应的 node 信息。
  • /sys/devices/system/node/ – 目录里列出每个 node 的 CPU、内存等细节。
  • numactl – 绑定进程到指定 CPU / 内存节点;还能检查当前节点分布,老实说,
  • /proc/sys/kernel/numa_balancing/proc/sys/kernel/numa_balancing_topology_changes,等 sysctl 参数控制自动迁移策略。

常用命令速查

# 查看所有节点及其包含的 CPU
cat /proc/cpuinfo | grep "physical id" -n
# 查看某个进程当前所在节点
cat /proc//status | grep Numa
# 绑定进程到 node0 的 CPU 和内存
numactl --cpunodebind=0 --membind=0 ./my_app
# 查看程序中可用节点
numactl --hardware

3️⃣ 常见痛点 & 快捷方式

a) “我的程序跑慢,但不知道为什么”

  • #1 检查是否跨 Node 访问大量数据:
    # 用 numactl --show 显示当前进程所在节点
    pid=12345;
    numactl --pid=$pid --show
    
  • #2 如果发现频繁迁移:
    # 禁用自动迁移
    echo 0> /proc/sys/kernel/numa_balancing
    
  • #3 确认是否使用了透明大页 :
    # 检查状态
    cat /sys/kernel/mm/transparent_hugepage/enabled
    # 如需关闭。可改为 'never'
    echo never> /sys/kernel/mm/transparent_hugepage/enabled
    

b) “我想让所有线程都在同一个 Node 上运行”

  • #1 使用 pthread_setaffinity_np 或 OpenMP 的环境变量 OMP_PROC_BIND=TRUE、OMP_PLACES=threads 等:
  • #2 或直接用 numactl 包装整个程序:
  • # 假设有 8 主要,全部属于 node0
    numactl -c 0-7 -m 0 ./heavy_task
    

c) “如何让程序自适应最佳节点?按理说,”

  • Linux 自带的 numa_balancing 可以根据负载动态迁移进程。但在高并发下会产生额外开销。可考虑开启或关闭:
    # 开启
    echo 1> /proc/sys/kernel/numa_balancing
    # 或完全关闭再自行调度:
    echo 0> /proc/sys/kernel/numa_balancing
    

4️⃣ 实战案例:跑一个简单 web 服务+ 数据库时如何做 NUMA 调优?

  • Nginx 刚好占满所有主要。 但主要工作是 IO,IO 在本地 Node 上速度更快。
  • Mysql 大量缓存。最好绑定到一个 Node 的 CPU + 本地内存,以减少跨 Node 的读写延迟。
  • 实现方式:
  • # Nginx 绑定到全部主要但仅限 node0 内存:
    sudo numactl -C all -m 0 nginx
    # MySQL 配置文件 my.cnf 加入:
    thread_cache_size = 256
    innodb_buffer_pool_instances = $/4))
    innodb_buffer_pool_size = $) # 根据机器调整
    # 接下来手动启动 MySQL 并绑定:
    sudo numactl -C $ -m $ mysqld_safe &
    

5️⃣ 小结:快速了解 NUMA 的三步曲 🎯

  1. 先识别痛点:"进程频繁迁移"、"内存访问慢"、"CPU 与内存不匹配" 等等。用 /proc/cpuinfo + numactl --hardware + pid status查看现状。
  2. 再做一次性绑定:"将关键服务固定在单一 Node",使用 numactl --cpunodebind=` 和 `--membind=`。这一步往往能立刻提高性能并稳定下来。
  3. 最终:"开启或关闭 numa_balancing",根据业务场景决定是否需要动态迁移;如果需要透明大页,可根据负载调节 THP 开关。

标签:Linux

如果你在多核服务器上跑高性能应用。却总感觉“内存访问慢”或“进程迁移频繁”,那很可能是你没有利用NUMA架构。下面用最直白的语言拆解NUMA在Linux CPUInfo中的实战,让你能迅速上手。

1️⃣ 先把SMP和NUMA的区别想清楚

SMP是早期设计:所有CPU通过同一条总线共享同一块物理内存。因为主要数增多,总线竞争成了瓶颈。导致内存访问延迟飙升。说起来,

Linux CPUInfo中NUMA架构的应用具体如何快速掌握?

NUMA则把内存划分为若干本地 node每个CPU只能最快访问自己的本地内存。跨 node 的访问要慢一些。换个角度把热点数据放到它使用的 CPU 所在的 node 上,就是打败总线瓶颈的关键。

Linux CPUInfo中NUMA架构的应用具体如何快速掌握?

2️⃣ Linux 对 NUMA 的抽象与工具

  • /proc/cpuinfo – 查看 CPU 与其对应的 node 信息。
  • /sys/devices/system/node/ – 目录里列出每个 node 的 CPU、内存等细节。
  • numactl – 绑定进程到指定 CPU / 内存节点;还能检查当前节点分布,老实说,
  • /proc/sys/kernel/numa_balancing/proc/sys/kernel/numa_balancing_topology_changes,等 sysctl 参数控制自动迁移策略。

常用命令速查

# 查看所有节点及其包含的 CPU
cat /proc/cpuinfo | grep "physical id" -n
# 查看某个进程当前所在节点
cat /proc//status | grep Numa
# 绑定进程到 node0 的 CPU 和内存
numactl --cpunodebind=0 --membind=0 ./my_app
# 查看程序中可用节点
numactl --hardware

3️⃣ 常见痛点 & 快捷方式

a) “我的程序跑慢,但不知道为什么”

  • #1 检查是否跨 Node 访问大量数据:
    # 用 numactl --show 显示当前进程所在节点
    pid=12345;
    numactl --pid=$pid --show
    
  • #2 如果发现频繁迁移:
    # 禁用自动迁移
    echo 0> /proc/sys/kernel/numa_balancing
    
  • #3 确认是否使用了透明大页 :
    # 检查状态
    cat /sys/kernel/mm/transparent_hugepage/enabled
    # 如需关闭。可改为 'never'
    echo never> /sys/kernel/mm/transparent_hugepage/enabled
    

b) “我想让所有线程都在同一个 Node 上运行”

  • #1 使用 pthread_setaffinity_np 或 OpenMP 的环境变量 OMP_PROC_BIND=TRUE、OMP_PLACES=threads 等:
  • #2 或直接用 numactl 包装整个程序:
  • # 假设有 8 主要,全部属于 node0
    numactl -c 0-7 -m 0 ./heavy_task
    

c) “如何让程序自适应最佳节点?按理说,”

  • Linux 自带的 numa_balancing 可以根据负载动态迁移进程。但在高并发下会产生额外开销。可考虑开启或关闭:
    # 开启
    echo 1> /proc/sys/kernel/numa_balancing
    # 或完全关闭再自行调度:
    echo 0> /proc/sys/kernel/numa_balancing
    

4️⃣ 实战案例:跑一个简单 web 服务+ 数据库时如何做 NUMA 调优?

  • Nginx 刚好占满所有主要。 但主要工作是 IO,IO 在本地 Node 上速度更快。
  • Mysql 大量缓存。最好绑定到一个 Node 的 CPU + 本地内存,以减少跨 Node 的读写延迟。
  • 实现方式:
  • # Nginx 绑定到全部主要但仅限 node0 内存:
    sudo numactl -C all -m 0 nginx
    # MySQL 配置文件 my.cnf 加入:
    thread_cache_size = 256
    innodb_buffer_pool_instances = $/4))
    innodb_buffer_pool_size = $) # 根据机器调整
    # 接下来手动启动 MySQL 并绑定:
    sudo numactl -C $ -m $ mysqld_safe &
    

5️⃣ 小结:快速了解 NUMA 的三步曲 🎯

  1. 先识别痛点:"进程频繁迁移"、"内存访问慢"、"CPU 与内存不匹配" 等等。用 /proc/cpuinfo + numactl --hardware + pid status查看现状。
  2. 再做一次性绑定:"将关键服务固定在单一 Node",使用 numactl --cpunodebind=` 和 `--membind=`。这一步往往能立刻提高性能并稳定下来。
  3. 最终:"开启或关闭 numa_balancing",根据业务场景决定是否需要动态迁移;如果需要透明大页,可根据负载调节 THP 开关。

标签:Linux