目次
DPDK
DPDKはユーザランドで高速なパケット処理のための、ライブラリとAPIを提供
メモリ管理
DPDKでは高速化を実現するためHugePageを使用する。
HugePageはメモリ管理として1ページのサイズを大幅に拡張することで、仮想メモリのCPU負荷を削減する。HugePageを使うと、ページサイズが増えることで仮想メモリアドレス変換テーブルが小さくなるため性能面で優位に働きます。またページイン及びページアウト処理が発生しないため、ページの入れ替え処理が発生するリスクがなくなります。ただし、メモリに対して大きな単位で割り当てるとともに、ページイン・ページアウトができないことから、メモリの使用効率は悪くなるデメリットがある。
仮想メモリアドレスと実際のメモリアドレスを変換する仕組みとして良く利用されるのがTLB(Translation Lookaside Buffer)です。仮想メモリアドレス変換テーブルは通常はメモリに配置されますが、さらに高速にアクセスできるCPU内部のキャッシュに変換情報を配置することで、高速な変換処理を実現しています。このキャッシュ領域は非常に小さいため、全てのページテーブルの情報を格納することはできません。変換処理としてはキャッシュ領域に配置されているTLBから変換処理を行うことを試み、情報が無ければメモリに配置している仮想メモリアドレス変換テーブルを用い変換処理を行います。効率よく変換するためには、いかにキャッシュ領域からの検索ヒット率を向上させるかが重要になります。HugePageはページテーブルのエントリ数が小さくなるため、キャッシュ領域からの検索ヒット率が向上し、性能面で優位に働いていきます。
Poll Mode Driver
NICは受信したパケットや送信するパケットを格納しておくメモリ領域(「キュー」)を持つ。 通常はカーネルがNICが受信したパケットをキューから取り出したり、送信したいパケットをキューに格納する。カーネルがこのような役割を担っているため、アプリケーションがパケット処理を実現する場合、システムコールを通してカーネルが格納したパケットを取得したり、送信したいパケットをカーネルに渡す必要がある。
NICはHW内に受信したパケットや送信するパケットを格納しておくメモリ領域を持っています。このメモリ領域のことを「キュー」といいます。 通常はカーネルがNICが受信したパケットをキューから取り出したり、送信したいパケットをキューに格納します。カーネルがこのような役割を担っているため、アプリケーションがパケット処理を実現する場合、システムコールを通してカーネルが格納したパケットを取得したり、送信したいパケットをカーネルに渡す必要があります。
DPDKアプリケーションでパケット処理を実現する場合、下図のようにNICに対して常にポーリングでパケット受信を監視する形をとり、パケット自体もNICのキューから直接ユーザ空間(Hugepage)に移すため、オーバーヘッドなくすぐにパケット処理を実施することができます。
通常はカーネルがNICの種類に応じたデバイスドライバを利用するため、開発者がパケット処理を行うアプリケーションを実装する際は、システムコールを介してNICの種類を意識することなくプログラミングすることができます。DPDKでも同様に、DPDKライブラリ側がNICの種類に応じた専用のPMDを割り当ててくれるため、開発者はDPDKが用意している専用のパケット処理用APIを利用することで、NICの種類を意識することなくプログラミングすることができます。
Mellanox DPDK
Mellanox Poll Mode Driver (PMD)
Kernel-bypassのパケット送受信するためのドライバ
mlx5はDPDK PMD for Mellanox ConnectX-4/ConnectX-4 Lx/ConnectX-5。DPDKに含まれる。
mlx5を使うためにはMellanox OFEDとMellanox Ethernet Driverが櫃よ
アーキテクチャ
Mellanox PMDはHWに直接アクセスし、制御パスはカーネルモジュールを経由する。他のPMDとは異なり、Mellanox PMDはコントロールパスのためにUIO/VFIOドライバに依存しない。その代わりに、control-pathは、Raw Ethernet Accelerated Verbs APIを使用してlibibverbsの上に構築される。
そのため、PCIeデバイスをカーネルネットワークスタックから解放する必要はなく、カーネルデバイス上で標準的なLinuxコマンド(ethtool/ifconfigなど)を実行してMTUやフロー制御パラメータの問い合わせ/更新や統計情報の監視が可能となる。これにより、PMDはカーネルドライバインタフェースと共存することができ、その機能は維持される。DPDKが使用していないポートは、カーネルネットワークスタックを介してトラフィックを送受信することができる。
セキュリティ上の理由から、PMDは仮想メモリアドレスのみを扱う。リソースの割り当てはハードウェアの仕様に従ってカーネルが行い、HWが仮想メモリアドレスを直接扱えるようにすることで、DPDKアプリケーションが物理メモリ(またはプロセスに属さないメモリ)にランダムにアクセスできないようにする。
libmlx4 / libmlx5 は Mellanox NIC 用の Mellanox ユーザースペースドライバ。
mlx4_ib / mlx5_ib および mlx4_core / mlx5_core カーネルモジュールは、制御パスに使用。
mlx4_en / mlx5_enは、インタフェースを立ち上げるために必要。
気づき
- DPDKはユーザ空間のPoll Mode Driver(PMD)でネットワーク処理をする。
- NIC HWからユーザ空間へのデータコピーはPMDで処理する
- MellanoxのPMDはData Path Direct PRM I/FというAPIでHWからユーザ空間にデータコピーする。
- カーネルのHWからホストメモリへのコピーは、NICはパケットを受信するとCPUに割込みをあげる。ドライバがDMAを使ってNICメモリからホストメモリに確保したSKB領域にデータを転送する(「デバイスドライバプログラミング 8-7 DMA」、「Linuxデバイスドライバ 17.6パケット受信」)。カーネルはDMA用のバッファ確保にpci_alloc/free_consistentを使う。
わからないこと
- MellanoxのPMDがどうやってNIC HWからユーザ空間にデータをコピーするか?RDMAを転送している?
- カーネルNIC処理とData Path Direct PRM I/Fを共存させることができるか?