nttcpの紹介
ベンチマークnttcp(new ttcp)の調査.
nttcpはnew ttcpらしい.ここから入手できる.ネットワーク性能の計測というといろんな雑誌などでftpを使用していたりするが,以下の理由によりnttcpで計測することにした.
- MPIによる並列計算ではftpを使用しない.
- ディスクアクセスされても困る.
- 複数のホストとの同時通信性能を計測したい.
何が計測できるかわかっていないと計測しても意味がない.ので,調べてみた.
- tcp,udp,udp マルチキャストでの通信レートを計測できる.
- 通信だから当然相手が必要なので,リモートマシンでまずnttcpを起動してローカルマシンでnttcpを実行するときにそのリモートマシンを指定して計測する.リモートマシンは同時に複数指定可能.これで1対多通信の計測ができるだろうか.
- デフォルトでは4KB長のバッファを2048個分通信する(全部で8MB)
- ローカルマシンとリモートマシンの両方のパフォーマンスを計測し,ローカルマシンで表示する.
- 使用ポート
tcp 5037 リクエストなどをやりとり tcp/udp 5038 実際のデータのやりとり
- -r
- リモートからローカルにデータを送信しろ.
- -t
- ローカルからリモートにデータを送信しろ(デフォルト).
- -T
- タイトルを表示.タイトルって何?
- -u
- tcpの代わりにudpで通信しろ.(デフォルトはtcp)
- -g
- パケット同士のギャップ時間(マイクロ秒).この遅延はselect関数のパラメータとgettimeofday関数によるループで実装される.大抵のマシンではこの遅延は正確ではない.tcpではただwriteシステムコールの遅延でしかなく,物理デバイスの遅延ではない.
- -v
- 冗長出力.デバッグ用.
- -D
- TCP_NODELAYオプションをセットする.こうするとsocketは全てのリクエストをバッファリングしない.
- -f format string
- 出力フォーマットの指定.詳細は出力編で.
- -n number of buffers
- バッファの数.デフォルトは2048.
- -l length of buffer
- 各バッファの長さ.デフォルトは4096.
- -w number of kilo bytes
- 送受信のバッファサイズ.デフォルトはシステム依存だがたいてい16K.
- -c
- 受信データと送信データを比較してチェックする.最初の100個までの違いをレポートする.tcpのときは全ての通信にユニークなパターンを生成する.udpのときは全ての通信に共通のパターンを使用する.-sオプションでそれらのパターンを指定できるが,1パケットでもロスすると,全てのパケットが予期しないパターンを含むことになり,異なるパターンとしてレポートされる.すべてのバイトは番号付けされていているので,最初にロスするパケットを調べることができる.注意:udp通信においてパケットに誤りがあると,パケットロスやパフォーマンス劣化を引き起こす.出力を簡単にしたりするのにCPU負荷がかかるからである.
- -s
- -c参照
- -S seed string
- -cを指定したときに生成するユニークなパターンのseedを指定する.デフォルトは This is a simple init string .
- -pport number
- リモートホストの待ち受けポートの指定.デフォルトは5037.
- -i
- リモートホストにおいてnttcpをroot以外で実行したかったりinetdを使わずに実行したいときにdaemonのように起動させる.
- -Rnumber of getpid() calls
- データの送受信をしない.マシンとシステムコールの処理速度(というかオーバーヘッドか?)を計測するのに使う.
- -mmulticast IP:port
- マルチキャスト通信を行なう.-uと-tを同時に指定する必要がある.
出力の見方がわからなくては計測してもどうにもならない.ので,調べてみた.出力は大抵2行で,マルチキャストのときはもっとある.2行の出力のときは,1行目はローカルホストの計測値.2行目はリモートホストの計測値.行の始めにlとかrとか書いてある.出力フォーマットはデフォルトでは以下のようになる.
Bytes Real s CPU s Real-MBit/s CPU-MBit/s Calls Real-C/s CPU-C/s l 8388608 7.51 0.25 8.7307 259.8676 2048 272.83 8120.86 r 8388608 7.55 0.95 8.6804 68.9853 3831 507.42 4032.63
- CPUで始まるのはシステム時間とユーザ時間の和である.
- Realは通信開始時と終了時から計算される.
- l
- バッファの長さをバイトで表示.整数.
- n
- バッファ数を表示.整数.
- c
- 呼び出し数を表示.整数.
- rt
- realな時間を表示.float.
- rbr
- realなMbps.float.
- rcr
- realな呼び出し/s.float.
- ct
- cpu時間.float.
- cbr
- cpu時間でのMbps.float.
- ccr
- cpu時間での呼び出し/s.float.
"%9b%8.2rt%8.2ct%12.4rbr%12.4cbr%8c%10.2rcr%10.2ccr"
最後にインストール方法を書いておく.まずここからソースを入手する.今回はnttcp-1.47.tar.gzをとってきた.展開してMakefileを編集.Makefileの冒頭はいろんなOS用に設定が書いてあるのでLinux用以外を全部コメントアウト(実際にはFreeBSD用の設定が有効になっていたのでこれをコメントアウトした).そしてLinux用の設定をする.今回のシステムでは次の様にした(というか#を取っただけ).
## For Linux with gcc ARCH= LIB= OPT= -O2 CC= gcc DBG= INC=さらに一般ユーザでインストールしたい気分だったのでprefixを変更.
prefix= /home/USERNAME/usr/local/nttcp-$(VERSION)そして
make make installあと.bashrcに
export MANPATH=$MANPATH:/home/USERNAME/usr/local/nttcp-1.47/man/ export PATH=$PATH:/home/USERNAME/usr/local/nttcp-1.47/bin/と書いてみた.
まずリモートホストでnttcpを実行.
最後に
$nttcp -i & $netstat -a | grep 5037 tcp 0 0 *:5037 *:* LISTENなんか起動してるっぽい.で,ローカルでリモートホストを指定してnttcpを実行.
nttcp REMOTEHOST l 8388608 0.71 0.02 95.0988 3355.4432 2048 2902.19 102400.0 1 8388608 0.71 0.08 94.1287 838.8608 5795 8128.22 72437.5なんかマニュアルとは違ってリモートホストはrでなく1ってでる.1ということは2,3,4...と続くと思うのが人情.で,複数のリモートホストを指定して実行.
nttcp REMOTEHOST1 REMOTEHOST2 REMOTEHOST3 nttcp-l: receiving side REMOTEHOST1 couldn't get multicast socketなんかダメな様だ(そんな気はしていた).結局複数のホストを指定するのはudpマルチキャストじゃないとダメなようだ.結局複数のnttcpを一斉に起動することになるのか.....冷静に考えるとMPIで1対多通信をするときはスレッドで一斉に通信したりしているのだろうか.逐次にやっているのなら一斉に起動して計測する意味は薄れるか.あ,でも1対1を二組同時にやるのは面白いかもしれない.
最後に
dsh -a 'nttcp REMOTEHOST'としてみたらREMOTEHOST: nttcp-0: nttcp: fgets: cannot read stdinと出た.ダメらしい.

