...

高負荷ホスティングのためのサーバーIRQバランシングとネットワークパフォーマンス

高いネットワーク負荷は、次のような効率的な処理によって決定される。 サーバーIRQ シグナルを生成する:CPUコアに割り込みを賢く分散させることで、レイテンシを減らし、ドロップを防ぎます。このガイドでは、IRQバランシング、RSS/RPS、CPUアフィニティを実用的な方法で組み合わせ、高負荷のホスティングを持続可能にする方法を紹介します。 パフォーマント を操作する。

中心点

  • IRQ分配 個々のCPUコアのホットスポットを防ぐ。.
  • マルチ・キュー さらにRSS/RPSはパケット処理を並列化する。.
  • NUMAアテンション ノード間のアクセスとレイテンシーを削減します。.
  • CPUガバナー とスレッドピニングが応答時間をスムーズにする。.
  • モニタリング pps、レイテンシー、ドロップ、コアの使用率をチェックする。.

IRQの簡単な説明:ネットワーク負荷を制御する理由

着信パケットごとに、ネットワークカードは 割り込み要求, そうでなければ、カーネルは積極的にポーリングしなければならない。割り当てが1つのコアに残っている場合、そのコアの使用率は増加し、他のコアはポーリングされる。 未使用 が残る。これはまさにレイテンシーが大きくなり、RXリングのバッファが一杯になり、ドライバーがパケットを破棄し始めるときだ。私は、パケット処理を均一かつ予測可能に保つために、適切なコアに割り込みを分散させています。これにより、ボトルネックが解消され、応答時間がスムーズになり、パケットロスが最小限に抑えられます。.

LinuxでのIRQバランシングとCPUアフィニティ

サービス イラクバランス は割り込みを動的に分散させ、負荷を分析し、時間とともにアフィニティーを自動的にシフトさせる。極端な負荷プロファイルの場合は、以下の方法で手動でアフィニティーを定義している /proc/irq//smp_affinity のコアに特異的にキューを結合させる。 NUMA-ノード。この自動と微調整の組み合わせは、ベースロードとピークの両方をきれいに処理するのに役立っている。詳細な紹介 割り込み処理とCPUの最適化 私は自分のプランニングに役立てている。重要なことに変わりはない:私は一貫して、ハードウェアのトポロジー、IRQの配分、アプリケーションのスレッドを互いにリンクさせています。.

マルチキューNIC、RSS、RPSの実践的な使用法

最近のNICは、複数のRX/TXキューを提供し、各キューはそれ自身をトリガーする。 IRQ, とReceive Side Scaling(RSS)がフローをコアに分配する。十分なハードウェア・キューがない場合は、受信パケット・ステアリング(RPS)と送信パケット・ステアリング(XPS)をカーネルに追加する。 パラレリズム.と一緒に ethtool -L ethX combined N キュー番号を関連するNUMAノードのコア番号に合わせます。でチェックする。 エスツール そして エヌスタット, ドロップ、ビジー・ポーリング、高 pps ピークのいずれが発生してもです。より細かい負荷の平滑化には 割り込み合体 NICが個々のIRQを生成しすぎないようにするためである。.

次の表は、私が首尾一貫したセットアップに使っている中心的なコンポーネントと典型的なコマンドを示している:

ビルディング・ブロック ゴール ヒント
イラクバランス 自動配信 systemctl enable --now irqbalance 混合ワークロードの出発点
親和性 ピン止めを修正 エコーマスク > /proc/irq/XX/smp_affinity NUMAの割り当てを観察する
キュー 並列性を高める ethtool -L ethX combined N ノードコアに合わせる
RSS/RPS 流量分布 sysfs: rps_cpus/rps_flow_cnt 少数のNICキューに有効
エックスピーエス TXパスコアの順序 sysfs: xps_cpus キャッシュスラッシュの回避

自動IRQバランシングの賢明な利用

ホスティングサーバーが混在している場合、多くの場合、以下を有効にするだけで十分です。 イラクバランス, なぜなら、デーモンは常にロードシフトを認識しているからだ。私は systemctl status irqbalance を見てみよう。 /proc/interrupts, で、キューとコアごとの分布を確認する。レイテンシがピークで増加する場合は、割り込み処理をメインとするテストコアを定義し、変更前と変更後の測定値を比較します。コンフィギュレーションは シンプル, 後の監査やロールバックが素早くできるようにね。パターンが明確になって初めて、私はピン留めに深入りする。.

手動CPUアフィニティで最大限のコントロール

