#5 DPDKのPMDとQueueの設定 & pktgenで出力内容を可変
はじめに
今回は、これまでの振り返りも含めて、パケットを折り返しているホスト2のPMDやQueueの構成を変えながら、スループットがどう変化するか調べてみましょう。
また、前回までは、パケットジェネレータが全力でパケットを出力し、そのときの受信レートを見ていましたが、今回はパケットジェネレータの送信レートを調整して、パケットロスしない(つまり送信レートと受信レートが同じになる)レートを調べてみます。調整する方法は、pktgenのコマンドラインから次のように入力します。
Pktgen> set all rate 80
ここで2番目のallはPort番号です。allの代わりに0とか1を個別に指定することもできます。4番目の引数は、レートのパーセンテージです。上記の例では80%で出力することを意味します。以下は、上記のように80%を指定した時の筆者の環境の表示です。
| 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----
(省略)
MBits/s Rx/Tx : 7563/7670 7670/7563 15233/15233
この状態では、送信と受信のレートが同じであることがわります。出力を81%に変更すると下記のように、送信よりも受信レートが小さい状態になりました。この場合、スループットは上記の15.2Gbpsとして進めていきます。
MBits/s Rx/Tx : 7733/7769 7768/7735 15501/15504
構成
ホスト2で次のような構成でのスループットを改めて調べます。これを構成Q2P1とします。pmdtestの起動方法は次のようにシンプルです。
# testpmd -- -i
次にQueueは2つのままですが、PMDスレッドを2つにしたケース。構成Q2P2とします。testpmdの起動方法は次のとおりです。
# testpmd -- -i --nb-cores=2
以下は、1つのポートに2つのQueueを用意して、それぞれにPMDスレッドを割り当てたパターンです。これを構成Q4P4とします。testpmdの起動方法は次のとおりです。
# testpmd -- -i --nb-cores=4 --rxq=2 --txq=2
転送を開始すると以下のようなメッセージが出力され、QueueとLogical Core(PMDスレッド)の対応関係が上記の図と同じになっていることが分かります。
testpmd> start
io packet forwarding - ports=2 - cores=4 - streams=4 - NUMA support disabled, MP over anonymous pages disabled
Logical Core 1 (socket 0) forwards packets on 1 streams:
RX P=0/Q=0 (socket 0) -> TX P=1/Q=0 (socket 0) peer=02:00:00:00:00:01
Logical Core 2 (socket 0) forwards packets on 1 streams:
RX P=0/Q=1 (socket 0) -> TX P=1/Q=1 (socket 0) peer=02:00:00:00:00:01
Logical Core 3 (socket 0) forwards packets on 1 streams:
RX P=1/Q=0 (socket 0) -> TX P=0/Q=0 (socket 0) peer=02:00:00:00:00:00
Logical Core 4 (socket 0) forwards packets on 1 streams:
RX P=1/Q=1 (socket 0) -> TX P=0/Q=1 (socket 0) peer=02:00:00:00:00:00
宛先IPアドレスの分散
実は、構成Q4P4のようにNICに複数のQueueを作った際、受信パケットがどのQueueに振り分けられるかはそのHash値で決められます(参考)。そのため、パケットの内容を逐次変更する必要があります。pktgenには、宛先IPや送信元IP、宛先ポートなどをパケット毎に変化させる機能があります。今回は、以下のようにしてこの機能を有効にして検証しました。
Pktgen> range all on
どのパラメータがどのような範囲で変化するかを確かめるには、pktgenのコマンドラインで次のように入力します。
Pktgen> page range
すると、画面上部が次のように変わります。
\ Ports 0-1 of 2 <Range Page> Copyright (c) <2010-2016>, Intel Corporation
Port # Port-0 Port-1
dst.ip : 192.168.1.1 192.168.2.1
inc : 0.0.0.1 0.0.0.1
min : 192.168.1.1 192.168.2.1
max : 192.168.1.254 192.168.2.254
:
src.ip : 192.168.0.1 192.168.1.1
inc : 0.0.0.0 0.0.0.0
min : 192.168.0.1 192.168.1.1
max : 192.168.0.254 192.168.1.254
:
ip_proto : TCP TCP
:
proxyLoc(dst).port / inc : 0/ 1 256/ 1
min / max : 0/ 254 256/ 510
:
proxyLoc(src).port / inc : 0/ 1 256/ 1
min / max : 0/ 254 256/ 510
:
vlan.id / inc : 1/ 0 1/ 0
min / max : 1/4095 1/4095
:
pkt.size / inc : 64/ 0 64/ 0
min / max : 64/1518 64/1518
:
dst.mac : 00:00:5E:00:53:1a 00:00:5E:00:53:18
inc : 00:00:00:00:00:00 00:00:00:00:00:00
min : 00:00:00:00:00:00 00:00:00:00:00:00
max : 00:00:00:00:00:00 00:00:00:00:00:00
:
src.mac : 00:00:5E:00:53:18 00:00:5E:00:53:1a
inc : 00:00:00:00:00:00 00:00:00:00:00:00
min : 00:00:00:00:00:00 00:00:00:00:00:00
max : 00:00:00:00:00:00 00:00:00:00:00:00
:
gtpu.teid / inc : 0/ 0 0/ 0
min / max : 0/ 0 0/ 0
-- Pktgen Ver: 3.1.2 (DPDK 16.07.2) Powered by Intel® DPDK -------------------
minとmaxが変化の範囲、incが変化量で、0の場合、変化しません。デフォルトでは、宛先IPアドレスとポート、送信元ポートが1つづつインクリメントされます。これらは変更することもできますが、今回はこのまま使用します。
元の画面に戻るには次のように入力します。
Pktgen> page main
パケットサイズ変更
また、パケットサイズもいくつか変更してみます。この方法はレンジモードが有効な場合とそうでない場合で、方法が異なります。今回のようにrangeモードが有効な場合、例えば、パケットサイズを128バイトにするには次のようにします。
Pktgen> pkt.size start all 128
rangeモードを使っていない場合、次のようにします。
Pktgen> set all size 64
測定結果
以下に2つのポートのスループット測定結果の合計を示します。値の単位はGbpsです。
パケットサイズ | 64B | 128B | 256B |
2Q1P | 15.2 | 19.4 | 20.0 |
2Q2P | 15.5 | 19.4 | 20.0 |
4Q4P | 15.5 | 19.4 | 20.0 |
今回の環境では、PMDスレッドとQueueを増やすことでの大幅な改善は見られませんでした。今回の環境(マザーボード・チップセットやPCI Expressのツリー構造)では、PCI Expressの転送が飽和しているのかもしれません。今後、機種等を換えたり、40Gbps NICを用いて評価したいと考えています。また、パケットサイズが256バイトで、ラインレートに達しました。
次回は、testpmdの代わりにLinuxのBridgeを用いた場合の性能を測定してみます。