2

Intel DPDK を使用して高性能 DNS サーバーを作成したいと考えています。Intel DPDK を使用して TCP パケットを効果的に処理するにはどうすればよいですか?

確かに、DPDK にネット スタックを実装することが解決策です。しかし、それはあまりにも複雑です。

DNS サーバーは TCP クエリよりもはるかに多くの UDP クエリを処理するため、DPDK を使用して UDP クエリを処理し、Linux ネット スタックを使用して TCP クエリを処理するつもりです。
単一のマシンでこれを行うにはどうすればよいですか?

4

2 に答える 2

2

ゲイブが提案したことは正しいですが、本当に欲しいものを達成するためのより良い方法があります. 分岐ドライバーを使用する必要があります。

Gabe によって提案された KNI の使用に関する問題は次のとおりです。

保持する必要があるもの (UDP) と、ネットワーク スタック (TCP) を介してすべてをルーティングする必要があるものを決定する、ユーザー空間内のソフトウェアです。次に、CPU とメモリ サイクルを消費する DPDK ソフトウェア リングを介してカーネルに渡します。

mbuf と KNI のパフォーマンスに影響を与えるカーネル ソケット バッファーの間にメモリ コピーが存在します。

また、ユーザー空間で UDP を処理する場合は、パケットをプッシュする前に L2 ヘッダーを作成する必要があることに注意してください。これは、L2 ヘッダーを構築するために必要になるため、ARP キャッシュを構築できるように、おそらくすべての ARP パケットをトラップする必要があることを意味します。

于 2015-07-03T08:46:14.627 に答える
1

DPDKのKNIドキュメントとカーネル NIC インターフェイスの例を参照してください。

KNI デバイスを割り当てた後、メインの DPDK ポーリング ループで、NIC からパケットをプルします。自分でヘッダーを解析する必要があります。または、工夫して複数の RX キューを設定し、RSS 5 タプル フィルターを使用して UDP パケットを処理キューに送信し、残りをデフォルト キューに送信することもできます。

とにかく、選択した方法に関係なく、それが UDP パケットである場合は、(要求したように) 自分で処理できます。それ以外の場合は、パケットを KNI スレッドのキューに入れます。また、KNI スレッドからパケットをポーリングし、それをインターフェースから送信する、KNI インターフェースの残りの半分も必要になります。

これは、特定のトラフィック以外のすべての操作に Linux ネットワーク スタックが必要なアプリケーションで行う方法とまったく同じです。

于 2014-06-23T17:15:17.873 に答える