#4 DPDKベースのパケットジェネレータ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
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と違って、受信したパケットは再度送信(転送)されません。
数秒経過すると、筆者の環境では画面上部の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からの出力を水色にしてあります。
しばらく経過すると、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を用いることで低下した受信レートの向上を試みます。