私はlscpu
を使用して2つのサーバー構成をチェックしました:
[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ノードの数が常にソケットと等しいかどうか疑問に思っています。それらが等しくない例はありますか?
なぜNUMAノードの数が気になるのですか?重要な部分はNUMAトポロジで、これらの「ノード」がどのように接続されているかを示しています。
4相互接続された2ソケットブレードで構成される8ソケット(10コアCPU)システムを含むいくつかのシステムを確認しました(Hitachi Compute Node 2000)。ここでもNUMAノードの数はCPUソケットの数(8)これは、CPUアーキテクチャ、主にそのメモリバス設計に依存します。
NUMA全体(不均一なメモリアクセス)は、各論理CPUがメモリの各部分にアクセスする方法を定義します。 2ソケットシステムの場合、各CPU(ソケット)には独自のメモリがあり、直接アクセスできます。ただし、他のソケットのメモリにもアクセスできなければなりません。もちろん、これにはローカルメモリにアクセスするよりも多くのCPUサイクルが必要です。 NUMAノードは、システムメモリのどの部分がどのCPUに対してローカルであるかを指定します。トポロジーの層を増やすことができます。たとえば、(Intel Itanium2 CPUを使用する)HP Superdomeシステムの場合、ローカル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であることがわかります。ブレードのレイテンシは、同じブレードまたは他のブレードの異なるソケットでも同じです。
NUMAに関する興味深いドキュメントも RedHatポータル にあります。
いいえ。NUMAノードの数は、必ずしもソケットの数と同じであるとは限りません。たとえば、AMD Threadripper 1950Xには1つのソケットと2つのNUMAノードがありますが、デュアルIntel Xeon E5310システムには2つのソケットと1つのNUMAノードを表示できます。