どのように NUMAバランシングサーバー は、プロセスとデータを適切なNUMAノードにバインドすることで、メモリアクセスを効率化し、レイテンシを削減します。決定的な要因は メモリ・アクセスの最適化 ローカルアクセス、タスクの配置、多数のコアを持つLinuxホストへのターゲットページのマイグレーションを通じて。.
中心点
- NUMA CPUとメモリーをノードに分け、ローカル・アクセスにより、CPUとメモリーをノードに分け、ローカル・アクセスにより、CPUとメモリーをノードに分ける。 ロー 待ち時間。.
- 自動 NUMAバランシングはページを移行し、タスクを配置する ノードの近く.
- VMサイズ そうでなければ、次のようなリスクがある。 NUMAゴミ箱.
- ツール numactl、lscpu、numadショーとして トポロジー と使用します。
- チューニングCステート、ノード・インターリーブ、, 巨大なページ, 親和性がある。.
NUMAとは何か?
NUMAは、マルチプロセッサ・システムを次のように分割する。 ノード, NUMAは、各コアが独自のCPUとローカルメモリを搭載しているため、近くのアクセスは遠くのアクセスよりも高速になる。UMAがすべてのコアを共通のパスに送るのに対して、NUMAは次のような原因によるボトルネックを防ぎます。 ローカル ノードあたりのメモリ・チャネル。多くの並列VMが存在するホスティング環境では、1ミリ秒のレイテンシが積み重なるため、すべてのリクエストに大きなメリットがあります。より詳細な背景情報をお知りになりたい場合は、以下をご参照ください。 NUMAアーキテクチャ. .私にとって確かなことは、ノードを理解して使えば、同じハードウェアからより多くの帯域幅が得られるということだ。.
Linuxカーネルの自動NUMAバランシング - その仕組み
カーネルは定期的にアドレス空間の一部をスキャンし、ページを「アンマップ」する。 最適 ノードが表示される。フォールトが発生した場合、アルゴリズムはページをマイグレートする価値があるか、タスクを移動する価値があるかを評価し、不必要な移動を避ける。Migrate-on-Faultがもたらすもの データ タスクのNUMA配置は、プロセスを実行中のCPUの近くに移動させ、タスクのNUMA配置は、プロセスをメモリの近くに移動させる。スキャナーは、オーバーヘッドが通常の負荷のノイズの範囲内に収まるように、作業を少しずつ分散させる。この結果、ハードなピン留めルールを必要とすることなく、レイテンシを削減する継続的な微調整が可能になる。.
メモリアクセスの最適化:ローカル・ビート・リモート
ローカルアクセスでは メモリーコントローラー 自ノードで、インターコネクトの待ち時間を最小限に抑えます。リモート・アクセスは、QPI/UPIまたはInfinityファブリック経由でサイクル・コストがかかるため、実効アクセス時間を最小限に抑えることができます。 帯域幅. .コア数が多いと、同じコネクションをより多くのコアで奪い合うことになり、この影響を悪化させる。そのため、私はホットコードとアクティブデータが1つのノードに集まるように計画している。これを無視すると、負荷ピーク時の応答時間やタイムアウトを決定するパーセンテージ・ポイントを手放すことになる。.
VMサイズ、NUMAトラッシング、ホストのクロッピング
私は、クロスノードアクセスを避けるために、VMの寸法をvCPUとRAMがNUMAノードに収まるように決める。多くの場合、1ノードあたり4~8個のvCPUで十分なパフォーマンスが得られます。 ヒット率, プラットフォームとキャッシュ階層による。巨大なページは、TLBがより効率的に機能し、ページ移行がより頻繁に発生しないため、助けにもなる。必要に応じて CPUとの親和性 レイテンシが重要なプロセスでは、スレッドを適切なコアにバインドする。 CPUとの親和性. .VMをノード間で分散させると、NUMAトラッシング、つまりデータとスレッドのピンポン発生のリスクがある。.
実際のツール: numactl, lscpu, numad
lscpu „で私はこう読んだ。 トポロジー とNUMAノード(コアの割り当てを含む)が表示されます。„numactl -hardware “は、ノードごとのメモリと利用可能な距離を表示するので、パスの評価が容易になる。numad „デーモンは利用率を監視し、ロードセンターが移動すると動的にアフィニティーを調整する。固定シナリオの場合は、「numactl -cpunodebind/-membind」を使ってプロセスとメモリを明示的に固定する。このようにして、自動バランシングとターゲット指定を組み合わせ、「perf」、「numastat」、「/proc」経由で結果を制御している。.
インパクトを測る方法主な数値とコマンド
私はいつもNUMAチューニングを評価している。 測定シリーズ, 直感によらない。3つの指標がその価値を証明している:ローカルとリモートのページビューの比率、移行率、レイテンシ分布(P95/P99)。.
- システム全体numastat „は、ノードごとのローカル/リモートのアクセス数と移行されたページを表示します。.
- プロセス関連: „/proc//numa_maps “は、メモリがどこにあり、どのように分配されたかを明らかにする。.
- スケジューラビューCpus_allowed_list „と実際の “Cpus_allowed „は、バインディングが適用されるかどうかをチェックする。.
# システム全体ビュー
ヌマスタット
numastat -m
# プロセス関連のディストリビューションとバインド
pid=$(pidof )
numastat -p "$pid"
cat /proc/"$pid"/numa_maps | head
cat /proc/"$pid"/status | grep -E 'Cpus_allowed_list|Mems_allowed_list'
タスクセット -cp "$pid"
# NUMA アクティビティのカーネルカウンター
grep -E 'numa|migrate' /proc/vmstat
# 深い分析のためのトレースイベント(短時間アクティブにする)
echo 1 > /sys/kernel/debug/tracing/events/mm/enable
sleep 5; cat /sys/kernel/debug/tracing/trace | grep -i numa; echo 0 > /sys/kernel/debug/tracing/events/mm/enable
それぞれのケースを比較する A/B非バインド対バインド、自動バランシングのオン/オフ、異なるVMスライス。目的は、リモートアクセスとマイグレーションノイズの明確な削減と、P95/P99レイテンシーの厳格化です。測定値が安定して良くなってから、私がチューニングを引き継ぎます。.
本当に機能するBIOSとファームウェアの設定
BIOSで「ノード・インターリーブ」をオフにすると、NUMA構造が表示されたままになり、カーネルは ローカル が計画できる。Cステートを減らすと、コアが深いスリープ状態に陥りにくくなり、ウェイクアップ時間が短縮されるため、待ち時間のピークが安定する。各ノードが最大メモリ容量を利用できるように、対称的にメモリチャネルを割り当てています。 帯域幅 を達成した。プリフェッチャーやRAS機能は、アクセスパターンによって役に立ったり害になったりするので、ワークロードプロファイルを使ってテストしている。すべての変更をベースラインに対して測定し、その後で初めてその設定を恒久的に採用する。.
違いを生むカーネルとsysctlパラメータ
カーネルを微調整することは私の助けになる、, オーバーヘッド そして 応答時間 バランサーのデフォルト値をワークロードに合わせます。私は保守的なデフォルトから始めて、一歩一歩前進していきます。.
- kernel.numa_balancing(カーネル・ヌマ・バランシング自動バランシングのオン/オフ。私は移動する負荷のためにオンにしておきます。私はテストとして厳密に固定された特別なサービスのためにスイッチを切ります。.
- kernel.numa_balancing_scan_delay_msプロセス作成後の最初のスキャンまでの待ち時間。短命のタスクが多数実行されている場合は大きめを、高速な近接性を必要とする長時間実行のサービスでは小さめを選択する。.
- kernel.numa_balancing_scan_period_min_ms / _max_msスキャン間隔の帯域幅。間隔を狭くすると応答性が向上するが、CPU負荷も増加する。.
- kernel.numa_balancing_scan_size_mbスキャンごとのアドレス空間の割合。大きすぎるとヒント・フォールト・ストームが発生し、小さすぎると反応が鈍くなる。.
- vm.zone_reclaim_modeメモリが不足している場合、カーネルはリモートのアロックではなく、ローカルのリクレイムを好む。一般的なホスティングワークロードでは 0; レイテンシを厳しく要求されるローカルメモリサービスでは、より高い値を慎重にテストする。.
- 透明な巨大ページ(THP)sys/kernel/mm/transparent_hugepage/{enabled,defrag}」では、通常次のように設定する。 マドヴァイズ と保守的なデフラグを行う。ハード „常時 “プロファイルはTLBの利点をもたらすが、コンパクト化によるストールのリスクがある。.
- スケジューマイグレーションコストタスク移行のコスト見積もり。値が高いほど、アグレッシブなスケジューラによる再分配が抑制される。.
- cpusetと cpuset.cpus そして cpuset.mems 私はサービスをノードごとにきれいに分け、次のことを確認している。 ファーストタッチ は許容されるノードの範囲内にとどまっている。.
# 例: 保守的だが反応の良いバランシング
sysctl -w kernel.numa_balancing=1
sysctl -w kernel.numa_balancing_scan_delay_ms=30000
sysctl -w kernel.numa_balancing_scan_period_min_ms=60000
sysctl -w kernel.numa_balancing_scan_period_max_ms=300000
sysctl -w kernel.numa_balancing_scan_size_mb=256
# THP を慎重に使う
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
echo defer > /sys/kernel/mm/transparent_hugepage/defrag
重要なことに変わりはありません:1回のテストにつき、調整ねじは1つだけ変え、同じ負荷曲線に対して効果をテストすること。これが、私が原因と結果を切り離す方法です。.
ワークロードを正しく配置するデータベース、キャッシュ、コンテナ
データベースは、バッファプールがNUMAノードごとにローカルのままであり、スレッドがヒープの近くにバインドされている場合に恩恵を受ける。インメモリキャッシュでは、シャーディングを ノード リモート・フェッチを避けるためだ。コンテナ・プラットフォームは、ポッドがノードを飛び越えないように、制限とリクエストを受け取る。メモリ予約については、私はHuge Pagesを使用しています。 キャッシュ フィットする。以下の表は、戦略と典型的な効果をコンパクトにまとめたものである。.
| 戦略 | 用途 | 予想される効果 | ヒント |
|---|---|---|---|
| ファーストタッチ | データベース、JVMヒープ | 現地サイドの割り当て | ターゲットノードで初期化を実行する |
| インターリーブ | 広範囲に分散した荷重 | 均等配分 | ホットスポットには不向き |
| タスクのピン留め | レイテンシーが重要なサービス | 定常的なレイテンシー | 負荷変動時の柔軟性が低い |
| 自動バランシング | 混合ワークロード | ダイナミックな近さ | 諸経費と利益の秤量 |
| 巨大なページ | 大きなヒープ、キャッシュ | TLBミスの減少 | 清潔な予約プラン |
仮想化:仮想NUMA、スケジューラ、ゲストのカスタマイズ
Virtual NUMAは、ホストトポロジーを簡略化した形でゲストOSに渡します。 アロケーター は賢明に働きます。ハイパーバイザーのスケジューラーは、vCPUの分配やVMのマイグレーションの際に、ノードの近接性に注意を払う。ワークロードが広くストリーミングされ、インターリーブの恩恵を受けない限り、私は大規模なVMを複数のノードにアライメントすることはほとんどありません。ゲストでは、JVMやデータベースのヒープをカスタマイズして、可視NUMAノード上でローカルのままにします。ゲストでのメモリ管理については 仮想メモリ, ページサイズとスワッピングを調整する。.
PCIeの近接性:適切なノードでのNVMeとNIC
可能であれば、NVMe SSDと高速NICを、そのノードに割り当てます。 ワークロード が実行されている。これにより、I/O要求がインターコネクトを横断してレイテンシが増えるのを防ぐことができる。マルチキューNICをRSS/RPSでノードのコアセットにバインドし、IRQがローカルのままになるようにしている。ストレージスタックの場合、ノードごとにスレッドプールを分割する価値がある。このことに注意を払えば、P99のレイテンシを顕著に減らすことができ、負荷ピークのためのヘッドルームを作ることができる。.
IRQとキュー・アフィニティの実際
まず、どの NUMAノード デバイスとIRQとキューを適切にピン接続する。これにより、データパスのローカリティが維持される。.
# デバイス間マッピング
cat /sys/class/net/eth0/device/numa_node
cat /sys/block/nvme0n1/device/numa_node
# IRQアフィニティを具体的に設定する(例:ノードのコア0~7)
irq= /proc/irq/$irq/smp_affinity_list
# NICキューをコアにバインドする(RPS/RFS)
for q in /sys/class/net/eth0/queues/rx-*; do echo 0-7 > "$q"/rps_cpus; done
sysctl -w net.core.rps_sock_flow_entries=32768
for q in /sys/class/net/eth0/queues/rx-*; do echo 4096 > "$q"/rps_flow_cnt; done
# NVMeキューのアフィニティーを改善する
echo 2 > /sys/block/nvme0n1/queue/rq_affinity
cat /sys/block/nvme0n1/queue/scheduler # "none "を優先する。
„私はノードを意識して “irqbalance "を実行するか、次のように設定する。 例外 ホットパス割り込み用その結果、レイテンシがより安定し、クロスノードIRQホップが減少し、ローカルI/Oヒットが大幅に増加しました。.
スタティック・バインディングとダイナミック・バランシング - 中間の道
私は、決定論的な場合、„タスクセット “と "cgroups "を使って厳しいルールを設定している。 レイテンシー カウントされます。私は、負荷が移動し、適応的な近接が必要な場合には、自動NUMAバランシングをアクティブにしておく。ホットパスにはハードピン、補助的な作業にはよりオープンなバウンダリ、という混合がしばしば最適に機能する。マイグレーションが顕著に増加していないか定期的にチェックする。目標は、マイグレーションがまれではあるが可能であるように、データとスレッドの位置を選択することに変わりはない。.
コンテナとKubernetesにおけるNUMA
容器を持参する 膿栓 そして 巨大なページ をライン上に置く。CPUとメモリの量を一貫して保存することで、ポッド/コンテナをNUMAノードに割り当てる。オーケストレーションでは、シングルノードの割り当てを優先し、ファーストタッチを尊重するポリシーを設定している。.
- コンテナランタイム: „-cpuset-cpus “と„-cpuset-mems “は、タスクとメモリーを一緒に管理する。.
- トポロジー/CPUマネージャー厳密な、あるいは優先的な割り当てにより、関連するコアとメモリ領域が確実に割り当てられる。.
- QoSの保証リクエストやリミットを固定することで、スケジューラーによる再分配を最小限に抑える。.
サイドカーと補助プロセスを意図的に他のコアに分割した 内 ホットパスが乱されることなく、クロスノードレースに入らないようにする。.
CPUトポロジーの理解CCD/CCX、SNC、クラスターオンダイ
現在のサーバー用CPUは、ソケットを次のように分割している。 サブドメイン 独自のキャッシュとパスを持つ。コアやヒープを削減する際には、このことを考慮している:
- AMD EPYCCCD/CCXと „NUMA per socket“ (NPS=1/2/4)は、NUMAをどの程度細かくカットするかに影響する。ノード数を増やす(NPS=4)とローカリティは向上するが、きれいなピン止めが必要になる。.
- インテルサブNUMAクラスタリング(SNC2/4)は、LLCをクラスタに分割する。OSとワークロードがノードを意識していれば、メモリバウンドロードに適している。.
- L3接近同じヒープを使用するスレッドを同じL3クラスタにバインドして、コヒーレンスのトラフィックとクラスタ横断ホップを節約している。.
これらのオプションは乗数のような働きをする。 地域性 さらに、誤った設定をすると、断片化とリモートトラフィックを増加させる。.
ステップ・バイ・ステップの導入とロールバック計画
ビッグバン」NUMAチューニングは紹介しない。回復力のある プラン サプライズを避けることができる:
- ベースラインハードウェア・トポロジー、P50/P95/P99のレイテンシー、スループット、numastatレート・キャプチャ。.
- 仮説具体的なターゲットを設定する(例:リモートアクセス -30%、P99 -20%)。.
- 一歩調整ネジを1つだけ変更する(例:VMカット、cpuset、THPポリシー、スキャン間隔)。.
- カナリア5-10%で実負荷テストを行い、ロールバックの準備をしておく。.
- 評価測定値の比較、回帰窓の定義、副作用のログ。.
- ロールアウトシャフトを1本ずつ繰り出し、1本終わるごとに再度測定する。.
- メンテナンス四半期ごとに再測定する(カーネル、ファームウェア、ワークロードのアップデートにより最適値が変わる)。.
これにより、改善の再現性が保証され、エラーが発生した場合は数分で元に戻すことができる。.
よくある過ちとその避け方
典型的な誤操作は、BIOSでノード・インターリーブを有効にしてしまうことです。 バランシング より難しい。同様に好ましくないのは、ノードが提供する以上のvCPUを持つVMと、不適切に予約された巨大なページだ。管理者の中には、すべてをハードに固定し、ワークロードが変化したときに柔軟性を失う人もいる。また、カーネルに完全に依存する管理者もいますが、ホットスポットは明確なルールが必要です。私は一連の計測を記録し、早い段階で異常値を認識し、段階的にセットアップとポリシーを調整しています。.
- THPは „常に“ 無制限:無計画なコンパクト化はレイテンシーを乱す。私は „madvise “を使い、特に巨大なページを予約することを好む。.
- vm.zone_reclaim_mode 積極的すぎる:地元での再生は、タイミングを誤ると、良い結果を生むよりも悪い結果を生む可能性がある。まず測定し、それから研ぎ澄ます。.
- イリクバランスブラインドクリティカルでないIRQはノードを越えて移動する。ホットパスには例外や固定マスクを設定しています。.
- インターリーブ+ハードピニングのミックス矛盾した方針がピンポンを生む。私は各サービスに明確な線引きをすることを支持する。.
- 清潔でないCPUコンテナはノードを見るが、他のノードにメモリをマッピングする。cpuset.mems „は常にCPUセットと一貫して設定される。.
- サブNUMAの特徴 活性化されているが使用されていない:計画を立てずにノードを増やすとフラグメンテーションが増える。テスト後にスイッチを入れる。.
簡単にまとめると
NUMAバランシング・サーバーは、プロセスとデータをターゲットにした方法でまとめ、ローカル・アクセスをより頻繁に、より効率的にします。 遅延時間 が短くなる。適切なVMサイズ、クリーンなBIOSコンフィギュレーション、そしてnumactlのようなツールがあれば、カーネルが利用する明確なトポロジーが作成される。仮想NUMA、巨大ページ、アフィニティは、自動バランシングを置き換えるのではなく、補完するものです。I/Oデバイスをノードの近くに接続し、ホットパスを使用することで、高価なリモートアクセスを排除します。このようにして、ホスティング・ハードウェアは確実に拡張され、CPUの1秒1秒がより多くのデータを提供します。 ペイロード.


