...

XDP および eXpress Data Path:高性能なパケット処理

XDP Linuxネットワークスタックの入力段階で直接判断を行うため、パケット処理を高速化し、レイテンシ、メモリアクセス、CPUサイクルを削減します。 eXpress Data Pathは、ドライバパス内でパケットを検査し、破棄、リダイレクト、または通過させるため、DDoS防御、ロードバランシング、トラフィックフィルタリング、テレメトリに最適です。.

中心点

  • 初期 NICの入力端子での直接決定
  • イービーピーエフ 安全で検証済みの実行メカニズムとして
  • レイテンシー そして、間接費を大幅に削減する
  • スケーリング 毎秒数百万個のパッケージに対応
  • 統合 Linux用ドライバー、ルーティング、モニタリング

XDPがカーネル内でどのような役割を果たしているか

私は論理を NIC, 、パケットがスタック全体に負荷をかける前に処理を行い、それによってコピー、割り込み、コンテキスト切り替えを削減します。XDPプログラムは、DROP、PASS、REDIRECT、またはTXのいずれかを早期に決定することで、上位層の負荷を軽減します。これにより、 効率性 特に、そうでなければCPUリソースを独占してしまうような小さなパケットにおいて、その効果は顕著です。私はキャッシュミスを最小限に抑え、キューを短縮することで、テールレイテンシに直接的な影響を与えています。まさにこの点が、パケットの分類を後回しにしてしまい、その結果として不要なオーバーヘッドを引き起こす従来の処理パスとの違いです。.

Express Data Pathの原動力としてのeBPF

私はeBPFコードをコンパクトに記述し、カーネル内で検証させた後、それを XDPフック ドライバの。これにより、受信する各パケットに対してナノ秒単位で反応し、カーネルの再構築なしに動作を変更できます。分析には以下を使用しています。 eBPF解析ツール, 、パス、マップ、レイテンシを可視化するために。レート制限、Conntrack-light、テレメトリ用のマップ内のキーを変化させつつ、コードをスリムに保っています。この ハードウェア Linuxとの統合性を損なうことなく、レイテンシを著しく低減します。.

XDPの処理:拒否、転送、リダイレクト

私は、交通量を早期に抑制するために、XDPキャンペーンを的を絞って活用しています。 牡牛: ボットスキャンには「DROP」、正当なフローには「PASS」、隣接インターフェースへのリダイレクトには「REDIRECT」、即時返送には「TX」を設定します。これにより、エッジで不要なトラフィックを遮断し、下位層へのフラッディングからホストを保護します。 以下の割り当ては、具体的なポリシーの策定に役立ちます。私はまず、単純で決定論的なチェックを優先し、真の価値をもたらす場合にのみ、オプションの測定ポイントを追加します。これにより、 データパス 簡潔で予測可能。.

アクション 代表的な使用例 ベネフィット オーバーヘッド
XDP_DROP スプーフィング、DDoS、スキャン 早期防御とCPU負荷の軽減 非常に低い
XDP_PASS 正当な取引 カーネルスタックへの引き渡し 低い
XDP_REDIRECT ロードバランサー、サービスチェーン スタックを使わない高速な迂回処理 低い
XDP_TX ICMP/ARP応答、ブラックホールACK NICパスからの直接応答 低い
AF_XDP(ユーザースペース) ゼロコピー・ユーザーランド・エンジン 特殊ロジックにおける高いスループット 中等度(ペーシングへの依存度)

数値で見るパフォーマンスとレイテンシ

私は1回あたり高いパケットレートを達成しています コア, 、データパスを大幅に短縮し、処理を早期に終了させるためです。公表された研究では、コアあたり毎秒最大2400万パケットとされており、ACMやシュトゥットガルト大学の報告でも同程度の規模が記述されています。 実際には、この値はドライバ、XDPモード、およびキューなどのNICパラメータによって異なります。そのため、私は常に合成レートだけでなく、エンドツーエンドのレイテンシも測定しています。重要なのは、コピー回数の削減、ジャンプ回数の削減、キャッシュへの負荷軽減が、一貫した 遅延時間.

実例:NICエッジでのDDoS防御

