Skip to content

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アプリを動かす。