パケットを受信するため、実行コアは Rx 記述子を介して NIC と通信します。Rx 記述子は、アドレスやサイズなどパ ケットに関する情報を保持するデータ構造で、Rx キューと呼ばれるリングバッファーに結合されます。簡単に言えば、
パケット受信はリングバッファー内のレースであり、NIC はリングバッファーの [Head (先頭)] に Rx 記述子を追加 し、実行コアは [Tail (末尾)] から Rx 記述子をポーリング、処理、そして解放します。
51
コアは Rx 記述子を解放すると、Tail ポインターを前方に移動します。Tail が Head に到達すると、
rte_eth_rx_burst() は 0 パケットを返します。逆に、Head が Tail に到達すると、Rx キューに利用可能な Rx 記述子がなく、パケット損失が発生する可能性があります。
新しいパケットを提供するため、NIC は Rx キューの Head にある Rx 記述子を読み取り、記述子のコアで指定され たメモリーアドレスにパケットを転送します。そして、Rx 記述子を書き戻して、コアに新しいパケットの到着を通知す る必要があります。
このレシピのセットアップに使用したインテル® イーサネット・コントローラー XL710 シリーズは、16 バイトと 32 バイトの Rx 記述子をサポートします。どちらもキャッシュラインのサイズよりも小さいため、NIC は PCIe* 帯域幅を 抑えるため整数のキャッシュラインへ Rx 記述子をパックして書き込みをまとめる、記述子の書き戻しポリシーを採 用しています。主に、インテル® イーサネット・コントローラー XL710 シリーズは、次の条件を満たす場合、完了した Rx 記述子を書き戻します。
• 4 x 32 バイト の記述子または 8 x 16 バイトの記述子が完了した場合
• 内部 NIC キャッシュで記述子が無効にされた場合
詳細は、インテル® イーサネット・コントローラー X710/XXV710/XL710 シリーズのデータシート (英語) を参照し てください。
このレシピでは、システムが 32 バイトの Rx 記述子を使用しているため、[DPDK Rx Batch Histogram (DPDK Rx バッチ・ヒストグラム)] のほとんどのピークは 4 の倍数になっています。
DPDK では Rx 記述子のサイズを切り替えることができます。以下は、testpmd を 32 バイトと 16 バイトの Rx 記
述子を使用して中程度の負荷で実行した場合の [DPDK Rx Batch Histogram (DPDK Rx バッチ・ヒストグラム)]
の変化です。
• 32 バイトの Rx 記述子: ほとんどの rte_eth_rx_burst() 呼び出しは 4 パケットを受け取ります。
52
• 16 バイトの Rx 記述子: ほとんどの rte_eth_rx_burst() 呼び出しは 8 パケットを受け取ります。
親トピック: チューニング・レシピ
関連項目
カスタムコレクターの使用 (英語)
外部データを含む CSV ファイルを作成する (英語) 外部データのインポート (英語)
添付ファイル:
dpdk_patches.zip
53