私は以下の方法で攻撃をブロックしています XDP_DROP エントランスで直接処理を行い、カーネル、ソケット、アプリケーションへの負荷を軽減します。レート制限とマップ内のブルームフィルターにより、コードをコンパクトに保ち、非常に早い段階で効果を発揮します。正当なトラフィックについては、ドライバに近い場所でホワイトリストを適用しつつ、ソースチェックとTTL検証を追加しています。 アーキテクチャについては、以下の資料を参照するとよいでしょう。 パケット処理パイプライン, 、パスに沿った決定を明確に整理するためです。これにより、高価なレイヤー7ルールが貴重な リソース 燃やす。.

負荷分散と事前フィルタリング

私はこうしている。 XDP_REDIRECT バックエンドキューや隣接インターフェースへの極めて高速なファンアウトを実現するためです。5-タプルまたはQUIC-CIDに対するECMP風のハッシュ演算により、フローを均等に分散させます。テレメトリについては、簡潔なヘッダーサンプルをマップに格納し、代表的なサンプルのみを上位層へ送信します。 ステートフル機能については、複雑さを下流のレイヤーに移し、XDPを決定論的に保ちます。これにより、高速性を維持しつつ、コードの保守性を確保し、一貫性を保ちます。 応答時間.

XDPモード:ネイティブ、ジェネリック、オフロード

を選ぶ。 モード ハードウェアに合わせて選択します。「ネイティブ」はドライバーレベルで動作し、最高のパフォーマンスを発揮します。「ジェネリック」はどこでも動作し、「オフロード」はロジックをNICに移行します。「ネイティブ」は、高品質なドライバーと十分にテストされたパスが整備された本番システムに適しています。 ジェネリックは、移植性が必要な場合、VMや古いドライバで役立ちます。オフロードはNICのサポートと厳密に検証されたプログラムを必要としますが、驚異的な効率を発揮します。私は実際の負荷パターンで各オプションをテストし、再現性のある結果を優先しています。 結果.

プログラミングとデプロイ:CO-RE、BTF、bpftool

導入にあたっては、以下を重視しています CO-RE (Compile Once – Run Everywhere) および BTF を活用し、eBPF オブジェクトがカーネルバージョンの変更を超えて安定した状態を保つようにしています。libbpf を使用することで、構造体をスリムに保ち、実行時にオフセットを解決することで、ビルドマトリックスを削減しています。プログラムをピン留めし、 マップ bpffs を使用することで、ライフサイクルをプロセスから独立して管理し、アップグレードをアトミックに実行できるようにしています。 運用においては、bpftoolを使用してマップの読み込み、アタッチ、置換、および検査を行い、マップのサイズ、型、キーのレイアウトを文書化することで、再現性のあるデプロイメントを確保しています。また、以下のガイドラインを定めています。 能力 プログラムの読み込みに必要なものについて、アタッチポイントを自動化し(systemd または init スクリプトを使用)、ロールバックの手順を計画してください。アップグレードに失敗した場合、リンクは安定版に戻るか、あるいは不確実な場合は XDP_PASS. これにより、変更は管理された状態が保たれ、リスクも低く抑えられます。.

tc/eBPF およびユーザースペースとの連携

アウトバウンド・シェーピング、DSCPマーキング、あるいは複雑な判断が必要になる場合は、XDPとtc/eBPFを組み合わせています。特殊なケースでは、 AF_XDP ゼロコピーモードで処理し、ロジックをユーザーランドエンジンに移行します。その際、パーシングとファストパスをXDPにカプセル化し、負荷の高い処理をワーカーにオフロードします。これにより、ホットループを最小限に抑えつつ、柔軟性を維持しています。この構成により、責任範囲が明確に区分され、重要な ホットパス 外れ値から。.

XDPプログラムにおけるパーサーの設計とメタデータ

私はパーサーを保守的な方法で構築しています。具体的には、 xdp_md (data/data_end)、長さを厳密にチェックし、範囲外アクセスを回避する。VLANタグは明示的に処理し、必要に応じてbpf_xdp_adjust_headを使用してパケットヘッダーを調整し、オフセットの一貫性を保つ。 IPv4とIPv6を早い段階で区別し、フラグメンテーションをチェックし、簡単なサニティチェック(例:ヘッダーの最小長、有効なプロトコル値)を行い、後での修正に頼らないようにしています。必要に応じて、簡潔な フローキー メタデータ・パイプライン内で(CPUごとに)処理し、下流のレイヤーに渡します。これにより、パーシングは 決定論的, 、キャッシュに適しており、誤ったパケットや意図的に改ざんされたパケットに対しても堅牢である。.

