アゴドリルの備忘録

小さいことを少しずつ

DPDK FW進捗

seccamp 2018卒業生です。

趣味で作っているDPDK FWの進捗報告をさせていただきます。
よろしくお願いします。

DPDKとは

パケット処理に特化したライブラリのことです。

  • kernel bypassしてUser landから直接NICをたたくことができる
  • PMD(Poll Mode Driver)でCPUを占有(Polling)してパケットに関する処理に全リソースを割くことができる
  • hugepageの利用で、一ページあたりの大きさを大きくして、ページ数を少なくして、高速化ができる

以上のようなメリットがあり、パケットを高速で送受信することができます。

進捗

  • フィルター情報のjson読み取り化
  • logで出力されるプロトコルの追加(ARP/ICMP)
  • packet長のおかしいpacketのドロップ
  • フロント側のみの実装
  • packet senderの実装

以上のことをしました。

それぞれについて説明していきます。

フィルタリング設定json読み込み化

まず、今までdropする5tuple(ip dst/ ip src/ ip proto/ src port/ dst port)フィルターの情報を標準入力で受けつけるように実装していました。
しかし、それは非常に面倒だと普通は思うのでjsonを読み込んでフィルターするように実装しました。
これを実装した後に改めて計測をしました。

その際、janssonというライブラリを使いました。
Jansson — C library for working with JSON data
Jansson Documentation — Jansson 2.11 documentation

また、Log出力のOn/Offもここで切り替えられるようにしました。

ログの追加

速度を出すため、基本的にはログ出力をOFFにするのですが、ONにしたときのログの追加をしました。
今まではTCP/UDPのみ -> ARP/ICMPの追加

フロント側の実装

フロントではDPDKアプリケーションの起動・終了、config設定の修正、などをインタラクティブにできるREPLの形のCUIを実装しています。
(Pythonを使用)

f:id:agodoriru:20181208002021p:plain

packet senderの実装

このアプリを作成する際にデバッグ用に送信するパケットを自分で作れたら嬉しいと考えたので、上と同様にjson形式で設定を書いてパケットを送信するアプリケーションを作成しました。
(syuu先生のプログラムを参考にさせていただきました。)

f:id:agodoriru:20181208001913p:plain

FW性能測定

環境

f:id:agodoriru:20181207170951p:plain

上のような環境で実験しました。
Host 1側でIntel DPDK pkt-genを走らせてパケットを送信して、Host 2側で今回作成したFWを走らせてパケットをフィルタリングして、Host 1側に送信する、という形で測定しました。

HW

CPU : Intel Xeon Processor E3-1225 v6
OS : 18.04.1 LTS
NIC : Intel Ethernet Controller X540-AT2

測定結果


1filterの時はL2fwdと同様の動作をしている場合にはほぼ10Gbpsに対して、filter数を上げていくとやはり速度が落ちていく、という結果になりました。

githubリンク

github.com

パケットと戯れた結果

Todo

フロント側との結合
もっと低レイヤー的なことをして、パケットロスを減らしたい。
(どうすれば性能が向上するか全くわからないが、、、)
これを今後取り組みます。

最後に

自分はDPDKの開発環境を持っておらず、seccampでお世話になったsyuu先生のマシンを借りて開発をしています。
また、技術的な質問にも答えていただいて非常に感謝しています。
ありがとうございます。

最後の最後に

まだまだやることがあるので頑張りたい