netperfでネットワーク性能測定

unixbenchに続いてnetperfで性能測定。
使ったnetperfは2.4.5。これが以外にはまった。

sakuraのVPS(CentOS5.5)上に

$ wget ftp://ftp.netperf.org/netperf/netperf-2.4.5.tar.gz
$ cp netperf-2.4.5.tar.gz /usr/local/src
$ cd /usr/local/src
$ tar xvzf netperf-2.4.5.tar.gz
$ cd netperf-2.4.5
$ ./configure
$ make
$ make install  

をインストール。その後、以下を実行。

$ /usr/local/bin/netserver

OK。クライアント側でも同様の設定を実行。
クライアントから

$ netperf -H XX.YY.ZZ.WW
netperf: send_tcp_stream: data socket connect failed: No route to host

エラーが出る。これが色々と手ごわかった。

straceやtcpdumpを利用して検証したところ、最初12865ポートで接続しているのに途中から
ポート番号が変更になることが判明。

???

他のインストールしているサイトを見るとポート12865さえあけておけばOK、みたいな
ことが書かれているのにTimeoutやらNo route to hostで通信に失敗する。
ファイアウォールをOFFにすれば計測できることからファイアウォールが原因なのは間違いなかった。

悩みに悩んだところ、ようやく以下の記事を発見。

http://www.netperf.org/pipermail/netperf-talk/2010-August/000758.html

どうやらControl ConnectionとData Connectionが別で2つ通信用ポートが必要みたい。
最初Control Connection(12865)でサーバから接続に関する情報を受け取る。
DataConnectionでは、Control Connectionで通知された新しいポート番号でサーバに接続する。

つまり、

   Client             Server
      ------             ------
      XXXXX      →      12865       
      XXXXX      ←      12865       //ここでServerのData Connectionのポートが通知される。
               ・・・
   ※上記がControl Connection。
   ※Control Connectionで通知された新しいポート番号でDataConnectionとして接続を行う。

   YYYYY      →      12866       //任意の番号をセット可能。12866を設定したものとする。
   YYYYY      ←      12866       
   YYYYY      →      12866       
   YYYYY      ←      12866       
      
      XXXXXやYYYYYはクライアントの任意のポート番号を表す。

のような動きになる。
上記の動きをさせるためには、netperf側(クライアント側)で以下のコマンドを実行すること。

$ netperf -H XX.YY.ZZ.WW -p 12865 -- -P 12866
※ "--"はGlobal Command Optionと test-specific Optionを区別するためのセパレータ。

Server側では、ファイアウォールの設定で12865と12866の2つポートを受け付けるように設定しておくこと。

    • -

肝心の計測結果。

送信元 送信先 速度(Mbps)
家(CentOS(VM)) Sakura(CentOS(VM)) 4.25
Sakura(CentOS(VM)) 家(CentOS(VM)) 1.9
家(WinXPCygwin) 家(CentOS(VM)) 66.98

家→sakuraの値が小さすぎじゃない?
あってるのかぁ。