#3 PMDスレッドの数を増やす
前回のPMDスレッドQueue構成
以下の図は、前回の構成においてQueueとPMDスレッドに注目してデータの流れを示しています。TXQ0とRXQ0は、それぞれ、送信および受信用のQueueです。1つのPMDスレッドが2つのQueueを逐次的にポーリングして、到着したパケットがあれば、他方のPortのTX Queueに転送します。
この構成で、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のパケットの転送に専念できるので、性能の向上が期待できます。
ホスト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ぐらいで上限に達していることが分かります。
今回は、PMDスレッドの数を増やして性能が向上することを確認しました。次回は、testpmdの代わりにパケットジェネレータを使って、いろいろなパターンのパケットを入力できるようにしてみます。