この記事では、Linux の uma アーキテクチャに関する関連知識を提供します。お役に立てば幸いです。
次のケースは Ubuntu 16.04 に基づいており、他の Linux システムにも適用できます。私が使用したケース環境は次のとおりです。
マシン構成: 32 CPU、64GB メモリ
##1) プロセッサー層: 単一の物理コアはプロセッサー層と呼ばれます。 2) ローカル ノード層: ノード内のすべてのプロセッサに対して、このノードはローカル ノードと呼ばれます。 3)ホームノード層:ローカルノードに隣接するノードをホームノードと呼ぶ。 4) リモートノード層: ローカルノードや隣接ノードではないノードはリモートノードと呼ばれます。 CPU がノードの種類によってメモリにアクセスする速度は異なります。ローカル ノードへのアクセス速度が最も速く、リモート ノードへのアクセス速度が最も遅くなります。つまり、アクセス速度はノードの距離に関係します。距離が離れるほどアクセス速度が遅くなり、この距離をノード距離といいます。アプリケーションは、異なる CPU モジュール間の相互作用を最小限に抑えるように努める必要があり、アプリケーションを CPU モジュール内で固定できれば、アプリケーションのパフォーマンスは大幅に向上します。
** Kunpeng 920 プロセッサに基づく CPU チップの構成について説明します。 ** Kunpeng 920 プロセッサ システムオンチップの各スーパー コア クラスタには、6 つのコア クラスタ、2 つの I/O クラスタが含まれます。および 4 つの DDR コントローラー。各スーパー コア クラスターは CPU チップにパッケージ化されています。各チップには、最大 3200MT/s のデータ転送速度を持つ 4 つの 72 ビット (64 ビット データ + 8 ビット ECC) 高速 DDR4 チャネルが統合されており、単一チップで最大 512GB×4 DDR ストレージ スペースをサポートできます。 L3 キャッシュは、L3 キャッシュ TAG と L3 キャッシュ DATA の 2 つの部分に物理的に分割されています。 L3 キャッシュ TAG は各コア クラスターに統合されており、リスニング レイテンシーを短縮します。 L3 キャッシュ DATA はオンチップ バスに直接接続されています。 Hydra Root Agent (Hydra Home Agent、HHA) は、マルチチップ システムのキャッシュ一貫性プロトコルを処理するモジュールです。 POE_ICL はシステム構成のハードウェア アクセラレータであり、通常、パケット シーケンサ、メッセージ キュー、メッセージ配信として使用したり、特定のプロセッサ コアの特定のタスクを実装したりするために使用できます。さらに、各スーパー コア クラスターは、ARM の GICv4 仕様と互換性のある汎用割り込みコントローラー ディストリビューター (GICD) モジュールを使用して物理的に構成されています。シングルチップまたはマルチチップ システムに複数のスーパー コア クラスタがある場合、システム ソフトウェアから認識できる GICD は 1 つだけです。
Linux には、手動チューニング コマンド umactl が 1 つ用意されています (デフォルトではインストールされません)。Ubuntu でのインストール コマンドは次のとおりです。
sudo apt install numactl -y
まず、man numactl または umactl --h を使用して、パラメーターの機能と出力内容を理解します。システムの NUMA ステータスを確認します。
numactl --hardware
を実行すると、次の結果が得られます。
available: 4 nodes (0-3) node 0 cpus: 0 1 2 3 4 5 6 7 node 0 size: 16047 MB node 0 free: 3937 MB node 1 cpus: 8 9 10 11 12 13 14 15 node 1 size: 16126 MB node 1 free: 4554 MB node 2 cpus: 16 17 18 19 20 21 22 23 node 2 size: 16126 MB node 2 free: 8403 MB node 3 cpus: 24 25 26 27 28 29 30 31 node 3 size: 16126 MB node 3 free: 7774 MB node distances: node 0 1 2 3 0: 10 20 20 20 1: 20 10 20 20 2: 20 20 10 20 3: 20 20 20 10
この図とコマンドから得られた結果によると、 、このシステムには合計 4 つのノードがあり、それぞれに 8 つの CPU と 16G のメモリが搭載されていることがわかります。ここで注意する必要があるのは、CPU によって共有される L3 キャッシュも、対応する領域を独自に受け取ることになるということです。 umastat コマンドを使用して uma のステータスを確認できます。戻り値の内容:
uma_hit: このノードにメモリを割り当てる意図と、このノードからの最後の割り当て数です。
uma_miss: このノードにメモリを割り当てることが目的です。メモリが割り当てられ、最終的に他のノードから割り当てられた回数です。
uma_foreign: メモリがこのノードに割り当てられる回数です。他のノードに割り当てられますが、最終的にはこのノードから割り当てられます;
interleave_hit: インターリーブ戦略が使用され、このノードから割り当てられる回数は最終的にこのノードによって割り当てられる回数です。
local_node: このノード上のプロセスがこのノードに割り当てられた回数
other_node: 他のノードのプロセスがこのノードに割り当てられた回数
注: uma_miss の値が比較的高いことが判明した場合、配分戦略を調整する必要があることを意味します。たとえば、指定されたプロセスの関連付けが指定された CPU にバインドされるため、メモリ ヒット率が向上します。
root@ubuntu:~# numastat node0 node1 node2 node3 numa_hit 19480355292 11164752760 12401311900 12980472384 numa_miss 5122680 122652623 88449951 7058 numa_foreign 122652643 88449935 7055 5122679 interleave_hit 12619 13942 14010 13924 local_node 19480308881 11164721296 12401264089 12980411641 other_node 5169091 122684087 88497762 67801
--localalloc または -l: プロセスがローカル ノードからのメモリ割り当てを要求することを指定します。 --membind=nodes または -m nodes: プロセスが指定されたノードからのみメモリ割り当てを要求できることを指定します。 --preferred=node: メモリを取得するための推奨ノードを指定します。取得に失敗した場合は、別のノードを試してください。 --interleave=nodes または -i nodes: プロセスがラウンド ロビン アルゴリズムを使用して、指定されたノードからメモリ割り当てをインターリーブ的に要求することを指定します。
numactl --interleave=all mongod -f /etc/mongod.conf
因为NUMA默认的内存分配策略是优先在进程所在CPU的本地内存中分配,会导致CPU节点之间内存分配不均衡,当开启了swap,某个CPU节点的内存不足时,会导致swap产生,而不是从远程节点分配内存。这就是所谓的swap insanity 现象。或导致性能急剧下降。所以在运维层面,我们也需要关注NUMA架构下的内存使用情况(多个内存节点使用可能不均衡),并合理配置系统参数(内存回收策略/Swap使用倾向),尽量去避免使用到Swap。
Node->Socket->Core->Processor
随着多核技术的发展,将多个CPU封装在一起,这个封装被称为插槽Socket;Core是socket上独立的硬件单元;通过intel的超线程HT技术进一步提升CPU的处理能力,OS看到的逻辑上的核Processor数量。
Socket = Node
Socket是物理概念,指的是主板上CPU插槽;Node是逻辑概念,对应于Socket。
Core = 物理CPU
Core是物理概念,一个独立的硬件执行单元,对应于物理CPU;
Thread = 逻辑CPU = Processor
Thread是逻辑CPU,也就是Processo
lscpu的使用
显示格式:
Architecture:架构
CPU(s):逻辑cpu颗数
Thread(s) per core:每个核心线程,也就是指超线程
Core(s) per socket:每个cpu插槽核数/每颗物理cpu核数
CPU socket(s):cpu插槽数
L1d cache:级缓存(google了下,这具体表示表示cpu的L1数据缓存)
L1i cache:一级缓存(具体为L1指令缓存)
L2 cache:二级缓存
L3 cache:三级缓存
NUMA node0 CPU(s) :CPU上的逻辑核,也就是超线程
执行lscpu,结果部分如下:
root@ubuntu:~# lscpu Architecture: x86_64 CPU(s): 32 Thread(s) per core: 1 Core(s) per socket: 8 Socket(s): 4 L1d cache: 32K L1i cache: 32K L2 cache: 256K L3 cache: 20480K NUMA node0 CPU(s): 0-7 NUMA node1 CPU(s): 8-15 NUMA node2 CPU(s): 16-23 NUMA node3 CPU(s): 24-31
相关推荐:《Linux视频教程》
以上がLinux 上の uma アーキテクチャについて話しましょう (画像とテキストで詳しく説明)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。