ホームページ  >  記事  >  運用・保守  >  いくつかの古典的な Linux パケット収集エンジン

いくつかの古典的な Linux パケット収集エンジン

Linux中文社区
Linux中文社区転載
2023-08-04 16:07:061822ブラウズ

この記事では、4 つの古典的な Linux パケット収集エンジンをリストします。他にも問題ないと思われるエンジンがある場合は、メッセージを残してください。これら 4 つは次のとおりです:

  • #libpcap/libpcap-mmap
  • PF_RING
  • DPDK
  • #xdp
libpcap

libpcap のパケット キャプチャ メカニズムは、バイパス処理を追加することで、システム独自のネットワーク プロトコル スタックの処理送受信されたデータ パケットは、Linux カーネルを通じてフィルタリングおよびバッファリングされ、最終的に上位層アプリケーションに直接渡されます。

  1. データ パケットはネットワーク カード デバイスに到着します。
  2. #ネットワーク カード デバイスは、設定に従って DMA 操作を実行します。 (
    「最初のコピー」 : ネットワーク カード レジスタ -> カーネルによってネットワーク カードに割り当てられたバッファ リング バッファ)
  3. ##ネットワーク カードは割り込みを送信し、プロセッサをウェイクアップします。
  4. ドライバー ソフトウェアはリング バッファーから読み取り、カーネル skbuff 構造に埋め込みます (
  5. 「2 番目のコピー」 : カーネル ネットワーク カード バッファ リング バッファ -> カーネル固有のデータ構造 skbuff)
  6. 次に netif_receive_skb 関数を呼び出します:
    5.1 パケット キャプチャ プログラムがある場合は、ネットワーク サブインターフェイス経由で BPF フィルターに入り、ルールに一致するパケットをシステム カーネル キャッシュにコピーします (
  • 「3 番目のコピー」 )。 BPF は、サービスを必要とする各パケット キャプチャ プログラムに 1 つのフィルタと 2 つのバッファを関連付けます。 BPF はバッファを割り当て、そのサイズは通常 4KB です。ストア バッファはアダプタからデータを受信するために使用され、ホールド バッファはパケットをアプリケーションにコピーするために使用されます。
  • 5.2 データリンク層のブリッジ機能を処理します;
  • 5.3 skb->protocol フィールドに基づいて上位層プロトコルを決定しますそしてそれをネットワーク層の処理に送信し、高レベルの処理のためにネットワーク プロトコル スタックに入ります。
  • libpcap は、Linux カーネル パケット収集プロセスのプロトコル スタック部分の処理をバイパスし、ユーザー空間 API がソケット PF_PACKET を直接呼び出して、リンク層ドライバーからデータ パケットを取得できるようにします。カーネルバッファからユーザー空間バッファへ (
  • 「4 番目のコピー」 )
  • libpcap-mmap

    libpcap-mmap は古い libpcap 実装を改良したもので、新しいバージョンの libpcap は基本的に packet_mmap メカニズムを使用します。 PACKET_MMAP は mmap を使用して 1 つのメモリ コピー (

    「4 番目のコピーがなくなりました」 ) を削減し、これにより頻繁なシステム コールが削減され、メッセージ キャプチャの効率が大幅に向上します。

    PF_RING

    libpcap には 4 つのメモリ コピーがあることが以前に確認されました。 libpcap_mmap には 3 つのメモリ コピーがあります。 PF_RING が提案する中心的なソリューションは、送信中のメッセージのコピーの数を減らすことです。

    libpcap_mmap と比較すると、pfring ではユーザー空間メモリを rx_buffer で直接 mmap できることがわかります。これにより、別のコピー ( 「libpcap_mmap の 2 番目のコピー」: rx_buffer->skb)

    PF-RING ZC が DNA (ダイレクト NIC アクセス (ダイレクト ネットワーク カード) を実装) が削減されます。 access) テクノロジーは、ユーザー メモリ空間をドライバーのメモリ空間にマップし、ユーザー アプリケーションがネットワーク カードのレジスタおよびデータに直接アクセスできるようにします。

    このようにして、カーネル内のデータ パケットのキャッシュが回避され、コピーが 1 つ削減されます ( 「libpcap の最初のコピー」 、DMA からカーネル バッファへのコピー)。これは完全にゼロコピーです。

    欠点は、一度に 1 つのアプリケーションしか DMA リングを開くことができないことです (今日のネットワーク カードは複数の RX/TX キューを持つことができ、1 つのアプリケーションが同時に各キューに存在できることに注意してください)。つまり、ユーザー モードの複数のアプリケーションは、データ パケットを分散するために相互に通信する必要があります。

    DPDK

    pf-ring zc と dpdk はどちらもデータ パケットのゼロ コピーを実現でき、どちらもカーネルをバイパスしますが、実装原理は若干異なります。 PF リング zc は、zc ドライバー (アプリケーション層でも) を通じてデータ パケットを引き継ぎ、dpdk は UIO に基づいて実装されます。

    1 UIO mmap はゼロコピーを実装します

    UIO (ユーザー空間 I/O) は、ユーザー空間で実行される I/O テクノロジです。一般に、Linux システムのドライバー デバイスはカーネル空間で実行され、ユーザー空間のアプリケーションから呼び出すことができますが、UIO はドライバーのごく一部をカーネル空間で実行し、ドライバーの大部分をユーザー空間で実装します。関数。 Linux が提供する UIO メカニズムを使用すると、カーネルをバイパスでき、すべてのパケット処理作業がユーザー空間で完了します。

    2 UIO PMD は割り込みと CPU コンテキストの切り替えを軽減します

    DPDK の UIO ドライバーはハードウェア発行の割り込みをブロックし、ユーザー モードでアクティブ ポーリングを使用します。このモードは PMD と呼ばれます。 (ポーリング モード ドライバー)。

    DPDK と比較すると、pf-ring (zc なし) は NAPI ポーリングとアプリケーション層ポーリングを使用しますが、pf-ring zc は DPDK に似ており、アプリケーション層ポーリングのみを使用します。

    3 HugePages による TLB ミスの削減

    MMU (メモリ管理ユニット) がオペレーティング システムに導入された後、CPU はメモリを読み取るためにメモリに 2 回アクセスする必要があります。データ。 1 回目は、ページ テーブルにクエリを実行して論理アドレスを物理アドレスに変換し、その物理アドレスにアクセスしてデータまたは命令を読み取ります。

    ページ数やページ テーブルが大きすぎることによって引き起こされるクエリ時間が長すぎる問題を軽減するために、アドレス変換バッファとして変換できる TLB (Translation Lookaside Buffer) が導入されました。 TLB はメモリ管理ユニットであり、通常はレジスタに格納され、現在アクセスされる可能性が最も高いページ テーブル エントリの小さな部分が格納されます。

    TLB の導入後、CPU はまず TLB 内を検索しますが、TLB はレジスタに格納され、ページ テーブル エントリのごく一部しか含まれていないため、クエリ速度は非常に高速です。 TLB でのアドレス指定が成功した場合 (TLB ヒット)、RAM 内のページ テーブルをクエリする必要はありませんが、TLB でのアドレス指定が失敗した場合 (TLB ミス)、RAM 内のページ テーブルをクエリする必要があります。クエリ後、ページはTLB に更新されます。

    DPDK は、x86-64 で 2MB および 1GB のページ サイズをサポートする HugePages を使用します。これにより、総ページ数とページ テーブルのサイズが大幅に削減され、TLB ミスの可能性が大幅に減少し、CPU が向上します。アドレス性能です。

    4 その他の最適化

    • SNA (シェアードナッシング アーキテクチャ)、ソフトウェア アーキテクチャは分散型であり、グローバルな共有を回避し、グローバルな共有を実現しようとします。競争が起こり、水平方向に拡張する能力が失われます。 NUMA システムでは、メモリはノード間でリモートで使用されません。
    • SIMD (単一命令複数データ)、初期の mmx/sse から最新の avx2 まで、SIMD の機能は増加しています。 DPDK は、複数のパケットを同時にバッチ処理し、ベクトル プログラミングを使用してすべてのパケットを 1 サイクルで処理します。たとえば、memcpy は SIMD を使用して速度を向上させます。
    • cpu アフィニティ: CPU アフィニティ

    XDP

    xdp は eXpress データ パスを表します。パケット フィルタリング用の ebpf データ パケットをユーザー モードに直接送信し、ユーザー モードを高速データ処理プレーンとして使用する dpdk と比較して、xdp はドライバー層にデータ高速プレーンを作成します。データ パケットは、ネットワーク カード ハードウェアによってメモリにデータが転送され、skb が割り当てられる前に処理されます。

    XDP はデータ パケットに対してカーネル バイパスを実行せず、事前に少しの事前チェックを行うだけであることに注意してください。

    DPDK と比較すると、XDP には次の利点があります:

    • #サードパーティのコード ライブラリとライセンスは不要
    • #ポーリング ネットワークと割り込みベースのネットワークの両方をサポート
    • 巨大なページを割り当てる必要はありません
    • #専用の CPU は必要ありません
    • #新しいセキュリティ ネットワーク モデルを定義する必要はありません
    • XDP の使用シナリオには以下が含まれます:

    DDoS 防御
    • ファイアウォール
    • XDP_TXベースのロード バランシング
    • ネットワーク統計
    • 複雑なネットワーク サンプリング
    • 高速取引プラットフォーム
    • OK、今日の共有は以上です。他にもパケット収集エンジンがあると思われる場合は、共有するメッセージを残してください。


    #

以上がいくつかの古典的な Linux パケット収集エンジンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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