私は 2 つのサーバーの構成を確認するために使用しました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 ソケット ブレード (Hitachi Compute Node 2000) で構成される 8 ソケット (10 コア CPU) システムを含むいくつかのシステムをチェックしました。ここでも、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に関する興味深い文書もここにありますRedHatポータル。
答え2
いいえ。NUMA ノードの数は、必ずしもソケットの数と同じではありません。たとえば、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 に配置され、残りの 2 つはサーバー上のソケット 1 に配置されます。