非常に高いppsレートでは、RXキューを同じコアの選択されたコアに固定する。 NUMA-ノードとアプリケーションスレッドを意図的に分離している。割り込みのために個々のコアを分離し、隣接するコアでワーカーを実行し、キャッシュのローカリティに細心の注意を払っている。このようにして、クロスノードアクセスを減らし、ホットパスでの高価なコンテキストスイッチを最小限に抑えている。再現可能な結果を得るために、IRQマスク、キューの割り当て、サービスのスレッド親和性を明確に文書化している。このように明確にすることで、パケットのランタイムを 不変 そして、外れ値を減らす。.

CPU最適化とアプリケーションのクリーンな調整

をセットした。 CPUガバナー クロックが変わるとレイテンシが跳ね上がるので、「パフォーマンス」に設定することが多い。Nginx、HAProxy、データベースなどのクリティカルなプロセスは、IRQコアに近いコアにバインドするか、キャッシュ・プロファイルが必要な場合は意図的に分離している。ネットスタックの最適化が効果を発揮するように、コンテキストの変更を制限し、カーネルを最新の状態に保つことが重要であることに変わりはない。私は、仮定して段階的に適応させるのではなく、各変更の影響を測定しています。その結果、負荷がかかっても動作するセットアップができた 予測可能 反応する。.

モニタリングと測定を正しく設定する

測定値がなければ、チューニングは推測ゲームのままだ。 サル, エムピースタット, vmstat, エヌスタット, ss そして エスツール. .構造化負荷テストには iperf3 そして、スループット、pps、レイテンシー、再送信、コアの利用率を調べます。夕方のピーク、バックアップウィンドウ、キャンペーンなどのパターンを認識するために、標準的なモニタリングシステムを使って長期的なトレンドを記録します。データパスを全体的に理解したいのであれば、以下のようなビューが役立ちます。 パケット処理パイプライン をNICのIRQからユーザースペースに送る。これらの信号の組み合わせのみが、IRQバランシングとアフィニティが望ましい効果を達成したかどうかを示す。 効果 を持参します。

NAPI、Softirqs、ksoftirqdの理解

高いpps負荷によるレイテンシーのピークを管理するために、私は次のことを考慮に入れている。 ナピ-メカニズムおよびハードIRQとソフトIRQの相互作用。最初のハードウェアIRQの後、NAPIはIRQストームを避けるため、ポーリングモードでRXキューからいくつかのパケットを取り出す。ソフトIRQが速やかに処理されない場合、ソフトIRQは次のキューに移される。 ksoftirqd/N 通常の優先順位でしか実行されないスレッド - テールレイテンシを増加させる典型的な理由。私は次のように考えている。 /proc/softirqs そして /proc/net/softnet_stat; 高い„タイムスクイズ“の値や低下は、予算が厳しすぎることを示している。と sysctl -w net.core.netdev_budget_usecs=8000 そして sysctl -w net.core.netdev_budget=600 テストとして、NICポーリングあたりの処理時間とパケットバジェットを増やしました。重要:徐々に値を増やしていき、CPUのジッターやアプリケーションスレッドへの干渉が発生しないか測定してチェックします。.

RSSハッシュとインダイレクトテーブルの微調整

RSSはインダイレクトテーブル(RETA)を介してキューにフローを分配する。ハッシュ・キーとテーブルを ethtool -n ethX rx-flow-hash tcp4 で、必要であれば分布を対称に設定する。と ethtool -X ethX equal N またはエントリーごとにethtool -X ethX hkey ...hfunc toeplitz indir 0:1 1:3 ...)、NUMAノードの優先コアに割り当てを合わせる。その目的は フロー粘着性フローは同じコア上に残るので、スタック内のキャッシュの局所性とロックの保持は最小のままである。短いUDPフローが多い環境では rps_flow_cnt ソフトウェア・ディストリビューションが十分なバケットを持ち、ホットスポットを作らないようにするためです。対称ハッシュがECMPトポロジーの助けになることは覚えているが、サーバーのコンテキストでは、コアのバランスが最も重要だ。.

オフロード、GRO/LRO、リングサイズを適切に選択する。

