注目の記事

Linux上でネットワーク回線速度を計測する手段について整理してみた

2015.09.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ちょっとした小ネタです。

ネットワーク環境調査に於いてネットワークの『回線速度を調べたい』という局面があるかと思いますが、Windows環境ではブラウザ経由で簡単に結果が得られる一方、Linux環境では『あれ、そもそも何が出来る/どうやれば出来るんだろう?』と少々思案してしまいました。情報を幾つか漁ってみたところ、Linux環境でも回線速度状況を把握する術が幾つかある事が分かりましたので備忘録的に整理しておこうと思います。

目次

環境準備

当エントリではAmazon Linux AMIを使った環境で回線速度を調べる環境が必要になった場合、という状況を想定してみたいと思います。直近最新のAmazon Linux AMIで環境を構築し、yumコマンドでパッケージ各種を最新の状態に整えておきます。

linus-speedtest-software_01

$ sudo yum -y update

Speedtest-cli

2006年に始まったOokla社のサービス『Speedtest.net』ではブラウザ上で回線速度の試験が行えます。

speedtestではcliも提供されています。このツールを環境に導入する事で、Linux環境でも回線速度の計測が行えるようになります。

導入方法は簡単です。easy_installで一発。

$ sudo easy_install speedtest-cli
Searching for speedtest-cli
Reading https://pypi.python.org/simple/speedtest-cli/
:
:
Installing speedtest script to /usr/local/bin
Installing speedtest-cli script to /usr/local/bin

Installed /usr/local/lib/python2.7/site-packages/speedtest_cli-0.3.2-py2.7.egg
Processing dependencies for speedtest-cli
Finished processing dependencies for speedtest-cli
$ 
$ speedtest --version
0.3.2

speedtest --listで計測を行うサーバの一覧を表示させる事が出来ます。

$ speedtest --list

--listオプションで表示されるサーバ一覧は結構な数ありますので、日本国内のものに絞ってみます。その中から東京のものを指定してみたいと思います。

$ speedtest --list | grep Japan
5628) Too late (Ishikari, Japan) [10074.51 km]
6405) Allied Telesis Capital Corporation (Misawa, Japan) [10313.64 km]
6516) factorymark (Ofunato, Japan) [10455.71 km]
6492) denpa893 (Sumida, Japan) [10864.55 km]
6424) Cordeos Corp. (Tokyo, Japan) [10868.32 km]
6087) Allied Telesis Capital Corporation (Fussa-shi, Japan) [10881.90 km]
6467) MMS Network (Yokohama, Japan) [10897.25 km]
6508) at2wn (Yokohama, Japan) [10897.25 km]
6766) JAIST (Kanazawa, Japan) [10909.06 km]
6691) sudosan (Shizuoka, Japan) [11005.17 km]
6368) gatolabo (Maibara, Japan) [11048.44 km]
6463) j416dy (Kusatsu, Japan) [11091.00 km]
6476) rxy (individual) (Osaka, Japan) [11141.69 km]
 811) GLBB Japan KK (Chatan, Japan) [12288.16 km]
6581) haza (Haebaru, Japan) [12302.57 km]

計測実行。サーバー指定の際はspeedtest --server 6424の様にサーバを示すID値を引数として渡します。以下の様な形で上がり/下り双方の数値が計測出来ました。

$ speedtest --server 6424
Retrieving speedtest.net configuration...
Retrieving speedtest.net server list...
Testing from Amazon Technologies (52.2.83.155)...
Hosted by Cordeos Corp. (Tokyo) [10868.32 km]: 196.001 ms
Testing download speed........................................
Download: 20.25 Mbit/s
Testing upload speed..................................................
Upload: 14.54 Mbit/s

参考までに、実行時のオプション等の使い方を-hオプションで表示してみます。

$ speedtest -h
usage: speedtest [-h] [--bytes] [--share] [--simple] [--list]
                 [--server SERVER] [--mini MINI] [--source SOURCE]
                 [--timeout TIMEOUT] [--version]

Command line interface for testing internet bandwidth using speedtest.net.
--------------------------------------------------------------------------
https://github.com/sivel/speedtest-cli

optional arguments:
  -h, --help         show this help message and exit
  --bytes            Display values in bytes instead of bits. Does not affect
                     the image generated by --share
  --share            Generate and provide a URL to the speedtest.net share
                     results image
  --simple           Suppress verbose output, only show basic information
  --list             Display a list of speedtest.net servers sorted by
                     distance
  --server SERVER    Specify a server ID to test against
  --mini MINI        URL of the Speedtest Mini server
  --source SOURCE    Source IP address to bind to
  --timeout TIMEOUT  HTTP timeout in seconds. Default 10
  --version          Show the version number and exit
$

iperf

2台の環境間でのネットワークスループットを計測したい場合は『iperf』というツールが利用出来ます。

こちらについては、以前のエントリでhiroyuki kajiさんが書いていましたので詳細は当エントリでは割愛します。下記エントリをご参照ください。

こちらも導入についてはyumコマンドで一発です。

$ sudo yum -y install iperf --enablerepo=epel
$ iperf --version
iperf version 2.0.5 (08 Jul 2010) pthreads

ヘルプコマンド実施内容も一応載せておきます。

$ iperf --help
Usage: iperf [-s|-c host] [options]
       iperf [-h|--help] [-v|--version]

