numactl 是一个用于控制 NUMA(Non-Uniform Memory Access) 策略的 Linux 工具集。它允许你查看系统的 NUMA 拓扑结构,并将进程或共享内存绑定到特定的 CPU 节点和内存节点,从而优化应用程序的性能,尤其是在多路服务器上。

1. 如何安装 numactl

numactl 在绝大多数 Linux 发行版的官方仓库中都有提供。请根据你的发行版选择以下命令进行安装。

在 Ubuntu / Debian 上安装

使用 apt 包管理器进行安装:

sudo apt update
sudo apt install numactl
在 RHEL / CentOS / Rocky Linux / AlmaLinux 上安装

使用 yum 或 dnf 包管理器进行安装:

# 对于 CentOS/RHEL 7 或更早版本,使用 yum
sudo yum install numactl

# 对于 CentOS/RHEL 8/9, Rocky Linux, AlmaLinux,使用 dnf
sudo dnf install numactl
在 Fedora 上安装
sudo dnf install numactl
在 SUSE / openSUSE 上安装
sudo zypper install numactl
从源代码安装(不推荐,除非有特殊需求)

如果你的发行版非常古老,或者你需要某个特定的版本,可以从源代码编译安装。

  1. 安装依赖(主要是编译工具):

    # Ubuntu/Debian
    sudo apt install build-essential
    
    # RHEL/CentOS
    sudo yum groupinstall "Development Tools"
  2. 下载、编译并安装

    wget https://github.com/numactl/numactl/releases/download/v2.0.16/numactl-2.0.16.tar.gz
    tar -xzvf numactl-2.0.16.tar.gz
    cd numactl-2.0.16
    ./configure
    make
    sudo make install

2. 验证安装

安装完成后,可以通过查看版本信息来验证是否安装成功:

numactl --version

输出会类似于:

numactl v2.0.14

3. numactl 的基本使用

安装好后,最重要的功能是查看系统 NUMA 信息和控制程序运行策略。

a) 查看系统 NUMA 拓扑

这是最常用的命令,可以清晰地看到你的系统有几个 NUMA 节点,以及每个节点包含哪些 CPU 核心和多少内存。

numactl --hardware

输出示例:

available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
node 0 size: 128831 MB
node 0 free: 12001 MB
node 1 cpus: 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
node 1 size: 129017 MB
node 1 free: 23451 MB
node distances:
node   0   1
  0:  10  21
  1:  21  10

从这个输出可以看到:

  • 系统有 2 个 NUMA 节点(Node 0 和 Node 1)。

  • Node 0 有 24 个 CPU 线程(0-23, 48-71)和约 128GB 内存。

  • Node 1 有 24 个 CPU 线程(24-47, 72-95)和约 129GB 内存。

  • node distances 显示了访问内存的延迟成本。访问本地节点(例如 Node 0 访问 Node 0)的成本是 10,而跨节点访问(Node 0 访问 Node 1)的成本是 21,明显更高。

b) 运行一个程序并绑定到特定 CPU 和内存节点

这是 numactl 的核心功能,用于优化性能。

  • --cpunodebind: 将进程绑定到在指定节点上的 CPU 运行。

  • --membind: 只从指定的节点分配内存。

示例 1:将程序 my_app 绑定到节点 0 的 CPU 上运行,并且只使用节点 0 的内存

numactl --cpunodebind=0 --membind=0 ./my_app

示例 2:将程序 my_app 绑定到节点 0 和节点 1 的 CPU 上运行(使用多个节点),并且优先使用这些节点的内存

numactl --cpunodebind=0,1 --membind=0,1 ./my_app

示例 3:一个常用的优化策略:交错内存分配(interleave)
这对于内存密集型应用(如数据库)很有用,可以将内存请求均匀分布到所有节点,避免单个节点内存带宽的瓶颈。

numactl --interleave=all ./my_app
c) 查看当前进程的 NUMA 状态
numactl --show

这个命令会显示当前 shell 的 NUMA 策略设置。

 

4. 另一个实用工具:numastat

安装 numactl 时通常也会安装 numastat。这个工具可以显示每个 NUMA 节点的内存统计信息,帮助你分析是否有内存分配不均的情况。

numastat

输出会显示每个节点上分配的内存情况(numa_hitnuma_miss等),如果 numa_miss 很高,说明有很多本该在本地节点分配的内存分配到了其他节点,这可能意味着你需要使用 numactl 进行绑定来优化性能。

numastat -c my_app # 查看特定进程的 NUMA 内存状态

小结一下

操作 命令
安装 (Ubuntu/Debian) sudo apt install numactl
安装 (RHEL/CentOS) sudo yum install numactl
查看硬件拓扑 numactl --hardware
绑定到节点 0 运行 numactl --cpunodebind=0 --membind=0 ./app
交错内存分配 numactl --interleave=all ./app
查看当前策略 numactl --show
查看节点内存状态 numastat

Logo

惟楚有才,于斯为盛。欢迎来到长沙!!! 茶颜悦色、臭豆腐、CSDN和你一个都不能少~

更多推荐