現在位置: ホーム / みらくるブログ / #5 DPDKのPMDとQueueの設定 & pktgenで出力内容を可変

#5 DPDKのPMDとQueueの設定 & pktgenで出力内容を可変

これまでの構成を振り返りながら、PMDスレッド数やQueueの構成を変えることで、どのようにスループットが変化するか見てみましょう。pktgenで送信パケットの宛先IPを分散する方法やパケットサイズを変える方法も紹介します。

はじめに

今回は、これまでの振り返りも含めて、パケットを折り返しているホスト2のPMDやQueueの構成を変えながら、スループットがどう変化するか調べてみましょう。

05-testpmd.png

また、前回までは、パケットジェネレータが全力でパケットを出力し、そのときの受信レートを見ていましたが、今回はパケットジェネレータの送信レートを調整して、パケットロスしない(つまり送信レートと受信レートが同じになる)レートを調べてみます。調整する方法は、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 

03-pmd-q1.png

次にQueueは2つのままですが、PMDスレッドを2つにしたケース。構成Q2P2とします。testpmdの起動方法は次のとおりです。

# testpmd -- -i --nb-cores=2

03-pmd2-q1.png

以下は、1つのポートに2つのQueueを用意して、それぞれにPMDスレッドを割り当てたパターンです。これを構成Q4P4とします。testpmdの起動方法は次のとおりです。

# testpmd -- -i --nb-cores=4 --rxq=2 --txq=2

05-pmd4.png

転送を開始すると以下のようなメッセージが出力され、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
                  :
dst.port / inc    :             0/    1           256/    1
     min / max    :             0/  254           256/  510
                  :
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を用いた場合の性能を測定してみます。