Linux--程序繫結NUMA節點或cpu核心

心恩惠动發表於2024-07-22

對於cpu和NUMA架構本文不再做敘述,感興趣的可自行檢視:https://www.cnblogs.com/Xinenhui/p/17972709https://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

相關文章