numactl 安装和简介
numactl是一个用于控制策略的 Linux 工具集。它允许你查看系统的 NUMA 拓扑结构,并将进程或共享内存绑定到特定的 CPU 节点和内存节点,从而优化应用程序的性能,尤其是在多路服务器上。
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
从源代码安装(不推荐,除非有特殊需求)
如果你的发行版非常古老,或者你需要某个特定的版本,可以从源代码编译安装。
-
安装依赖(主要是编译工具):
# Ubuntu/Debian sudo apt install build-essential # RHEL/CentOS sudo yum groupinstall "Development Tools"
-
下载、编译并安装:
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_hit
, numa_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 |
更多推荐
所有评论(0)