この記事では、4 つの古典的な Linux パケット収集エンジンをリストします。他にも問題ないと思われるエンジンがある場合は、メッセージを残してください。これら 4 つは次のとおりです:
「4 番目のコピーがなくなりました」 ) を削減し、これにより頻繁なシステム コールが削減され、メッセージ キャプチャの効率が大幅に向上します。 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 つのアプリケーションが同時に各キューに存在できることに注意してください)。つまり、ユーザー モードの複数のアプリケーションは、データ パケットを分散するために相互に通信する必要があります。 pf-ring zc と dpdk はどちらもデータ パケットのゼロ コピーを実現でき、どちらもカーネルをバイパスしますが、実装原理は若干異なります。 PF リング zc は、zc ドライバー (アプリケーション層でも) を通じてデータ パケットを引き継ぎ、dpdk は UIO に基づいて実装されます。 UIO (ユーザー空間 I/O) は、ユーザー空間で実行される I/O テクノロジです。一般に、Linux システムのドライバー デバイスはカーネル空間で実行され、ユーザー空間のアプリケーションから呼び出すことができますが、UIO はドライバーのごく一部をカーネル空間で実行し、ドライバーの大部分をユーザー空間で実装します。関数。 Linux が提供する UIO メカニズムを使用すると、カーネルをバイパスでき、すべてのパケット処理作業がユーザー空間で完了します。 DPDK の UIO ドライバーはハードウェア発行の割り込みをブロックし、ユーザー モードでアクティブ ポーリングを使用します。このモードは PMD と呼ばれます。 (ポーリング モード ドライバー)。 DPDK と比較すると、pf-ring (zc なし) は NAPI ポーリングとアプリケーション層ポーリングを使用しますが、pf-ring zc は DPDK に似ており、アプリケーション層ポーリングのみを使用します。 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 が向上します。アドレス性能です。 xdp は eXpress データ パスを表します。パケット フィルタリング用の ebpf データ パケットをユーザー モードに直接送信し、ユーザー モードを高速データ処理プレーンとして使用する dpdk と比較して、xdp はドライバー層にデータ高速プレーンを作成します。データ パケットは、ネットワーク カード ハードウェアによってメモリにデータが転送され、skb が割り当てられる前に処理されます。 XDP はデータ パケットに対してカーネル バイパスを実行せず、事前に少しの事前チェックを行うだけであることに注意してください。 DPDK と比較すると、XDP には次の利点があります: PF_RING
DPDK
1 UIO mmap はゼロコピーを実装します
2 UIO PMD は割り込みと CPU コンテキストの切り替えを軽減します
3 HugePages による TLB ミスの削減
4 その他の最適化
XDP
DDoS 防御
以上がいくつかの古典的な Linux パケット収集エンジンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。