テールコール、マップ、およびCPUごとの設計

私は論理を次のように構成しています テールコール, 、頻繁に実行されるパスを短く保ち、まれなケースを外部にオフロードするためです。 カウンタについては、アトミック操作を回避し、エクスポート時にのみ集計を行うため、Per-CPU-Array-Mapsを使用しています。キャッシュにはLRUハッシュマップを採用し、エヴィクションが過剰にならないよう、サイズを控えめに設定し、衝突率を測定しています。 設定情報(プレフィックスリストやポートグループなど)は配列マップまたはハッシュマップに保持し、実行時に再読み込みを行うことで、コードとデータを分離しています。テレメトリデータはリングバッファまたはサンプリングカウンタを用いて収集しており、決して ホット・ループ 高コストなイベントを伴う場合です。私は、フォールス・シェアリングを回避するためにアライメントやキャッシュラインに注意を払い、頻繁にアクセスされるデータがコンパクトにまとまるようフィールドをグループ化しています。これにより、可読性を損なうことなく、レイテンシを目に見えて低減できます。.

AF_XDPの詳細:ゼロコピー・ユーザーランド

私は、適切に設計されたAF_XDPを運用しています UMEM, 、キューをCPUに固定し、フィル/コンプリートリングを効率的に活用します。ゼロコピーは、ドライバとNICがこのモードをサポートしている場合にのみ最大の効果を発揮します。そうでない場合は、制御された形でコピーモードに切り替えます。RX/TX操作を バッチ, TX-Completions を速やかに確認し、バッファオーバーフローを防ぐためにペーシングを調整します。ビジーポーリングは、レイテンシが CPU のアイドル状態よりも重要となる場合にのみ使用し、ジッターへの影響を測定します。マルチキュー構成では、ソケットを意図的に キューID また、競合が発生しないように、コアを分離(IRQアフィニティ、ピンニング)します。このようにして、ユーザーランドエンジンを制御しながらスケーリングし、処理パスを短く保っています。.

仮想化とコンテナオーケストレーション

私はベアメタル、VM、コンテナを区別しています: ジェネリック-モードでは、VM上で機能テストを行い、パフォーマンス向上のためにネイティブモードへ移行します。Kubernetesでは、XDPをホストインターフェースに配置し、ノードごとの流入量を調整した上で、後でtc/eBPFを介してポッド固有のルールを適用します。 SR-IOV あるいはvDPAを使用することで、ホットパスをハードウェアにさらに近づけ、オフロードによってセマンティクスが変化しないかを確認します。vethパスについては意図的に処理を行っています:ホスト側でのプリフィルター(XDP)、ネームスペース内でのきめ細かなポリシー設定です。 これにより、CNI、サービスメッシュ、およびホストセキュリティの連携が一貫性を保ち、 予測可能.

トラブルシューティング、テスト、再現性

私は設計の早い段階で診断機能を組み込んでいます:CPUごとのドロップカウンターによる 理由コード, 、まれなエラーケース向けの限定的なトレースポイント、およびプログラム用の明確なビルドID。bpf_printkは、ホットパスを妨げないよう、実験室でのみ使用しています。本番環境では、カウンタ、サンプリング、および保存されたメタデータに依存しています。 回帰テストでは、合成パターン(SYNフラッド、UDPバースト、混合トラフィック)を投入し、レイテンシの分位数を比較し、測定を行います。 エンド・ツー・エンド. テストプロファイル(パケットサイズ、分布、継続時間)を固定し、カーネル、ドライバ、ファームウェアのバージョンを記録することで、測定値のドリフトを防いでいます。 偏差が生じた場合は、原因が明確になるまで、対象を絞ってロールバックを行ったり、変更箇所を特定して隔離したり(マップの内容のみ、パーサーのみ、テールコールチェーンのみなど)します。.

運用:ロールアウト、バージョン管理、およびフォールバック戦略