ハードウェア・オフロードはCPUの負荷を軽減するが、レイテンシ・プロファイルを変更する可能性がある。私は ethtool -k ethX, 、かどうか tso/gso/udp_seg TXと GRO/LRO はRXでアクティブである。GROはカーネル内でパケットをバンドルし、ほとんどの場合スループットのために有用である。LROはルーティングやフィルタリングのセットアップで問題になる可能性があり、そこではオフにしたほうがよい。レイテンシが重要なAPIでは、p99のレイテンシが支配的な場合、GROアグリゲーションを小さくして(あるいは一時的にオフにして)テストする。また ethtool -G ethX rx 1024 tx 1024リングが大きいとバーストは遮断されるが、輻輳時の待ち時間が長くなる。 rx_missed_errors. .からの測定値に頼っている。 エスツール (例. rx_no_buffer_count, rx_dropped)と同意見である。 BQL (バイトキュー制限、カーネル側で自動)により、TXキューがオーバーフィードにならないようにする。.

仮想化:VMとハイパーバイザー上のIRQ

仮想化セットアップでは、ホスト上の物理NICの配分をコントロールし、次のように設定します。 IRQバランシング 明確に。VMは十分なvCPUを獲得しているが、スケジューリングの遅延がレイテンシーを増加させないように、やみくもなオーバーコミットは避けている。virtio-netやvmxnet3のような最新の準仮想化ドライバは、高いppsレートのためのより良いパスを提供してくれる。VM内では、ゲストがボトルネックにならないように、アフィニティとキューカウントを再度チェックします。データパス全体がボトルネックにならないように、ホストとゲストの一貫したビューを持つことは非常に重要です。 真の.

仮想化の深化:SR-IOV、vhost、OVS

非常に高いppsレートを実現するために、私はハイパーバイザーを使っている。 SR-IOV物理NICの仮想ファンクション(VF)をVMに直接バインドし、適切なNUMAノードのコアに固定する。これにより、ホストスタックの一部をバイパスし、レイテンシを削減することができる。SR-IOVが適合しない場合、私は以下の点に注意を払う。 ボストネット また、アプリケーションワーカーやIRQコアなどのvhostスレッドを固定し、クロスNUMAジャンプが発生しないようにします。オーバーレイやスイッチングのセットアップでは、LinuxブリッジやOVSの追加コストを評価します。極端なプロファイルでは、運用の手間が測定可能な利点を正当化できる場合にのみ、OVS-DPDKを使用します。同じことがここでも当てはまります。私は、pps、レイテンシー、CPUディストリビューションを測定してから決定するのではなく、決定する前に測定します。.

ビジー・ポーリングとユーザー空間のチューニング

レイテンシーが重要なサービス ビジー・ポーリング ジッターを減らす。テストとして次のようにした sysctl -w net.core.busy_read=50 そして net.core.busy_poll=50 (マイクロ秒)を設定し、ソケットオプション SO_BUSY_POLL を、影響を受けるソケットに対して選択的に使用する。その後、ユーザースペースはブロックする直前にポーリングを行い、キューに深く入る前にパケットをキャッチする。これにはCPU時間がかかるが、p99のレイテンシーをより安定させることができる。私は値を低く保ち、コアの使用率を監視し、ビジーポーリングを明確なスレッドアフィニティと固定CPUガバナーでのみ組み合わせます。.

小包フィルター、Conntrack、eBPFのコスト一覧

ファイアウォールとNATはデータパスの一部です。したがって、私は nftables/iptables-ルールの整理、デッドルールやディープチェーンの整理。忙しいセットアップでは、私はConntrackテーブルサイズ(nf_conntrack_max, ハッシュバケット番号)、またはステートレス・フロー専用のConntrackを非アクティブにする。eBPFプログラム(XDP、tc-BPF)が使用されている場合は、フックごとのランタイムコストを測定し、高価なパスを緩和するために「早期ドロップ/リダイレクト」を優先する。責任の所在を明確にすることが重要である。最適化は、NICオフロード、eBPFプログラム、またはクラシックスタックのいずれかに反映される。.

CPUの分離とハウスキーピング・コア

絶対的に決定論的なレイテンシーを実現するために、私はバックグラウンド・ワークを保存している。 ハウスキーピングCPU オフ。カーネル・パラメーター nohz_full=, rcu_nocbs= そして irqaffinity= 専用コアをティック処理、RCUコールバック、外部IRQからほぼフリーに保つのに役立つ。私は、アプリケーション・ワーカー用にコアの1セットを分離し、IRQとソフトIRQ用に別のコアを分離している。これにより、クリーンなキャッシュ・プロファイルが確保され、先取り効果が減少する。ハイパースレッディングは個々のケースでジッターを増加させる可能性がある。グローバルな決定を下す前に、コアペアごとにハイパースレッディングを無効化することでp99のレイテンシが平滑化されるかどうかをテストする。.

診断プレイブックと典型的なアンチパターン

