我曾經lscpu
檢查過兩台伺服器的配置:
[root@localhost ~]# lscpu
Architecture: x86_64
......
Core(s) per socket: 1
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 26
另一個:
[root@localhost Packages]# lscpu
Architecture: x86_64
.....
Socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 45
所以我想知道 NUMA 節點的數量實際上是否總是等於套接字的數量。有沒有例子說明它們不相等?
答案1
為什麼您想知道 NUMA 節點的數量?重要的部分是 NUMA 拓撲,它說明了這些「節點」是如何連接的。
我檢查了幾個系統,包括由 4 個互連的 2 插槽刀片組成的 8 插槽(10 核 CPU)系統(Hitachi Compute Node 2000)。這裡 NUMA 節點的數量也等於 CPU 插槽的數量 (8)。這取決於CPU架構,主要是其記憶體匯流排設計。
整個NUMA(非均勻記憶體存取)定義了每個邏輯CPU如何存取記憶體的各個部分。當你有 2 插槽系統時,每個 CPU(插槽)都有自己的內存,可以直接存取。但它還必須能夠存取另一個套接字中的記憶體 - 這當然比存取本地記憶體需要更多的 CPU 週期。 NUMA 節點指定係統記憶體的哪一部分位於哪個 CPU 的本機。您可以有更多的拓撲層,例如,在HP Superdome 系統(使用Intel Itanium2 CPU)的情況下,您有本地CPU 插槽內存,然後是同一單元內不同插槽上的內存,然後是其他單元中的記憶體(具有最高延遲)。
您可以在系統中配置 NUMA,以便為您的工作負載提供盡可能最佳的效能。例如,您可以允許所有 CPU 存取所有內存,或僅存取本地內存,這將改變 Linux 調度程序在可用邏輯 CPU 之間分配進程的方式。如果您有許多不需要太多記憶體的進程,則僅使用本地記憶體可能會有所幫助,但如果您有大型進程(Oracle 資料庫及其共享記憶體),則在所有cpu 之間使用所有記憶體可能會更好。
numastat
您可以使用或等待指令numactl --hardware
檢查系統上的 NUMA 狀態。以下是該 8 插槽機器的資訊:
hana2:~ # lscpu
Architecture: x86_64
CPU(s): 160
Thread(s) per core: 2
Core(s) per socket: 10
CPU socket(s): 8
NUMA node(s): 8
NUMA node0 CPU(s): 0-19
NUMA node1 CPU(s): 20-39
NUMA node2 CPU(s): 40-59
NUMA node3 CPU(s): 60-79
NUMA node4 CPU(s): 80-99
NUMA node5 CPU(s): 100-119
NUMA node6 CPU(s): 120-139
NUMA node7 CPU(s): 140-159
hana2:~ # numactl --hardware
available: 8 nodes (0-7)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
node 0 size: 130961 MB
node 0 free: 66647 MB
node 1 cpus: 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
node 1 size: 131072 MB
node 1 free: 38705 MB
node 2 cpus: 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
node 2 size: 131072 MB
node 2 free: 71668 MB
node 3 cpus: 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
node 3 size: 131072 MB
node 3 free: 47432 MB
node 4 cpus: 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
node 4 size: 131072 MB
node 4 free: 68458 MB
node 5 cpus: 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
node 5 size: 131072 MB
node 5 free: 62218 MB
node 6 cpus: 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
node 6 size: 131072 MB
node 6 free: 68071 MB
node 7 cpus: 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
node 7 size: 131008 MB
node 7 free: 47306 MB
node distances:
node 0 1 2 3 4 5 6 7
0: 10 21 21 21 21 21 21 21
1: 21 10 21 21 21 21 21 21
2: 21 21 10 21 21 21 21 21
3: 21 21 21 10 21 21 21 21
4: 21 21 21 21 10 21 21 21
5: 21 21 21 21 21 10 21 21
6: 21 21 21 21 21 21 10 21
7: 21 21 21 21 21 21 21 10
在那裡,您可以看到每個 NUMA 節點(CPU 插槽)中存在的記憶體量以及已使用和空閒的記憶體量。
最後一部分顯示了 NUMA 拓撲 - 它顯示了各個節點之間在記憶體存取延遲方面的「距離」(這些數字只是相對的,它們不代表以毫秒為單位的時間或其他任何值)。在這裡,您可以看到本地內存的延遲(節點0 訪問0 中的內存,節點1 訪問1 中的內存,...)為10,而遠端延遲(節點訪問其他節點上的內存)為21。儘管該系統由4 個單獨的刀片,同一刀片或其他刀片上的不同插槽的延遲是相同的。
關於 NUMA 的有趣文件也位於紅帽門戶。
答案2
不。例如,AMD Threadripper 1950X 有 1 個插槽和 2 個 NUMA 節點,而雙 Intel Xeon E5310 系統可以顯示 2 個插槽和 1 個 NUMA 節點。
答案3
其實沒有。在我的伺服器上:
➜ lscpu
Socket(s): 2
NUMA node(s): 4
NUMA node0 CPU(s): 0-31,128-159
NUMA node1 CPU(s): 32-63,160-191
NUMA node2 CPU(s): 64-95,192-223
NUMA node3 CPU(s): 96-127,224-255
在我的伺服器上,NUMA Node0 和 Node1 位於套接字 0,其餘兩個位於套接字 1。