XDP(エクスプレスデータパス)とは何ですか、Linuxにおける
XDP(エクスプレスデータパス)とは、Linuxカーネルに存在するネットワーキングユーティリティです。XDPは、多くの有名企業で、毎秒何百万ものリクエストを処理する際に直面する深刻なネットワーキングの問題を解決するために使用されています。これは、バージョン4.8からLinuxカーネルに統合されたMITライセンスのオープンソースプログラムです。
XDPは、高性能でプログラム可能なネットワークデータパケットプロセッサです。これは、DDoS(分散サービス拒否)攻撃などの深刻なサーバーサイドの問題を軽減したり、ロードバランサーとして存在しています。
目次
- XDPの必要性
- XDPが非常に速い理由
- ネットワーキングスタックとXDPの接続
- XDPが実行する操作の種類
- XDPとeBPF
- XDPとeBPFの一般的な使用例
- よくある質問
別記事も読む: 自分のLinuxカーネルをコンパイルする際の5つの便利なヒント
XDPの必要性
パフォーマンスの高いネットワーキングデータパスの必要性は、Linuxサーバーにとって常に求められる機能です。しかし、そのデータパスのプログラム性も必要であり、開発者が実際に利用できるものを作成するために必要です。XDPはかなり急な学習曲線がありますが、最近多くのツールやフレームワークが開発されたため、XDPコードを書くことは現在ではかなり身近に感じられます。
XDPの大きな利点はその速度です。XDPの主な機能は、開発者がカーネルそのものを変更することなくパッケージをフィルタリングする新しい機能を構築できることです。
場合によっては、パケットが転送または破棄されるかどうかを決定するために、ネットワークスタック全体を通過する必要がないシナリオもあります。これらはネットワーキングスタックの最初のレイヤーで行われるべきであり、フィルターを配置することで実現されます。これらのフィルターは、悪意のあるパケットを簡単に認識できるようにプログラムされ、スタックの最初でそれを破棄します。これにより、多くの処理能力と時間を節約できます。
XDPを使用すると、ネットワーキングスタックの最前面でフィルタリングが可能です。
今やXDPを使用することで、開発者はDDoS攻撃を行うためにハッカーから送信されるかもしれないパケットをフィルタリングできます。これにより、通常のカーネルネットワーキングスタックでのオーバーヘッドが大幅に削減できます。この機能は、CloudflareによってDDoS保護のデモで最近示されました。
XDPのいくつかの注目すべき特徴は以下の通りです:
- 専門的なハードウェアは必要ありません:XDPは、どのハードウェアでも動作します。最適化されたデバイスやそのドライバーがない場合、速度が妨げられる可能性がありますが、テスト目的では特別なハードウェアは不要です。
- カーネルバイパスは必要ありません:XDPは、パケットがカーネルネットワーキングスタックに到達する前に実行されます。パケットが受信されたときにコールバック関数が発火し、XDPは可能な限り迅速に処理します。
- TCP/IPスタックを置き換えることはありません:XDPはネットワーキングスタックの最下層に存在します。パケットが通過すると、その後、通常のカーネルネットワーキングスタック(TCP/IPスタックを含む)に入ります。
- TCP/IPと全てのBPF(バークレー・パケット・フィルター)機能と連携して動作します:XDPはどの機能も置き換えません。eBPFを使用してパケットを処理し、開発者がコードを書きやすくします。
別記事も読む: Ubuntuでカスタムカーネルを構築してインストールする方法
XDPが非常に速い理由
XDPは、LinuxカーネルにおけるeBPFベースのプログラム可能で高パフォーマンスなネットワークデータパスです。XDPの性能向上は、ソフトウェアスタックの最下層でのベアメタルパケット処理によるものです。つまり、ネットワークから来たデータパケットが、カーネルのどのプロセスよりも先にXDPに到達します。
したがって、エンジニアはXDPをプログラムしてさまざまなユースケースに最適化できます。DDoS保護から負荷分散まで。
XDPはネットワーキングスタックに直接ロードされます。ネットワーキングスタックがパケットを受信すると、コールバックが発火し、パケットはできるだけ迅速に処理されます。XDPは、一般的なハードウェアで1コアあたり毎秒2600万パケットを破棄できます。
XDPが非常に速い主な理由は、ユーザーがネットワークパケットデータを直接読み取ったり変更したりでき、パケットを早い段階でどのように処理するかの決定を下すことを許可されるからです。これにより、非常に少ないプロセスオーバーヘッドが生じ、結果としてより良い速度が実現されます。
ネットワーキングスタックとXDPの接続
XDPを介してネットワーキングに接続する手段はさまざまですが、ここではいくつかの一般的な方法を紹介します。
- 一般的なXDP:このプロセスでは、XDPはカーネルにロードされますが、パフォーマンスの利点は非常に少ないです。これは、ハードウェアからのサポートなしでXDPプログラムを実行する容易な方法です。
- ネイティブXDP:ネイティブXDPは、ネットワーキングドライバー自体によりロードされます。ネットワークカードドライバーからのサポートが必要です。
別記事も読む: Windowsでカーネルデータインページエラーを修正する方法
XDPが実行する操作の種類
ネットワーキングインターフェースによってパケットが受信されると、XDPが実行できる操作のいくつかは以下の通りです。
- XDP_DROP:パケットを破棄し、処理を行いません。eBPFプログラムを使用してトラフィックパターンを分析し、リアルタイムでパケットを破棄できます。
- XDP_PASS:パケットをネットワーキングスタックに転送してさらなる処理を行います。パケットの内容を修正することができます。
- XDP_ABORTED:ネットワークデータパケットを破棄し、トレースポイントの例外を残します。
- XDP_TX:パケットを受信する同じネットワーキングインターフェースに転送します。パケットは修正可能または変更されていないまま送信できます。
- XDP_REDIRECT:パケットを別のNIC(ネットワークインターフェースコントローラー)にリダイレクトします。
XDPとeBPF
eBPFは、バークレー・パケット・フィルターの拡張バージョンです。これは、Linuxカーネル内で動作する抽象化された仮想マシンのようなものです。eBPFは、Linuxカーネルのサンドボックス環境内でユーザー定義プログラムを実行するために使用されます。一般的に、ネットワーキングや監視ツールをLinuxサーバーで実行し、最適なパフォーマンスを確保するために使用されます。
XDPは、BPFアプリケーションの非常に高速なパケット処理を書くために使用されるフレームワークです。さらに高速にするために、XDPはパケットがネットワーキングスタックで受信もしくは処理されるとすぐにBPFを実行します。
XDPは非常に急な学習曲線を持っています。そのため、開発者はeBPFを使用してプログラミングを容易にするためのツールやフレームワークを開発しています。これにより、XDPとeBPFを使用して非常に高頻度のネットワーク処理のためのコードを書くことが非常に簡単になります。XDPの主な利点は、カーネルを変更する必要がないため、エンジニアにとって大きな頭痛の種ではなくなったことです。
しかし、人々が言ったように、大きな力には大きな責任が伴います。XDPはパケットがカーネル自体によって解析される前にeBPFを可能な限り早く実行するため、eBPFプログラムはすべての解析を自分自身で行う必要があり、カーネルに何かを頼ることができません。
プログラマーとして、あなたの時間のほとんどはターミナルで作業しています。これは、ターミナルプロンプトを装飾するためのガイドです。ぜひチェックしてください。
別記事も読む: Linuxでカーネルをダウングレードする方法
XDPとeBPFの一般的な使用例
- DDoS攻撃:XDPの主な使用ケースは、DDoS(分散サービス拒否)保護です。DDoS攻撃中、攻撃者はできるだけ多くのリソースをサーバーから使おうとし、エンドユーザーに対してプロセスを残さないようにします。ネットワーキングスタックの非常に高速なレイヤーとしてXDPを使用することによって、ネットワークデータパケットを破棄する際に関連する処理コストはありません。XDPフィルタリングの後、パケットはLinuxカーネルが提供する他のすべてのフィルタリング方法を通過します。
- ロードバランサー:XDPは、サーバーへの膨大な量のトラフィックを処理するためのロードバランサーとしても使用されます。Facebookを含む多くの大手テクノロジー企業がこの技術を使用しています。以前は、エンジニアは専用サーバーをロードバランサーとして使用していました。これは管理が非常に難しく、何百万もの顧客にサービスを提供するために非常に優れたパフォーマンスが必要でした。しかし、中心サーバーなくXDPレイヤーをロードバランサーとして利用することを想像してみてください。結果的に、単一障害点がなくなります。
- ファイアウォール:XDPとeBPFを使用して、非常に最小限のオーバーヘッドでシステムを保護するためのさまざまなファイアウォールルールを書くことができます。
よくある質問
BCCはeBPFと何ですか?
BCCはeBPFに基づいて構築されています。これは、カーネルトレースおよび操作プログラムのツールキットまたはフレームワークであり、非常に便利なコマンドラインインターフェースが付随しています。BCCは、C言語でカーネル命令を書くのを助けます。LLVMのラッパーも含まれています。
libBPFとは何ですか?
LibBPFは、BPFアプリケーションを作成するための代替ツールセットです。Cプログラミング言語で書かれています。