DPDK概要
DPDK技術に関して、以下を説明します。
- DPDK22インストール
- dpdk-testpmdで、UDP送信
- dpdk-testpmdで、UDP受信
- DPDKプログラミング
A1 DPDK22インストール
まず、DPDK22 SDKのインストール方法について説明します。
- RHEL8にDPDK22 SDKをインストール
- CentOS7にDPDK22 SDKをインストール
- Ubuntu22.04にDPDK22 SDKをインストール
つづいて、DPDK環境の設定方法について説明します。
A2 dpdk-testpmdで、UDP送信
- RHEL8でUDP送信
- CentOS7でDP送信 * Ubuntu22でUDP送信
A3 dpdk-testpmdで、UDP受信
- RHEL8でUDP受信
- CentOS7でDP受信 * Ubuntu22でUDP受信
A4 DPDKプログラミング
DPDKをインストールして、dpdk-testpmdが動くようになっても、あまり感動がありません。「L2レベルででたらめなパケットが飛んでるだけ」だからです。ARP、IP、ICMP、UDP等を自力で実装して、上位のレイヤが動き始めると、感動が得られるようになります。以下の順でDPDKプログラムを実装してみます。
- ARP: 自分のMACアドレスを広報したり、相手のMACアドレスを取得します。VIPも実装できます。
- IPv4: ICMPやUDPやTCPのパケットを乗せる箱です。チェックサムをハードで行わせる(オフロード)おまじないも行います。
- ICMP: ICMP-Echoのみ実装します。外部からのpingに応答するようになります。
- UDP: RTPやGTPのパケットを乗せるための箱です。チェックサムをハードで行わせる(オフロード)おまじないも行います。パケット分割も実装してみます。
- 帯域制御: Linuxカーネルにはtcというスグレモノがあるのですが、DPDKからは使えないので、自作します。RFCで定義された帯域制御アルゴリズムを実装します。
- IPv6: 実装してみます。
作らないもの:Linuxのカーネルでは当たり前のように実装されている、以下の機能も必須と思いますが、ややこしいのでギブアップします。このへんをLinuxカーネルに実装した人々を尊敬しています。
- TCP
- Bonding
- ACLとか、NSとか、TCとか、もろもろ
PMD
割込が発生するシステムコールを完全排除した、DPDKプログラムです。共有メモリを介して他プログラムやNICと通信します。また、CPUのクロックレジスタを直接読み出して、タイミング処理を行います。このように、PMDは非常にエキサイティングなプログラムです。sleepしない(sleepしてしまうと誰も起こしてくれない)ので、CPU使用率は常に100%となってます。
D. 今後の予定
KubernetesでもDPDKが扱えるようになってきました。コンテナを特権モードで動かせば、なんでもできしまうのですが、KubernetesにしっかりとmanageされたVF/DPDKリソースを扱ってみたいと思います・
- VMの仮想NICをDPDK対応にして、VM上でDPDKアプリを動かす。
- SR-IOV下のVF NICで、DPDKアプリを動かす。
- OpenShift/Kubernetes仮想NICをDPDK対応にして、コンテナ上でDPDKアプリを動かす。