ネットワ-クの速度を調べる方法
●「速さ」 の意味は?例: ほぼ、10BASE、100BASEなどの規格に対応すると考えて良い。
例:ファイバの屈折率は約1.5。真空中での光の速度 3x10^8[m/sec] をこれで割ると、ファイバ中の速度は2x10^8[m/sec] となります。
例:この速度では、日本列島の端から端まで(約2000km)を進むのに10ミリ秒(1/100秒)かかります。
例:200km進むのに1ミリ秒(1/1000秒、10^(-3)sec)かかります。
例:200mあたり1マイクロ秒(10^(-6)sec)かかります。これはクロックが1MHzの場合の、1クロック時間に相当します。(構内配線の距離)
例:20cmあたり1ナノ秒(10^(-9) sec)かかります。これはクロックが1GHzの場合の、1クロック時間に相当します。 (機器の内部結線の距離)
経路が複数の要素からなるとき、それらの時間遅れの和が経路全体での時間遅れとなる。
例:ストア&フォワード型のSW HUBを通すと、パケット全体を取り込んでから送り出すので時間遅れがある。(...が距離による遅延と比較して無視できる程度。)しかし、壊れたパケットを通過させてしまう危険は他の方式より少ない。
[データ帯域(bit/s)] = [TCP受信窓サイズ(bit)]/[往復遅延時間(sec)]
変形する。(これを帯域遅延積という)
[TCP受信窓サイズ(bit)] = [データ帯域(bit/s)] [往復遅延時間(sec)]
単位を [TCP受信窓サイズ(Byte)]、[データ帯域(Mb/s)]、[往復遅延時間(msec)] にすると、
[TCP受信窓サイズ(B)] = 125 [データ帯域(Mb/s)] [往復遅延時間(ms)]
この式は、距離が遠い(遅延が大きい)ときには、通信能力は経路のバンド幅とは無関係に距離で決まってしまうと解釈して良い。
転送するデータサイズが大きい場合、TCP受信窓サイズを大きく設定すると、データ帯域を大きくすることができる。実際には、エラーによる再転送の効率低下とのトレードオフがあるが、回線の状況に応じた最適な受信窓サイズがあるはず。
例:伝書鳩の場合、"1回の文書量" は重量による制限があるためほぼ定数と考えて良い。
[帯域幅]=[1回の文書量]/[配送時間]
つまり、相手までの距離(遅延時間))通信能力がきまってしまう。
ここでの評価式はTCP(第4レイヤー、トランスポートレイヤー)の1つの通信に注目した場合に成り立つ。
IP(第3レイヤー、ネットワークレイヤー)やUDPでは、ほぼ、通信経路の物理的なバンド幅で決まる。また、TCPも個々の通信ではなく複数の通信を集団としてみると、経路の物理的なバンド幅で決まる。
GPS時計で高精度に時刻をあわせたマシン間でなら往路と復路を別々に測れそうだ。ミリ秒単位(注:1ミリ秒は距離に換算して 200km 程度)までの測定なら基本レベルの演習問題かな?
GPS clockの同期精度は安直にサーバを作っても数micro秒の精度が出る(距離に換算して数百m)。(ヒント:RFCでNTPのプロトコルを調べる。)(ヒント:ntpのソースを見よう。)
●データ帯域を測る
特定のサーバ間の速度の調査
以下の方法では、FTPサーバに試験用のファイルを作成しておいてgetして所要時間を測定する。前述しているように、遠くのサーバとの間でこれをやると、遅延時間を測定するのと同じ事になる。
回線の先にFTP(または、WWW)サーバが必要。LANの試験なら簡単だが、外部接続ではこれが一番のネックかも。試験用ファイルのサイズに拘らないなら、適当なanonymous FTPサーバ(または、WWWサーバ)から適当なサイズのファイルをダウンロードすると良い。
試験用のファイルを作る
回線能力にあわせて適当なサイズの試験用ファイルを作る。1M、10Mなどの切りの良いサイズなのは、転送時間の見積もりがしやすいからで、特に深い意味は無い。
例えば、1Mbpsの回線の場合、1Mbyteのファイルでは所要時間は最低でも8秒程度。10Mbyteのファイルだと、その10倍だから約80秒かかる。
$ dd bs=1024 count=10 if=/dev/urandom of=test_10K $ dd bs=1024 count=100 if=/dev/urandom of=test_100K $ dd bs=1024 count=1024 if=/dev/urandom of=test_1M $ dd bs=1024 count=10240 if=/dev/urandom of=test_10M $ dd bs=1024 count=102400 if=/dev/urandom of=test_100M $ ls -l test_10M -rw-r--r-- 1 kodama users 10485760 8月 2日 01:34 test_10M test_10M は 10M byte のサイズ
※anonynmousでデータを取得する場合 $ wget -O - ftp://localhost/test_100M > /dev/null --2015-04-16 15:51:27-- ftp://localhost/test_100M => `-' localhost をDNSに問いあわせています... 127.0.0.1 localhost|127.0.0.1|:21 に接続しています... 接続しました。 anonymous としてログインしています... ログインしました! ==> SYST ... 完了しました。 ==> PWD ... 完了しました。 ==> TYPE I ... 完了しました。 ==> CWD は必要ありません。 ==> SIZE test_100M ... 104857600 ==> PASV ... 完了しました。 ==> RETR test_100M ... 完了しました。 長さ: 104857600 (100M) (確証はありません) 100%[==========================================================>] 104、857、600 --.-K/s 時間 0.09s 2015-04-16 15:51:27 (1.03 GB/s) - stdout へ出力しました [104857600] ※あるアカウントでデータを取得する場合 $ wget --ftp-user=hoge --ftp-password=password -O - ftp://localhost/test_10M > /dev/null --2015-04-16 14:22:16-- ftp://localhost/test_10M => `-' localhost をDNSに問いあわせています... 127.0.0.1 localhost|127.0.0.1|:21 に接続しています... 接続しました。 user としてログインしています... ログインしました! ==> SYST ... 完了しました。 ==> PWD ... 完了しました。 ==> TYPE I ... 完了しました。 ==> CWD は必要ありません。 ==> SIZE test_10M ... 10485760 ==> PASV ... 完了しました。 ==> RETR test_10M ... 完了しました。 長さ: 10485760 (10M) (確証はありません) 100%[==========================================================>] 10、485、760 --.-K/s 時間 0.01s 2015-04-16 14:22:16 (1.00 GB/s) - stdout へ出力しました [10485760]
この例では、内的な処理((localhost)だけで、ネットワークは使わないのでこれ(69.44[MB/s]=555[Mb/s])が今回使用したPCで測定できる最高速を表す。最近のCPUなら、内的な処理はもっと速いはず。
実際の測定では上の "localhost" の部分をFTPサーバ名に変えて使う。
スクリプト
スクリプトを作ったが、wgetを直に動かして、2〜3回観察するだけでも良いと思えて来た。
10Mのファイルのダウンロードをn回測定して、速度の平均を表示するスクリプト。wgetの起動時間などの影響で少し誤差が出る。 ネットワークにかなりの負荷がかかる。
#!/bin/sh # Measure network speed。 # Usage: net-speed。sh (resource URL) [iteration] resource=$1 ## e.g. ## ftp://localhost/pub/test_10M ## http://localhost/~test/test_10M count0=$2 if [ -z "$count0" ] ; then count0=3; fi # fill up server cache. wget -O - -q ${resource} > /dev/null LOOP(){ count=0 while [ $count0 -gt $count ]; do count=`expr $count "+" 1` (time wget -O - -q ${resource} > /dev/null)2>&1 done } LOOP | gawk 'END{print "Average: "sum/n}/real/{gsub(/[ms]/、" ");n=n+1;s=10/($2*60+$3);sum=sum+s;print s"[M/sec]"}'
以下では、TCP 通信を基準に回線の品質と使用目的について概説してみた。 ただし、UDP を使ったビデオ配信などを行うなら、以下とは違った観点で評価する必要がある。
注:日本の端から端まで約2000km。
インターネットの個人利用については10Mb程度までは高速化する意味はあるようだ。個人向けのブロードバンドサービスもこの辺りが 1つの区切りとなるかも。
メール、ニュースなどでは即時的な通信は不要なので、問題となるのは、WWW、ftp などのインタラクティブな利用と思われる。これらの国内通信で1クライアントあたり10M程度と見積もれば良いはず。
これ以上の高速回線(100Mb、1Gbなど)は複数で共用する場合や、サーバを置く事を想定した回線の強化と云う事になる。つまり、TCPセッションあたり10Mの利用を、ピーク時にいくつ同時に使うかという方向で計画をたてる。LANで1Gを使うのは(ネットワークでファイル共有を多く使うなど)簡単だが、インターネットの利用で1G、10Gなどの高速の回線を完全に使うのは結構難しい。
注:県内の接続程度の距離。
用例:安価なNASだと、近距離のLANでもこの程度が限界。
用例:大学のキャンパス間のWAN接続など。
用例:単一の組織からの外部接続の場合、1セッションあたり10Mbと見ても、ピーク時で10セッション同時に使える。これ以上になると、同時利用数に反比例して遅くなって行く。構内LAN接続が100~1000クライアント程度でも問題が無いと思われる。
注:市内の接続程度の距離。
注:安い構成のサーバでは、NICの物理的な限界がこの程度。安価な機器ではカタログ上は対応していても充分な能力が出ない可能性がある。
用例:LANのファイルサーバ。安価なRAID 5ディスクでは追い付かない。適切な構成のRAID 0+1のサーバを考慮する。ホットスペア、ホットスワップ に対応すると管理が楽。
用例:構内幹線。
用例:大学などの情報演習室。100台程度の共用部分(10M/台)。カリキュラムやファイル共有の構成に応じて、1台あたり 1Mから100M程度で計画する。
用例:複数の組織で共用するバックボーン。SINET神戸大ノード近辺の例で見ると、兵庫県内で100以上の大学、研究施設などがあり。このうちの多くが神戸大ノードを介してSINETを利用している。つまり、1G回線を数十の大学など(数十万人)で共用している事になる。
注:構内回線程度の距離。
注:安直な構成のPCサーバやPCを転用したルーターでは使いきれない。
用例:構内幹線。
用例:複数の組織で共用するバックボーン。
用例:Super SINET、JGN-II(NICT)などの実験的な回線。学術情報ネットワーク(2004年の状況)では Super SINET の幹線は 10G、SINETノードは数10M~1Gの回線で相互につながり、ネットワークを形成している。Super SINETノード、SINETノードをあわせて54ある。これらのノード下に国内のac.jp系の大学、研究施設などを収容している。