ファイヤープロジェクト
nttcpの紹介
2003-08-15T21:55+09:00   matsu
ベンチマークnttcp(new ttcp)の調査.
nttcpはnew ttcpらしい.ここから入手できる.ネットワーク性能の計測というといろんな雑誌などでftpを使用していたりするが,以下の理由によりnttcpで計測することにした.
  • MPIによる並列計算ではftpを使用しない.
  • ディスクアクセスされても困る.
  • 複数のホストとの同時通信性能を計測したい.
何が計測できるかわかっていないと計測しても意味がない.ので,調べてみた.
  • tcp,udp,udp マルチキャストでの通信レートを計測できる.
  • 通信だから当然相手が必要なので,リモートマシンでまずnttcpを起動してローカルマシンでnttcpを実行するときにそのリモートマシンを指定して計測する.リモートマシンは同時に複数指定可能.これで1対多通信の計測ができるだろうか.
  • デフォルトでは4KB長のバッファを2048個分通信する(全部で8MB)
  • ローカルマシンとリモートマシンの両方のパフォーマンスを計測し,ローカルマシンで表示する.
  • 使用ポート
    tcp5037リクエストなどをやりとり
    tcp/udp5038実際のデータのやりとり
nttcpもやはりたくさんのコマンドオプションがある.オプションから何が計測できるか分かったりもするハズ.
-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は通信開始時と終了時から計算される.
出力のフォーマットは-fで変更できる.フォーマットはprintfのパラメータのように指定できる.タグを以下に示す.
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
と出た.ダメらしい.
matsu(C)
Since 2002
Mail to matsu