對於cpu和NUMA架構本文不再做敘述,感興趣的可自行檢視:https://www.cnblogs.com/Xinenhui/p/17972709,https://www.cnblogs.com/Xinenhui/p/17897482.html
1、程序繫結NUMA節點或cpu核心的意義
NUMA 架構將記憶體和cpu分散在不同的 NUMA 節點上,每個節點都有自己的本地記憶體和cpu處理器,將程序繫結到特定的 NUMA 節點或cpu上,可以讓程序直接訪問本地記憶體和CPU,減少訪問遠端節點開銷,提高訪問速度,從而提高程式效能。
注:不可多程序繫結同一個節點或cpu,這樣反而會使該節點產生資源競爭,降低效能。
2、檢視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 ~]#
[root@test ~]# yum -y install hwloc [root@test ~]# lstopo-no-graphics Machine (128GB total) #總共有128GB記憶體 NUMANode L#0 (P#0 64GB) #節點 L#0 有64GB記憶體 Package L#0 + L3 L#0 (20MB) L2 L#0 (256KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0 PU L#0 (P#0) PU L#1 (P#16) L2 L#1 (256KB) + L1d L#1 (32KB) + L1i L#1 (32KB) + Core L#1 PU L#2 (P#2) PU L#3 (P#18) L2 L#2 (256KB) + L1d L#2 (32KB) + L1i L#2 (32KB) + Core L#2 PU L#4 (P#4) PU L#5 (P#20) L2 L#3 (256KB) + L1d L#3 (32KB) + L1i L#3 (32KB) + Core L#3 PU L#6 (P#6) PU L#7 (P#22) L2 L#4 (256KB) + L1d L#4 (32KB) + L1i L#4 (32KB) + Core L#4 PU L#8 (P#8) PU L#9 (P#24) L2 L#5 (256KB) + L1d L#5 (32KB) + L1i L#5 (32KB) + Core L#5 PU L#10 (P#10) PU L#11 (P#26) L2 L#6 (256KB) + L1d L#6 (32KB) + L1i L#6 (32KB) + Core L#6 PU L#12 (P#12) PU L#13 (P#28) L2 L#7 (256KB) + L1d L#7 (32KB) + L1i L#7 (32KB) + Core L#7 PU L#14 (P#14) PU L#15 (P#30) HostBridge L#0 PCIBridge PCI 1000:005d Block L#0 "sda" PCIBridge 2 x { PCI 8086:154d } PCIBridge 4 x { PCI 8086:1521 } PCI 8086:8d62 PCIBridge PCIBridge PCIBridge PCIBridge PCI 102b:0534 GPU L#1 "card0" GPU L#2 "controlD64" PCI 8086:8d02 NUMANode L#1 (P#1 64GB) + Package L#1 + L3 L#1 (20MB) L2 L#8 (256KB) + L1d L#8 (32KB) + L1i L#8 (32KB) + Core L#8 PU L#16 (P#1) PU L#17 (P#17) L2 L#9 (256KB) + L1d L#9 (32KB) + L1i L#9 (32KB) + Core L#9 PU L#18 (P#3) PU L#19 (P#19) L2 L#10 (256KB) + L1d L#10 (32KB) + L1i L#10 (32KB) + Core L#10 PU L#20 (P#5) PU L#21 (P#21) L2 L#11 (256KB) + L1d L#11 (32KB) + L1i L#11 (32KB) + Core L#11 PU L#22 (P#7) PU L#23 (P#23) L2 L#12 (256KB) + L1d L#12 (32KB) + L1i L#12 (32KB) + Core L#12 PU L#24 (P#9) PU L#25 (P#25) L2 L#13 (256KB) + L1d L#13 (32KB) + L1i L#13 (32KB) + Core L#13 PU L#26 (P#11) PU L#27 (P#27) L2 L#14 (256KB) + L1d L#14 (32KB) + L1i L#14 (32KB) + Core L#14 PU L#28 (P#13) PU L#29 (P#29) L2 L#15 (256KB) + L1d L#15 (32KB) + L1i L#15 (32KB) + Core L#15 PU L#30 (P#15) PU L#31 (P#31) [root@test ~]#
3、繫結
注:下述繫結方法都屬於臨時繫結,程序重啟後失效;要永久生效,請在應用程式中設定繫結或配置檔案裡提前配置。
3.1 繫結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核心
[root@test ~]# taskset -c -p 223736 pid 223736's current affinity list: 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30
檢視程序的 PID、所執行的 CPU 核心編號以及命令名稱
[root@test ~]# ps -o pid,psr,comm -p 223736 PID PSR COMMAND 223736 22 nginx
3.2 繫結cpu核心
#繫結執行在6號cpu上 taskset -c 6 /usr/sbin/nginx #繫結執行在0-6號cpu上 taskset -c 0,6 /usr/sbin/nginx
#繫結到NUMA架構1號節點上
numactl --cpubind=1 /usr/sbin/nginx
numactl --cpunodebind=1 /usr/sbin/nginx
檢視程序執行在哪個cpu上
[root@test ~]# taskset -c -p 219877 pid 219877's current affinity list: 6 [root@test ~]# ps -o pid,psr,comm -p 219877 PID PSR COMMAND 219877 6 nginx