对于CPU和NUMA架构的介绍本文不再做叙述,感兴趣的可自行查看:Linux--CPU简述,Linux--内存管理浅谈。
进程绑定NUMA节点或cpu核心的意义
NUMA 架构将内存和cpu分散在不同的 NUMA 节点上,每个节点都有自己的本地内存和cpu处理器,将进程绑定到特定的 NUMA 节点或cpu上,可以让进程直接访问本地内存和CPU,减少访问远程节点开销,提高访问速度,从而提高程序性能。
注:不可多进程绑定同一个节点或cpu,这样反而会使该节点产生资源竞争,降低性能。
查看NUMA架构的信息
[root@test ~]# yum -y install numactl
[root@test ~]# numactl -H
available: 2 nodes (0-1) #有两个NUMA节点,编号0,1
node 0 cpus: 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 #节点0包含的cpu核心编号
node 0 size: 65442 MB #节点0共有65442MB的内存容量
node 0 free: 5901 MB #节点0当前有5091MB的内存空闲
node 1 cpus: 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31
node 1 size: 65536 MB
node 1 free: 5133 MB
node distances: #不同node之间发访问距离(跳数),如[0,0] 表示node 0的本地内存访问距离为10。跳数(hops):表示从一个节点到达另一个节点所需的内存访问步骤数,并不是一个精确的时间或距离单位,而是一种相对指标。
node 0 1
0: 10 21
1: 21 10
[root@test ~]#
[root@test ~]# lscpu
...
#系统的NUMA节点和 CPU 核心编号的映射
NUMA node0 CPU(s): 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30
NUMA node1 CPU(s): 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31
...
[root@test ~]#
CodeBlock Loading...
绑定
注:下述绑定方法都属于临时绑定,进程重启后失效;要永久生效,请在应用程序中设置绑定或配置文件里提前配置。
绑定NUMA节点
#运行前执行,将进程运行的cpu跟内存绑定到节点0上
numactl --cpunodebind=0 --membind=0 程序名
#接启动命令
numactl --cpunodebind=0 --membind=0 /usr/sbin/nginx
查看进程运行内存信息
[root@test ~]# numastat -p 223736
Per-node process memory usage (in MBs) for PID 223736 (nginx)
Node 0 Node 1 Total
--------------- --------------- ---------------
Huge 0.00 0.00 0.00 #使用的大页内存
Heap 0.94 0.00 0.94 #堆内存
Stack 0.02 0.00 0.02 #栈内存
Private 1.17 0.07 1.24 #其他使用内存
---------------- --------------- --------------- ---------------
Total 2.13 0.07 2.21
查看进程绑定cpu核心
CodeBlock Loading...
查看进程的 PID、所运行的 CPU 核心编号以及命令名称
CodeBlock Loading...
绑定cpu核心
CodeBlock Loading...
查看进程运行在哪个cpu上
CodeBlock Loading...