ホームページ  >  記事  >  運用・保守  >  Linux 上の uma アーキテクチャについて話しましょう (画像とテキストで詳しく説明)

Linux 上の uma アーキテクチャについて話しましょう (画像とテキストで詳しく説明)

WBOY
WBOY転載
2022-03-03 06:00:524338ブラウズ

この記事では、Linux の uma アーキテクチャに関する関連知識を提供します。お役に立てば幸いです。

Linux 上の uma アーキテクチャについて話しましょう (画像とテキストで詳しく説明)

次のケースは Ubuntu 16.04 に基づいており、他の Linux システムにも適用できます。私が使用したケース環境は次のとおりです。

マシン構成: 32 CPU、64GB メモリ

NUMA におけるストレージ階層の概念:

Linux 上の uma アーキテクチャについて話しましょう (画像とテキストで詳しく説明)

##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 上の uma アーキテクチャについて話しましょう (画像とテキストで詳しく説明)

umactl の使用

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

Linux 上の uma アーキテクチャについて話しましょう (画像とテキストで詳しく説明)

この図とコマンドから得られた結果によると、 、このシステムには合計 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

NUMA メモリ割り当て戦略

--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 サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.imで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。