DPDK概要
DPDK技術に関して、以下を説明します。
- DPDKの設定
- DPDKプログラミング
A. DPDK設定
まず、DPDK SDKのインストール方法について説明します。
- RHEL8にDPDK22 SDKをインストール【1】
- CentOS7にDPDK22 SDKをインストール【2】
- Ubuntu22.04にDPDK22 SDKをインストール【3】
つづいて、DPDK環境の設定方法について説明します。
B. dpdk-testpmdで、いろいろやってみる。
C. 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アプリを動かす。