ドロップやレイテンシーのピークが発生した場合、私は次のようなアプローチを取る。) /proc/interrupts 分布に偏りがないかチェックする。2) エスツール RX/TXドロップ、FIFOエラー、, rx_no_buffer_count チェック3) /proc/net/softnet_stat を „タイムスクイズ「またはドロップ“.4) mpstat -P ALL そして トップ ksoftirqd アクティビティ。5) アプリケーション・メトリクス(アクティブなコネクション数、再送回数 ss).私が避けるべきアンチパターン:巨大なRXリング(隠れた輻輳)、測定なしのオフロードの乱暴なオン/オフ、アグレッシブなirqバランスと固定アフィニティーの混合、明確なターゲットアーキテクチャなしのRPSとRSSの同時使用。各変更は、測定前後の比較と短いプロトコルを取得します。.

ウェブホスティングとAPIのコンセプト例

クラシックウェブホスティングサーバー

多くの小規模なウェブサイトでは、私は イラクバランス, いくつかのキューをセットアップし、パフォーマンス・ガバナーを選択します。ピーク時のL7レイテンシーを測定し、主にTLSとHTTP/2で発生するppsピークに注意を払う。ハードウェア・キューが十分でない場合は、ソフトウェア・レベルで追加配信するためにRPSを追加する。この調整により、レスポンスタイムは 不変, たとえ全体の稼働率が中程度に見えたとしても。定期的な /proc/interrupts 個々のコアが傾いているかどうかを教えてほしい。.

高負荷のリバースプロキシまたはAPIゲートウェイ

接続数の多いフロントエンドでは、RXキューを定義されたコアに細かく固定し、プロキシワーカーを近くのコアに配置する。irqbalanceがアクティブなままなのか、固定ピニングがより明確な結果をもたらすのかを意識的に判断する。十分なキューがない場合は、RPS/XPSを選択して較正する。 合体, IRQストームを避けるためだ。これにより、非常に高いppsレートで低レイテンシーを達成し、テールレイテンシーを制御下に保つことができる。すべての変更を文書化することで、その後の監査が容易になり、動作が維持される。 予測可能.

プロバイダーの選択とハードウェアの基準

のNICに注目している。 マルチ・キュー, バックボーンの信頼性の高いレイテンシーとプラットフォームの最新カーネルバージョン。バランスのとれたCPUトポロジーと明確なNUMA分離により、ネットワーク割り込みがリモートのメモリゾーンに到達するのを防ぎます。pps率の高いプロジェクトでは、ハードウェアがリザーブを提供するため、インフラストラクチャーの選択はチューニングのあらゆる時間を尊重します。現実的な比較では、パフォーマンス・プロファイルを開示し、IRQに優しいデフォルトを提供するプロバイダー、例えばwebhoster.deのようなプロバイダーとうまくいっている。このようなセットアップにより、IRQバランシング、RSS、アフィニティを効果的に使用し、応答時間を最小限に抑えることができる。 eng を保持する。

ステップ・バイ・ステップのチューニング手順

ステップ1: で現在の状態を判断する。 iperf3, サル, エムピースタット, エヌスタット そして エスツール, 初期値が明確になるようにね。. ステップ2: irqbalanceが実行されていない場合は、サービスを有効にして負荷がかかるのを待ち、レイテンシー、pps、ドロップを比較する。. ステップ3: キュー番号とRSSコンフィギュレーションを、関連するNUMAノードのコアに合わせる。. ステップ4: CPUガバナーを „パフォーマンス “に設定し、セントラルサービスを適切なコアに割り当てた。. ステップ5: 測定値がまだボトルネックを示している場合のみ、手動アフィニティとNUMAピンニングを調整する。. ステップ6: 私は、イベントのピーク、バックアップ、マーケティングのピークを確実に分類するために、数日間の傾向をチェックする。.

簡単にまとめると

効果的 IRQバランシング はネットワーク作業を適切なコアに分散し、レイテンシを減らし、高いppsレートでのドロップを防ぎます。マルチキューNIC、RSS/RPS、適切なCPUガバナー、クリーンなスレッドアフィニティと組み合わせることで、私はネットスタックを確実に利用している。測定値 エスツール, エヌスタット, サル そして iperf3 は、暗中模索するのではなく、一歩一歩私をゴールへと導いてくれる。NUMAトポロジー、IRQピン、アプリケーションの配置を一緒に考えれば、応答時間を最小限に抑えることができる。 ロー - ピーク負荷時でもつまり、不要なCPUリザーブを消費することなく、高負荷のホスティングでも顕著な応答性を維持します。.

現在の記事