現在位置: ホーム / みらくるブログ / #4 DPDKベースのパケットジェネレータpktgen

#4 DPDKベースのパケットジェネレータpktgen

これまでは、testpmdを使って2台のホスト間で循環的にパケットを転送きましたが、今回はpktgenというパケットジェネレータを使っていろいろなパターンのパケットを送信できるようにします。

DPDK pktgenのビルド

第2回第3回の構成を引き続き使用します。ホスト1にDPDKを利用するパケットジェネレータpktgenをインストールします。debパッケージがないようですのでソースからビルドします。

$ curl http://dpdk.org/browse/apps/pktgen-dpdk/snapshot/pktgen-dpdk-pktgen-3.1.2.tar.xz | tar xJvf -
$ cd pktgen-dpdk-pktgen-3.1.2/
$ RTE_SDK=/usr/share/dpdk RTE_TARGET=x86_64-default-linuxapp-gcc make LDLIBS="-ldpdk -lm -lpthread -ldl"

これで、展開したディレクトリの以下の場所にバイナリが生成されます。

app/app/x86_64-default-linuxapp-gcc/app/pktgen

なお、第2回で、DPDKをビルドした時にEXTRA_CFLAGSを明示的に指定して-O3オプションなどを付加しましたが、今回はつけなくても指定されているようなので省略しました。コンパイル時、コマンドラインの詳細をみるには、上記のmake行の最後にV=1をつけてみてください。

pktgenの起動

では早速起動してみましょう。オプション-mについてですが、前半の1.0は論理コア1が、Port 0のQueue、後半の2.1は論理コア2がPort 1のQueueを処理することを意味します。詳細は公式ドキュメントをご参照ください。

# app/app/x86_64-default-linuxapp-gcc/pktgen -- -m "1.0,2.1"

起動すると次のような画面が表示されます。

/ Ports 0-1 of 2   <Main Page>  Copyright (c) <2010-2016>, Intel Corporation
  Flags:Port      :   ---------------:0   ---------------:1
Link State        :       <UP-10000-FD>       <UP-10000-FD>     ----TotalRate----
Pkts/s Max/Rx     :                 0/0                 0/0                   0/0
       Max/Tx     :                 0/0                 0/0                   0/0
MBits/s Rx/Tx     :                 0/0                 0/0                   0/0
Broadcast         :                   0                   0
Multicast         :                   0                   0
  64 Bytes        :                   0                   0
  65-127          :                   0                   0
  128-255         :                   0                   0
  256-511         :                   0                   0
  512-1023        :                   0                   0
  1024-1518       :                   0                   0
Runts/Jumbos      :                 0/0                 0/0
Errors Rx/Tx      :                 0/0                 0/0
Total Rx Pkts     :                   0                   0
      Tx Pkts     :                   0                   0
      Rx MBs      :                   0                   0
      Tx MBs      :                   0                   0
ARP/ICMP Pkts     :                 0/0                 0/0
                  :
Pattern Type      :             abcd...             abcd...
Tx Count/% Rate   :      Forever / 100%      Forever / 100%
PktSize/Tx Burst  :           64 /   32           64 /   32
Src/Dest Port     :         1234 / 5678         1234 / 5678
Pkt Type:VLAN ID  :     IPv4 / TCP:0001     IPv4 / TCP:0001
Dst  IP Address   :         192.168.1.1         192.168.0.1
Src  IP Address   :      192.168.0.1/24      192.168.1.1/24
Dst MAC Address   :   00:00:5E:00:53:1a   00:00:5E:00:53:18
Src MAC Address   :   00:00:5E:00:53:18  00:00:5E:00:53:1a
VendID/PCI Addr   :   8086:1528/01:00.0   8086:1528/01:00.1

-- Pktgen Ver: 3.1.2 (DPDK 16.07.2)  Powered by Intel® DPDK -------------------




Pktgen>

画面上部が、送信・受信パケットの情報。画面の下部にインタラクティブにコマンドを入力するためのプロンプトがあります。ホスト2で、以下を実行して転送をスタートさせます。

# testpmd -- -i --nb-cores=2
(省略)
testpmd> start

そのあと、ホスト1で次のように入力します。これはPort 0から生成したパケットを連続的に送信します。

Pktgen> start 0
start 0

この状態でのパケットは下図のように流れています。testpmdと違って、受信したパケットは再度送信(転送)されません。

04-flow-1.png

数秒経過すると、筆者の環境では画面上部のMbits/s行の表示が次のようになりました。MBits/sの値には、第2回の最後でも述べたEthernet層のプリアンブルやインターフレームギャップも含まれています。ソースではapp/pktgen.hのiBitsTotal()/oBitsTotal()がそれらを計算しています。送信に関しては10Gbpsのほぼラインレートであることが分かります。一方受信は、約9.5Gbpsですので、5%程度パケットがロストしていると考えられます。それでも、第3回の最後で、最大性能が11.5Mppsであったのに対して、この構成では14.2Mpps程度の受信レートになっています。

  Flags:Port      :   ---------------:0   ---------------:1
Link State        :       <UP-10000-FD>       <UP-10000-FD>     ----TotalRate----
(省略)
MBits/s Rx/Tx     :              0/9965              9543/0             9543/9965

パケット送信を中止するには、ホスト1で次のように入力します。

Pktgen> stop 0

双方向送信

前節の構成では、ホスト1ではPort 0からのみパケットが出力されていましたが、Port 0とPort 1の両方からパケットを出力させてみます。

Pktgen> start all

 allは全てのPortを意味します。個別にstart 0とstart 1を入力するより便利です。この時のパケットの流れのイメージを下図に示します。Port 0からの出力を橙、Port 1からの出力を水色にしてあります。

04-flow-2.png

 しばらく経過すると、Mbits/sの値は次の様になりました。

  Flags:Port      :   ---------------:0   ---------------:1
Link State        :       <UP-10000-FD>       <UP-10000-FD>     ----TotalRate----
(省略)
MBits/s Rx/Tx     :           7138/9376           7134/9519           14272/18896

どちらのポートも送信・受信していることが分かります。送信レートはラインレートよりも数%低い値になっています。受信レートも先程より20%程度低下しています。もちろん、両ポートを合計した値(TotalRate)は大きくなっています。

パケットの送信を停止すには次のように入力します。

Pktgen> stop all

次回は、複数のPMDやQueueを用いることで低下した受信レートの向上を試みます。