跳转至

NUMA

NUMA

NUMA(Non-Uniform Memory Access,非一致性内存访问)绑核工具,主要为了防止 CPU 资源争抢引发性能降低的问题

numactl

numactl 通过将 CPU 划分多个 node 减少 CPU 对总线资源的竞争,一般使用在高配置服务器部署多个 CPU 消耗性服务使用

简介

  • 查看 numa 状态
numactl --show

numactl --hardware

详情

> numactl --show
policy: default
preferred node: current
physcpubind: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
cpubind: 0
nodebind: 0
membind: 0
preferred:

> numactl --hardware
available: 1 nodes (0)
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 24 25 26 27 28 29 30 31
node 0 size: 128172 MB
node 0 free: 82387 MB
node distances:
node   0
  0:  10

此系统共有 1 个 node,node0 有全部 CPU 和内存

还可以通过下面的命令查看

numastat

详情

> numastat
                           node0
numa_hit              1984974541
numa_miss                      0
numa_foreign                   0
interleave_hit              1923
local_node            1984967448
other_node                     0

说明:

  • numa_hit:该节点成功分配本地内存访问的内存大小
  • numa_miss:内存访问分配到另一个 node 的大小,该值和另一个 node 的 numa_foreign 相对应
  • local_node:该节点的进程成功在本节点上分配内存访问的大小
  • other_node:该节点进程在其它节点上分配的内存访问的大小

注意:missforeign 的值越高,就考虑 CPU 绑定

使用示例

(1)内存交织分配模式

使用 --interleave 参数,如占用内存的 mongodb 程序,共享所有 node 内存:

numactl --interleave=all mongod -f /etc/mongod.conf

(2)内存绑定

numactl --cpunodebind=0 --membind=0 python param
numactl --physcpubind=0 --membind=0 python param

(3)CPU 绑定

numactl -C 0-1 ./test

将应用程序 test 绑定到 0~1 核上运行