私はプログラムを以下の方法で更新しています アトミック リンクの更新、ブルー/グリーンバージョンの準備、そしてロールアウトとガードレールの連携:ドロップ率が予期せず上昇した場合は、自動的に前のバージョンに戻します。 ホットフィックスをリビルドなしで適用できるように、構成(マップ)をコードのデプロイから分離しています。私は以下を定義します 安全なデフォルト設定 (迷ったら DROP ではなく PASS を選択)、実験的なパスはタイムアウトにし、マップのメモリ上限を確認する。 カーネルのアップグレード時には、CO-RE互換性とBTFの可用性を確認し、genericモードでのフォールバックを確保しています。この徹底した対応により、障害を未然に防ぎ、ネットワークパスにおける計画的な変更を確実に実行できます。.

セキュリティとコンプライアンス

私は原則として 低侵襲: 必要な機能のみ、非特権BPF向けの制限的なsysctl設定、そして責任範囲の明確な分離。私のプログラムは検証機能に依存し、無制限のループを避け、実行時間を厳格に制限しています。 監査担当者が原因を特定できるよう、機密データを恒久的に記録することなく、決定内容を適切にログに記録しています。マルチテナント環境では、マップ用のネームスペースとリソース予算に留意し、あるテナントが容量を使い果たすことを防いでいます。このようにして、パフォーマンスと安全性を両立させ、, 検証可能 実施。.

ドライバー、ハードウェア、およびチューニング

パフォーマンスを評価する前に、ドライバのバージョン、NICのファームウェア、およびキューの割り当てを確認します。RSS、RPS、およびピンニングを使用して、フローを カーン また、コア間のジャンプを最小限に抑えます。キュー数、MTU、オフロードは、実際のパケットサイズに合わせて調整します。割り込みペーシングについては、負荷に応じて 割り込み合体 ジッターを低減しつつ、レイテンシの急上昇を引き起こさないよう、賢明に設定します。これらの手順により、測定可能な 勝利, 、コードをさらに最適化する前に。.

モニタリング、セキュリティ、およびオブザーバビリティ

Mapsからカウンターを読み取り、サンプルデータをエクスポートして、CPUアイドルやLLCミスレートといったシステムメトリクスと関連付けます。セキュリティチェックには、以下を追加します。 Sanity-ヘッダーフィールドのチェック、ステートの最小化、意図的なレート制限。監査に備え、意思決定の経路を追跡可能に保ち、プログラムのバージョンを記録しています。また、検証器の制限が遵守されているかを確認し、ループを厳格に管理しています。このようにして、パフォーマンスと セキュリティ バランスを保ちつつ、ファストパスの品質を損なうことなく。.

業務における位置づけと限界

私はXDPを主に イングレス-パスを実装し、逆方向の処理についてはtc/eBPFやその他のメカニズムを追加します。ステートフルな関数については慎重に扱い、ホットパスにおいて合理的な範囲に限定します。後段のスタック関数を必要とするプロトコルについては、単に処理を先送りし、処理の深さは上位層に委ねます。 ハードウェアオフロードについては、機能の整合性、テスト、および追跡可能なエラーメッセージに注意を払います。そうすることで、不適切な箇所でリソースを浪費することなく、強みを的確に活用しています。 快適さ 失う。.

簡単にまとめると

私は、パッケージに関する決定をできるだけ早い段階で NIC これにより、レイテンシ、オーバーヘッド、CPU負荷を大幅に低減します。eBPFにより、カーネルを離れることなく、XDPをプログラム可能かつ安全で、更新可能なものにします。DDoS防御、ロードバランシング、テレメトリといった高負荷シナリオにおいて、このアプローチは一貫したメリットをもたらします。 マップ、アクション、チューニングを巧みに組み合わせることで、安定した応答時間を維持しつつ高いスループットを実現できます。今日、Linuxネットワークを経済的に運用したいと考えるなら、XDPを採用することで明らかなメリットが得られます。 メリット データパス内。.

現在の記事

抽象化された高速ネットワーク処理を備えたサーバールーム
技術情報

XDP および eXpress Data Path:高性能なパケット処理

XDPは、Linuxカーネル内での早期パケット処理により、ネットワークパフォーマンスを向上させます。DDoS対策、ロードバランシング、低遅延に最適です。.

最新のサーバーラックを備え、TCP BBRによるネットワークパフォーマンスが最適化されたデータセンター
サーバーと仮想マシン

TCP BBR:Webサーバーの高速化を実現する最新の輻輳制御

TCP BBR は、帯域幅と RTT をモデル化して Web サーバーの効率を高める、最新の輻輳制御アルゴリズムです。TCP BBR の仕組み、その利点、および Linux で有効にする方法について解説します。.