NUMA 節點的數量總是等於套接字數量嗎?

NUMA 節點的數量總是等於套接字數量嗎?

我曾經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。

相關內容