2009年9月30日

VT6122 の性能(3) - ネットワークスループット測定

スループットを計測するツールは何種類かある。

  • ttcp / nttcp / nuttcp
    ttcp が古のツールでソースは色んなバージョン(1,2)が散見される、SGI の人が改良したのが nttcp (元サイトは http://www.leo.org/~elmar/nttcp/ だったらしいが、既に無くなっている)。nuttcp は、nttcp をベースに改良が続けられたもの。使うならば nuttcp かなぁ。
  • iperf
    Java ベースの GUI 付きがあるので、ベンリかも
  • netperf
    スループット以外にもテスト項目の種類が豊富。ただし、man ページが不完全でなので付属の HTML/PDF を参照する必要がある。
  • SmartBits
    商用でよく使われている奴ですね。

まぁ、スループットの測定ならば iperf を使えば良いが、CPU の負荷状況を見たいので nuttcp を使ってみた。

VIA-EN を含めて以下の3台とHUBを用意し、3台ともhubに直結した。

  • target - VIA-EN12000EG / VIA C7 1.2GHz / DDR2-533 1G / VT6122
  • ref1 - M2NPV-VM / Athlon64X2 2.0GHz / DDR2-667 4GB / Intel Pro/1000PT (外付け)
  • ref2 - M4A78-EM / Athlon X2 5050e 2.6GHz / DDR2-800 8GB / RTL8112
  • hub - Gigabit Hub(GS908M)
また、測定自体は、clock skew を避けるため全て ref1 上で計測した。cpufreq によるクロック周波数変更は全て無効にしMAXにした。 ref2 に関しては ref1 自体の評価にのみ使った。

ref1 ⇔ ref2 間

ref1 / ref2 ともに mtu 1500 に設定して測定した。

# ssh -f ref2 -- "nuttcp -S -1"
# nuttcp -t ref2
 1123.8690 MB /  10.01 sec =  941.3733 Mbps 11 %TX 27 %RX
# ssh -f ref2 -- "nuttcp -S -1"
# nuttcp -r ref2
 1122.3750 MB /  10.00 sec =  941.0966 Mbps 33 %TX 16 %RX
これを表にすると、
スループット
(Mbps)
CPU 利用率
ref1ref2
ref1 ⇒ ref2941.373311 %27 %
ref1 ⇐ ref2941.096616 %33 %
mtu 1500

まぁ、順当に ref1 は送受信ともに約 940Mbps 程度の性能を持っている事が分かる。

target ⇔ ref1 間

target の ドライバ via-velocity/velocityget のそれぞれに対して、mtu 1500 かつモジュールパラメータを設定せずに(ドライバのデフォルト値で)計測した。

velocitygetvia-velocity
スループット
(Mbps)
CPU 利用率スループット
(Mbps)
CPU 利用率
targetref1targetref1
target ⇒ ref1 655.217499 %12 % 340.168127 %9 %
target ⇐ ref1 738.798768 %3 % 514.590042 %2 %
mtu 1500 / モジュールパラメータは全てデフォルト値

熟考

結果を見れば、明らかに velocityget の方が性能が高いように思われるが、ソースを見比べるとモジュールパラメータ DMA_length のデフォルト値が、それぞれのドライバで異なる (velocitygetは6/via-velocityは0)。

DMA_length は、チップ内のバッファとメインメモリの間を転送する DMA の処理サイズを指定するらしく、大きなサイズであれば PCI バスの使用効率が上がるので、スループットに影響しそうである。

なので、DMA_length を 0〜7 に振って再度計測し直してみた。

DMA_lengthvelocitygetvia-velocity
(via-velocity
/velocityget)
スループット
(Mbps)
CPU 利用率スループット
(Mbps)
CPU 利用率
targetref1targetref1
target ⇒ ref1 0 369.505328 %11 % 340.182727 %10 % 0.920643
1 398.938239 %11 % 414.574740 %7 % 1.039195
2 497.400464 %9 % 494.275760 %8 % 0.993717
3 539.035684 %9 % 540.716080 %10 % 1.003117
4 610.574399 %10 % 608.103199 %10 % 0.995952
5 646.153099 %11 % 640.971199 %10 % 0.991980
6 655.484199 %11 % 646.403699 %12 % 0.986146
7 652.173299 %12 % 647.739799 %10 % 0.993201
target ⇐ ref1 0 450.885036 %2 % 502.953242 %2 % 1.115480
1 490.215038 %2 % 580.651856 %2 % 1.184483
2 599.558448 %3 % 642.568463 %2 % 1.071736
3 661.059252 %3 % 685.175374 %3 % 1.036480
4 719.696564 %3 % 709.948283 %3 % 0.986454
5 731.320969 %5 % 710.111380 %3 % 0.970998
6 741.275566 %4 % 709.246580 %3 % 0.956792
7 738.297565 %3 % 710.145982 %3 % 0.961869
mtu 1500 / モジュールパラメータはDMA_length以外はデフォルト値

DMA_length の値を合わせれば、送受信のスループットに関しては velocityget/via-velocity にほとんと差異は無く、強いて言えば velocityget の方が受信に関して 4〜5% 高く、処理が軽い。送信に関しては双方同じ程度に CPU を使い切って頭打ちになっている。VIA C7 では 1Gbps は吐けないのかぁ。。。

まぁ、DMA_length は velocityget のデフォルト値の 6 が推奨値かなぁ。ちなみに、NetBSDでのドライバ vge だと 4 だった。

ただ、DMA_lengthの値でスループットの差異が出るのは VT6122などのPCIベースの場合だけで、PCIe ベースの VT6130 ではどの値でも違いが無かった。。。多分省かれてしまったのでしょう。

さて、velocityget にだけあるっぽい機能を移植していけば、差異が無くなっていくのかなぁ?

MTU 9000 での測定

そういえば、mtu 9000 のスループットも測定をしたかったで Intel Pro/1000PT を外付けしたんだっけなぁ。なので、測定してみた。

velocitygetvia-velocity
スループット
(Mbps)
CPU 利用率スループット
(Mbps)
CPU 利用率
targetref1targetref1
target ⇒ ref1 816.054432 %7 % 816.154130 %7 %
target ⇐ ref1 989.874548 %9 % 944.481346 %8 %
mtu 9000 / DMA_length=6 / それ以外のモジュールパラメータはデフォルト値

受信に関しては、ほぼ 1Gbps を使い切っている!凄し!

追記 (2009/10/06)

今回使ったスループット測定用のスクリプトmeasure_net_throughput.shをバックアップとして上げておく。

0 件のコメント: