GbEクラスタのnttcp計測結果
GbEクラスタでnttcpを使用して通信性能を計測した.nttcpのバージョンは1.47である.
この記事での計測では,特に断らない限りオプションには常に
-n 102400 -f "%9b %8.2rt %12.2ct %12.4rbr %12.4cbr %12c %12.2rcr %12.2ccr"と付けているが,表では省略する.また,GbEハブは特に断らないかぎりPLANEX-8Pで,100BASE-TXのネットワークのハブはNETGEAR-8Pである.
この記事での機器の略称一覧表.
| NIC/HUB | 略称 | 名称 |
|---|---|---|
| NIC | 3COM | 3Com 10/100 Managed NIC 3C905CX-TX-M |
| NIC | MELCO-32B | メルコ LGY-PCI32-GT |
| NIC | MELCO-32 | メルコ LCI-G1000T32 |
| NIC | MELCO-64 | メルコ LCI-G1000T64 |
| HUB | MELCO-8P | メルコ LSW-GT-8W |
| HUB | PLANEX-8P | PLANEX FXG-08TE |
| HUB | NETGEAR-8P | NETGEAR FS2108 |
まずはチューニングなしで計測してみた.実時間で計算したバンド幅を以下に示す.
データ
このグラフは,縦軸に実時間に基づくバンド幅をとっている.各棒は左から順に
このグラフは,縦軸にCPU時間に基づくバンド幅をとっている.各棒は先程と同様.MELCO-32の3COMに対する優位性が,CPU時間ではかなり薄れている.また,送信側であるlocalにおいては3COMの方が良い値が出ている.そこで送受信を逆にしてみた.まず実時間のバンド幅.
このグラフは,縦軸に実時間に基づくバンド幅をとっている.-rオプションをつけたので,各棒は左から順に
このグラフは,縦軸にCPU時間に基づくバンド幅をとっている.-rオプションをつけたので各棒は先程と同様.やはり送信側であるremoteで3COMの方がCPU時間でみた場合の方が良い値が出ている.3COMはWrite時のCPU負荷が極端に低いということになる.
- 3COM クライアント側
- MELCO-32 クライアント側
- 3COM サーバ側
- MELCO-32 サーバ側
- 3COM サーバ側
- MELCO-32 サーバ側
- 3COM クライアント側
- MELCO-32 クライアント側
先の計測ではMTUはデフォルトの1500だった.これはファーストイーサネットでよく設定される値である.GbEではこの値は最適ではないらしい.そこで,MTUを変更して計測してみたい.以下の様に設定できる(ハズ).
ifconfig eth1 4000でもなぜか
SIOCSIFMTU: Invalid argumentと出る.犯人は
- drivers/net/net_init.c
- カーネルソース(eth_change_mtu)
- tc902x.c,tc902x_tune.h
- MELCO-32のドライバソース(TC902X_MAX_RXFRAME_SIZE)
MTUはなんだか往生しているので,バッファ長を変えてみた.
データ
なんかひどく見にくい模様のグラフだが,それに気づいただけよしとするか.このグラフは縦軸に実時間にもとづくバンド幅をとっている.各棒はバッファ長(-lオプションの値)が10240バイト,20480バイト,40960バイトの3本1組となっていて,左から順に
- 3COM クライアント側
- MELCO-32 クライアント側
- 3COM サーバ側
- MELCO-32 サーバ側
なんだか値が改善されないが,どんどんやってみる.送受信バッファサイズを変えてみる.
データ
このグラフは縦軸に実時間にもとづくバンド幅をとっている.変化を強調するため,90Mbpsから開始してるので注意.横軸は送受信バッファサイズ(バイト)である.送受信バッファを8バイトから128バイトまで大きくしていくと大きくバンド幅が改善された.この変化は3COMよりもMELCO-32の方が改善幅が大きい.ただし送受信バッファを128バイト以上に増やしてもさほど改善されない.
なんだか大きな効果が現れないギガビットイーサネットだが,くじけずに計測をつづける.今度はあるノードで
両実験の結果グラフを以下に示す.
ここでようやくGbEの大きな効果が得られた.このグラフは,縦軸に実時間にもとづくバンド幅をとっている.各棒は赤色が3COMで青色がMELCO-32である.左からそれぞれ1対1,1対2,1対3でバンド幅を計測したものである.A,B,Cはそれぞれnttcpを実行したクライアントノードである.念のため各棒の説明を左から順に示す.
nttcp -iしておいて,別の複数のマシンからnttcpしてみるとどうなるかを計測してみた.まずノードDで
nttcp -iしておいて,ノードA,Bから同時に
nttcp Dとしてみた.データ.続いてノードA,B,Cから同時に
nttcp Dとしてみた.データ
両実験の結果グラフを以下に示す.
- 1対1(サーバ対クライアント)で計測.3COM.クライアントA.
- 1対1で計測.MELCO-32.クライアントA.
- 1対2で計測.3COM.クライアントA.
- 1対2で計測.3COM.クライアントB.
- 1対2で計測.MELCO-32.クライアントA.
- 1対2で計測.MELCO-32.クライアントB.
- 1対3で計測.3COM.クライアントA.
- 1対3で計測.3COM.クライアントB.
- 1対3で計測.3COM.クライアントC.
- 1対3で計測.MELCO-32.クライアントA.
- 1対3で計測.MELCO-32.クライアントB.
- 1対3で計測.MELCO-32.クライアントC.
次に二組のnttcpを同時に実行してみる.すなわちノードC,Dで
両実験の結果グラフを以下に示す.
このグラフは縦軸に実時間にもとづくバンド幅をとっている.各棒は左から順に
nttcp -iとし,ノードAで
nttcp C同時にノードBで
nttcp Dとする.データ
両実験の結果グラフを以下に示す.
- 1対1通信1組.3COM.クライアントA.
- 1対1通信1組.MELCO-32.クライアントA.
- 1対1通信2組.3COM.クライアントA.
- 1対1通信2組.3COM.クライアントB.
- 1対1通信2組.MELCO-32.クライアントA.
- 1対1通信2組.MELCO-32.クライアントB.
- 不満の残るバンド幅
- MELCO-32のバンド幅は3COMの1.7倍だった.10倍には遠く及ばない.
- MTU
- 上を受けてMTUのチューニングをしたかったが,そもそもMELCO-32はJumbo Framesに対応していないようだ.すくなくともメルコ配布のドライバではMTUを1500以上に設定出来ないようにしている.Jumbo Frames対応のギガビNIC導入効果に興味がわく.
- バンド幅とCPU負荷か
- MELCO-32は3COMより実時間に基づくバンド幅は大きかったが,CPU負荷が高くCPU時間に基づくバンド幅が小さい.とくにWrite性能では3COMよりも劣る.
- 同時通信
- MELCO-32では一ノードに対して二ノードからnttcpをかけてもバンド幅の劣化がない.これはデュアルプロセッサで一ノードあたり2プロセス走ることが多いであろう本システムにとっては効果が大きいと考えられる.また,同時通信することによって,ハードウェア性能としては,MELCO-32のバンド幅は最低でも422Mbpsはあることが分かった.
- PLANEX-8Pの性能
- PLANEX-8Pでは1対1通信を同時に二組行なってもボトルネックとならないことがわかった.8ポート全部を使用するとどうなるのかも検証したい.
- 送受信バッファ
- 送受信バッファのチューニングによって,MELCO-32は3COMよりもバンド幅が改善された.
計測用BASHスクリプト.
#!/bin/sh
ETH=
GETH=
FORMAT="%12b%12.2rt%12.2ct%12.4rbr%12.4cbr%12c%12.2rcr%12.2ccr"
N=102400
OPTION=-r
if [ "$ETH" = "" -o "$GETH" = "" -o "$FORMAT" = "" -o "$N" = "" -o "$OPTION" = "" ]
then
exit 0
fi
function setRemote(){
if [ "$1" = "3COM" ]
then
REMOTE=$ETH
else
REMOTE=$GETH
fi
}
function execute(){
TEMPFILE=$(tempfile)
echo $OPTION > $TEMPFILE
OUTPUTFILE=result$(sed -e 's/ /_/g ' $TEMPFILE)-$1
rm $TEMPFILE
setRemote $1
nttcp -f $FORMAT -n $N $OPTION $REMOTE > $OUTPUTFILE
awk -f toHTMLTable $OUTPUTFILE
}
setRemote $1
execute $1
計測用BASHスクリプトから呼ぶawkスクリプト.
/^l/ {print "<tr><td rowspan=\"2\">OPTION</td><td rowspan=\"2\">NIC</td><td>local</td><td>" $2 "</td><td>" $3 "</td><td>" $4 "</td><td>" $5 "</td><td>" $6 "</td><td>" $7 "</td><td>" $8 "</td><td>" $9 "</td></tr>"}
/^1/ {print "<tr><td>remote</td><td>" $2 "</td><td>" $3 "</td><td>" $4 "</td><td>" $5 "</td><td>" $6 "</td><td>" $7 "</td><td>" $8 "</td><td>" $9 "</td></tr>"}