Client/Server:
  -f, --format    [kmKM]   format to report: Kbits, Mbits, KBytes, MBytes
  -i, --interval  #        seconds between periodic bandwidth reports
  -l, --len       #[KM]    length of buffer to read or write (default 8 KB)
  -m, --print_mss          print TCP maximum segment size (MTU - TCP/IP header)
  -o, --output    <filename> output the report or error message to this specified file
  -p, --port      #        server port to listen on/connect to
  -u, --udp                use UDP rather than TCP
  -w, --window    #[KM]    TCP window size (socket buffer size)
  -B, --bind      <host>   bind to <host>, an interface or multicast address
  -C, --compatibility      for use with older versions does not sent extra msgs
  -M, --mss       #        set TCP maximum segment size (MTU - 40 bytes)
  -N, --nodelay            set TCP no delay, disabling Nagle's Algorithm
  -V, --IPv6Version        Set the domain to IPv6

Server specific:
  -s, --server             run in server mode
  -U, --single_udp         run in single threaded UDP mode
  -D, --daemon             run the server as a daemon

Client specific:
  -b, --bandwidth #[KM]    for UDP, bandwidth to send at in bits/sec
                           (default 1 Mbit/sec, implies -u)
  -c, --client    <host>   run in client mode, connecting to <host>
  -d, --dualtest           Do a bidirectional test simultaneously
  -n, --num       #[KM]    number of bytes to transmit (instead of -t)
  -r, --tradeoff           Do a bidirectional test individually
  -t, --time      #        time in seconds to transmit for (default 10 secs)
  -F, --fileinput <name>   input the data to be transmitted from a file
  -I, --stdin              input the data to be transmitted from stdin
  -L, --listenport #       port to receive bidirectional tests back on
  -P, --parallel  #        number of parallel client threads to run
  -T, --ttl       #        time-to-live, for multicast (default 1)
  -Z, --linux-congestion <algo>  set TCP congestion control algorithm (Linux only)

Miscellaneous:
  -x, --reportexclude [CDMSV]   exclude C(connection) D(data) M(multicast) S(settings) V(server) reports
  -y, --reportstyle C      report as a Comma-Separated Values
  -h, --help               print this message and quit
  -v, --version            print version information and quit

[KM] Indicates options that support a K or M suffix for kilo- or mega-

The TCP window size option can be set by the environment variable
TCP_WINDOW_SIZE. Most other options can be set by an environment variable
IPERF_<long option name>, such as IPERF_BANDWIDTH.

Report bugs to <iperf-users@lists.sourceforge.net>
$

dstat

dstatを使うと、ネットワーク回線速度を含めたサーバのリソース各種を監視する事が出来ます。

導入は以下のようにyumコマンドで一発。

$ sudo yum -y install dstat

オプション無しだと以下の様に情報が一通り表示されます。

$ dstat
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw 
 11   2  83   4   0   0| 579k 6283k|   0     0 |   0     0 | 242   341 
  0   0 100   0   0   0|   0     0 | 156B  940B|   0     0 |  19    26 
  0   1  99   0   0   0|   0     0 | 104B  460B|   0     0 |  11    10 
  0   0 100   0   0   0|   0     0 | 104B  460B|   0     0 |   9    12

-n 数字オプションを付与すると指定の秒数毎の表示が可能となります。

$ dstat -n 1
-net/total-
 recv  send
   0     0 
 104B  316B
 104B  358B
 180B  268B

そこそこボリュームのあるCSVをダウンロードした時の状況を計測してみたいと思います。dstat -n 1コマンドを事前に実行しておいて、別ウインドウでターミナルを開き、下記wgetコマンドを実行してみます。

$ wget https://s3-ap-northeast-1.amazonaws.com/xxxxxx/xxxxxxxx.csv

実行時の数値は以下の様になりました。ダウンロード処理が進むに連れてrecv(データの受信)の数値が上がり、最大で10MBにまで上昇しました。

$ dstat -n 1
-net/total-
 recv  send
 104B  268B
 238B  626B
  57k 4372B
 195k 2026B
 443k 3550B
 755k 4240B
1392k 7272B
:
6699k   37k
6172k   55k
4898k   60k
:
6289k   29k
8324k   52k
8148k   44k
  10M   47k
9587k   41k
4797k   56k
2336k   16k
4789k   74k

今度は逆に、サーバからファイルをアップロードした際の回線速度状況について見てみたいと思います。以下aws s3コマンドでS3バケットへのアップロードを実施してみました。

aws s3 cp xxxxxxxxxxx.csv 's3://xxxxxxxxxxx/xxxxxxxxxxx.csv'

dstatの数値遷移を見てみます。send(データ送信)の数値が50MB近くまで上昇している事が確認出来ました。

$ dstat -n 1
-net/total-
 recv  send
  52B  268B
 156B  332B
 104B  268B
 104B  268B
 104B  268B
 104B  268B
 104B  268B
 104B  268B
 260B  370B
1016B 2619B
 904B 1504B
1488B 1237B
  :
  31k 4536k
 162k   30M
-net/total-
 recv  send
 330k   53M
 607k   47M
 382k   39M
 373k   45M
 544k   47M
 374k   45M
 399k   39M
 417k   36M
 338k   44M
 287k   41M
 247k   24M
  84k 9135k
  25k 1702k
3019B 9313B
  52B  166B
  52B  166B
 128B  256B

ping

pingコマンドを使って回線速度の状況を計測する事も出来るようです。ただ、状況を整えたり色々手元で計算したりしないといけないようで、あまり便利に使いこなせるという感じでは無さそうです...。

まとめ

Linux環境における回線速度の実施方法に関するまとめエントリでした。今回調べた内容では、Speedtest-cliの実行結果が個人的には一番しっくり来るものでしたが、その他の内容も状況によって使い分けて行きたいところですね。こちらからは以上です。