Windowsのttcpコマンドでネットワークパフォーマンスを測定する:Tech TIPS
ネットワークの性能(パフォーマンス)を正確に測定するには、ディスクI/Oなど、ネットワーク以外の影響を受けないようにする必要がある。それにはttcpというネットワークのパフォーマンステスト用のコマンドが手軽で便利だ。
対象OS:Windows XP Home Edition / Windows XP Professional / Windows Server 2003
解説
システムに対する投資が適切なものかどうかを判断したり、ネットワークがボトルネックになって、システム全体の処理能力が損なわれていないかどうかを判断したりするために、ネットワークのパフォーマンスを測定したいということがある。ネットワークのパフォーマンス(ここでは単純に「単位時間当たりの最大転送速度」の意味とする)を測定するには、大量のパケットを送受信してみて、単位時間当たりに送受信できたbytes数を計算するのが一般的である。具体的には、巨大なデータを取り扱うアプリケーションを実行して、そのロードや保存の時間を測定したり、FTPやファイル共有サービスを使って大きなファイルを読み書きし、その時間を測定したりする。
だがこのような測定方法では、ネットワークの性能だけではなく、ディスクI/Oの性能(ディスクデバイスそのものの性能だけでなく、ディスクインタフェースやデバイスドライバなどにも影響を受ける)や、OSのファイルシステムの性能などにも大きく影響を受けてしまう。これらの影響を排除し、ネットワークインタフェースやネットワーク回線の性能だけを測定するには、単に通信パケットを送受信するだけの単純な測定プログラムを使ったり、なるべくディスク入出力が起こらないような仕組みを使って、速度を測定したりするべきである。
ここでは、手軽なネットワークのパフォーマンス測定の方法として、ttcp.exeを使った方法を紹介する。
●ttcp.exeとは?
ttcp.exeコマンドは、コマンドプロンプト上で利用する、ネットワークのパフォーマンス測定用の小さなプログラムである。もともとはUNIX上で使われていたツールであるようだが(「test tcp」の略らしい)、現在ではWindows XPやWindows Server 2003用にも提供されている(Windows NTや2000向けはないようだ)。といっても、OSを通常どおりにインストールしただけではこのコマンドは利用できない。WindowsのインストールCD-ROMの\VALUEADD\MSFT\NET\TOOLSというフォルダにTTCP.EXEというファイルがあるので、これをWindowsのシステムディレクトリ(C:\Windows\System32など)にコピーしておけばよい。
なお、メーカーのプリインストールマシンで、OSのインストール用のCD-ROMが付属していない場合は、Windows XPのService Pack 1のCD-ROMなどにも同じものが含まれているので、そのフォルダからコピーして利用すればよい。Windows XPのService Pack 1は、MS-Blasterワームなどの対策として有償/無償で配布されている「Windows XPセキュリティ対策CD-ROM」に含まれている(詳細についてはこちらを参照。現在出荷中のWindows XPは全てSP1a適用済みであり、単独のWindows XP SP1のCD-ROMの提供は既に終了している)。
●ttcpコマンドを使ってパフォーマンスを測定する
ttcpでは、2台のコンピュータ上でTCPもしくはUDPプロトコルを使って通信路を開き(TCPだけでなく、UDPでも速度を測定することができる)、一方的にパケットを送信して、そのパフォーマンス(単位時間当たりに送信/受信できたbytes数)を表示する。片方向にしか通信しないので、必要ならば向きを変えて実行する必要がある。TCPでは、信頼性のある確実な通信が期待できるが、受信確認などのためにパフォーマンスなどが(少しではあるが)劣る可能性がある(特に100Mbit/sやそれを超える高速なネットワークの場合)。UDPでは、信頼性はないが(「信頼性がない」の意味については、連載「基礎から学ぶWindowsネットワーク 第13回―データグラム通信を実現するUDPプロトコル」を参照のこと)、オーバーヘッドの少ない、より高速な通信が行える可能性がある。
これらを参考に利用しているアプリケーションや環境、測定目的などに応じて、適切な測定手段を検討し、実行していただきたい。
また、単にネットワークの転送速度を見るだけでなく、同時にタスクマネージャやパフォーマンスモニタを使って、システムのどこがボトルネックになっているのかなども観測すると、より有効に活用できるだろう。
操作方法
●ttcpコマンドの使い方
ttcpを引数なしで起動すると、次のように使い方のメッセージが表示される。
C:\>ttcp
Usage: ttcp -t [-options] host [ < in ]
ttcp -r [-options > out]
Common options:
-l## length of bufs read from or written to network (default 8192)
-u use UDP instead of TCP
-p## port number to send to or listen at (default 5001)
-P4 use IPv4
-P6 use IPv6
-s -t: don't source a pattern to network, get data from stdin
-r: don't sink (discard), print data on stdout
-A align the start of buffers to this modulus (default 16384)
-O start buffers at this offset from the modulus (default 0)
-v verbose: print more statistics
-d set SO_DEBUG socket option
-h set SO_SNDBUF or SO_RCVBUF
-a use asynchronous I/O calls
-S## specify source address
-H## specify TTL or hop limit
Options specific to -t:
-n## number of source bufs written to network (default 2048)
-D don't buffer TCP writes (sets TCP_NODELAY socket option)
-w## milliseconds of delay before each write
-f## specify a file name for TransmitFile
Options specific to -r:
-B for -s, only output full blocks as specified by -l (for TAR)
-j##[/##] specify multicast group and optional ifindex (UDP-only)
ttcpでは、IPv4だけでなく、IPv6でも利用できるし、さまざまなオプションを使って通信の方法(送受信時のブロックサイズやWinSockオプションなど)を制御することができる。ここでは一番簡単な方法についてだけ述べておこう。
ttcpを利用するには、2台のマシン上でttcpを起動する必要がある。この場合は、先に起動する方は「受信モード」で、後から起動する方は「送信モード」となる。デフォルトでは、TCPでテストを行うが、UDPでテストしたい場合は、いずれも「-u」オプションを付けておく必要がある(プロトコルが異なるとテストできない。使用するポート番号はいずれも5001番がデフォルト)。送信するサイズの指定(何bytesのテストデータを何回書き込むかなど)は、後から起動する送信側で指定する。
●受信側の設定
先に起動する受信側は、次のようなコマンドを実行する。「-r」は受信(receive)の略である。
C:\>ttcp -r
●送信側の設定
送信側では、送信オプション「-t」と送信相手を指定する。すると、すぐにテストが始まり、終了するとその結果が表示される。デフォルトでは、TCPプロトコルを使って、8192bytesのデータを2048回(つまり合計16MB)送信する。そして、送信にかかった時間から、1秒あたりの送信bytes数などの情報を表示する。
C:\>ttcp -t pc
ttcp-t: pc -> 192.168.0.103
ttcp-t: local 192.168.0.56 -> remote 192.168.0.103
ttcp-t: buflen=8192, nbuf=2048, align=16384/+0, port=5001 tcp -> pc
ttcp-t: done sending, nbuf = -1
ttcp-t: 16777216 bytes in 1664 real milliseconds = 9846 KB/sec
ttcp-t: 2048 I/O calls, msec/call = 0, calls/sec = 1230, bytes/call = 8192
この例では、16MBを1.664秒で送信したので、9846KB/sという結果が表示されている。同時に、次に示すように受信側でも同じような表示が行われ、プログラムが終了している。
C:\>ttcp -r
ttcp-r: local 192.168.0.103 <- remote 192.168.0.56
ttcp-r: buflen=8192, nbuf=2048, align=16384/+0, port=5001 tcp
ttcp-r: 16777216 bytes in 1664 real milliseconds = 9846 KB/sec
ttcp-r: 2155 I/O calls, msec/call = 0, calls/sec = 1295, bytes/call = 7785
UDPプロトコルを使う場合は、「-u」を付けて、「ttcp -r -u」「ttcp -t -u pc」のようにする。
より高速なネットワークの場合は、繰り返し回数を増やしてもっと長時間にわたって測定したり、逆に低速なWANやVPN回線の場合は、より少ないデータ量にして測定したりと、いろいろ試していただきたい。例えば送信回数をデフォルトの2048回から8192回にするには、送信側を「ttcp -t -n8192 pc」などとする(受信側は変更なし)。
■この記事と関連性の高い別の記事
- ftpでネットワークの速度を測定する(TIPS)
- 巨大なサイズのファイルを簡単に作る方法(TIPS)
- pingでネットワークの速度を調査する(TIPS)
- Windows 7のエクスペリエンス・インデックス(WEI)でPC利用の「快適度」を測る(TIPS)
- pingを繰り返し実行させる(TIPS)
Copyright© Digital Advantage Corp. All Rights Reserved.