現在位置: ホーム / みらくるブログ / #3 PMDスレッドの数を増やす

#3 PMDスレッドの数を増やす

今回は、第2回で構築した対向環境でPMDスレッドの数を増し、どのように性能が変化するか見てみましょう。

前回のPMDスレッドQueue構成

以下の図は、前回の構成においてQueueとPMDスレッドに注目してデータの流れを示しています。TXQ0とRXQ0は、それぞれ、送信および受信用のQueueです。1つのPMDスレッドが2つのQueueを逐次的にポーリングして、到着したパケットがあれば、他方のPortのTX Queueに転送します。03-pmd-q1.png

この構成で、startコマンドにより転送を行っている間に、別のターミナルでtopコマンドを実行した結果の抜粋を次に示します。testpmdが100%になっています。これは1つのPMDスレッドがずっと動作をしているからです。


  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                       
 3855 root      20   0 16.093g   2028   1564 S 100.0  0.0  55:57.97 testpmd 

PMDスレッドの追加

下記の図のように2つあるRX Queueを2つのPMDスレッドで取得するようにします。1つのPMDスレッドが1つのQueueのパケットの転送に専念できるので、性能の向上が期待できます。

03-pmd2-q1.png

ホスト1、ホスト2とも、pmdtestを以下のオプションで起動します。

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

そして、先程と同様にまずホスト2で転送を行います。

testpmd> start
io packet forwarding - ports=2 - cores=2 - streams=2 - 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=1/Q=0 (socket 0) -> TX P=0/Q=0 (socket 0) peer=02:00:00:00:00:00
(以下省略)

ここで、Logical Core 1およびLogical Core 2ごとに転送ルールが表示されているのが分かります。続いて、ホスト1でも転送を開始します。

testpmd> start tx_first
io packet forwarding - ports=2 - cores=2 - streams=2 - 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=1/Q=0 (socket 0) -> TX P=0/Q=0 (socket 0) peer=02:00:00:00:00:00
(省略)
約10秒経過後
testpmd> stop
Telling cores to stop...
Waiting for lcores to finish...

  ---------------------- Forward statistics for port 0  ----------------------
  RX-packets: 26195576       RX-dropped: 0             RX-total: 26195576
  TX-packets: 26294452       TX-dropped: 0             TX-total: 26294452
  ----------------------------------------------------------------------------

  ---------------------- Forward statistics for port 1  ----------------------
  RX-packets: 26294452       RX-dropped: 0             RX-total: 26294452
  TX-packets: 26195576       TX-dropped: 0             TX-total: 26195576
  ----------------------------------------------------------------------------
(以下省略)

 結果は、PMDスレッドを2つ使ったのにもかかわらず、前回の構成(PMDスレッドが1つ)とほぼ同じです。実はまだ転送の余力があるのです。ホスト1でtx_firstの後ろにさらにオプション2をつけて実行してみます。

testpmd> start tx_first 2
(省略)
約10秒経過後
testpmd> stop
Telling cores to stop...
Waiting for lcores to finish...

  ---------------------- Forward statistics for port 0  ----------------------
  RX-packets: 48739146       RX-dropped: 0             RX-total: 48739146
  TX-packets: 49059442       TX-dropped: 0             TX-total: 49059442
  ----------------------------------------------------------------------------

  ---------------------- Forward statistics for port 1  ----------------------
  RX-packets: 49059442       RX-dropped: 0             RX-total: 49059442
  TX-packets: 48739146       TX-dropped: 0             TX-total: 48739146
  ----------------------------------------------------------------------------

先程の2倍近い値になりました。追加したオプションは最初に送信するパケット群の数 (burst_num) を設定します。循環的に転送されているパケットの数が増えたため、単位時間あたりのパケット転送数が増加しました。もちろん、性能限界はありますので、そこに近づくまでこのオプションを変えながら約10秒間での転送パケット数を測定しました。その結果を下のグラフに示します。おおよそ11.5Mppsぐらいで上限に達していることが分かります。
 03-charts.png

 今回は、PMDスレッドの数を増やして性能が向上することを確認しました。次回は、testpmdの代わりにパケットジェネレータを使って、いろいろなパターンのパケットを入力できるようにしてみます。