インターネット接続速度をSpeedtest CLIで定期取得する

5 min read読了の目安(約4600字 2

私が住んでいるマンションのインターネット接続環境(時間帯ごとの速度)についてマンション理事会から相談され、定量的なデータを元にお話した方が説得力があると思い、Speedtest CLIを使用して毎時1回24時間分(24回分)のデータを取得しました。その内容をまとめます。

この記事の実行環境はmacOS Big Surです。定期実行はcronを使いましたが、Windowsの場合はタスクスケジューラを使えば同じことはおそらく出来ると思います。

Speedtest CLIのダウンロードと実行

Speedtest CLIのサイトからツールをダウンロードします。Homebrew(brew)でダウンロードできるようですが、短期的な利用のみを想定していたので、「macOS用ダウンロード」からファイルをダウンロードしました。ダウンロードしたookla-speedtest-1.0.0-macosx.tgzファイルを展開しました。

ターミナルで展開したディレクトリに移動すると、以下のようなファイルが含まれていることが分かります。

% cd ookla-speedtest-1.0.0-macosx
% ls -la
-rwxr-xr-x@  1 yourusername  staff  1387140 10 29  2019 speedtest
-rw-r--r--@  1 yourusername  staff    12377 10 29  2019 speedtest.5
-rw-r--r--@  1 yourusername  staff    11488 10 29  2019 speedtest.md

speedtest -h(ヘルプ表示)を実行します。1回目はmacOSの開発元未検証エラーが出るので、実行を許可して、再実行します。

% ./speedtest -h

Speedtest by Ookla is the official command line client for testing the speed and performance of your internet connection.

Version: speedtest 1.0.0.2

(---省略---)

 Valid units for [-u] flag: 
   Decimal prefix, bits per second:  bps, kbps, Mbps, Gbps
   Decimal prefix, bytes per second: B/s, kB/s, MB/s, GB/s
   Binary prefix, bits per second:   kibps, Mibps, Gibps
   Binary prefix, bytes per second:  kiB/s, MiB/s, GiB/s
   Auto-scaled prefix: auto-binary-bits, auto-binary-bytes, auto-decimal-bits, auto-decimal-bytes

ヘルプが表示されました。

それでは手動コマンド実行で1回データを取得します。絶対パスで実行しているのは、今後はcron実行させることを想定したからです。絶対パスは人によって異なるはずなので、pwdで確認してください。

後の加工の観点からアウトプット形式はCSVにしました。接続先サーバは常に同じことが、異なる時間帯のデータの比較の観点で望ましいと思ったので、私は「OPEN Project (via 20G SINET) - Tokyo (15047)」で固定しました。私の利用用途では、接続先が常に同じであれば他のサーバでも問題ありませんでしたが、接続サーバによって接続速度の測定結果はかなり異なると思います。

CSVのヘッダ行の情報が欲しかったので、この手動実行の時だけ--output-headerオプションを付けています。

% /Users/yourusername/Downloads/ookla-speedtest-1.0.0-macosx/speedtest -s 15047 -f csv --output-header >> /Users/yourusername/Downloads/ookla-speedtest-1.0.0-macosx/speedtest/speedtest_result.csv 2>&1
% cat /Users/yourusername/Downloads/ookla-speedtest-1.0.0-macosx/speedtest/speedtest_result.csv
"server name","server id","latency","jitter","packet loss","download","upload","download bytes","upload bytes","share url"
"OPEN Project (via 20G SINET) - Tokyo","15047","7.14","1.475","0","3457278","4213892","26781160","44256448","https://www.speedtest.net/result/c/dummy123-aa45-6789-1234-5bb6ccc7d89e"

手動コマンド実行でデータが取れていることを確認しました。

cronによる定期実行

24時間手動実行はつらく、実行時間もずれる可能性があるので、cronを使って毎時コマンドを定期実行させます。

crontab -eでcronの定義をしました(定義は次のcrontab -lの結果参照)。毎時55分になったら上記手動実行で確認したコマンドを実行するように定義しています。上述したように--output-headerオプションは不要なのでcronの定義では除去しています。

毎時55分実行にしているのは、毎時00分は他の人が定期実行している時間帯と重なってサーバ側の負荷が高くなることを想定して時間をずらしています。どの時間にするかは決めの問題だと思います。

% crontab -l
crontab: no crontab for yourusername
% crontab -e
crontab: no crontab for yourusername - using an empty one
crontab: installing new crontab
% crontab -l
55 * * * * /Users/yourusername/Downloads/ookla-speedtest-1.0.0-macosx/speedtest -s 15047 -f csv >> /Users/yourusername/Downloads/ookla-speedtest-1.0.0-macosx/speedtest_results.csv 2>&1

cron実行時間帯以降に出力ファイルを見ると、cron実行で取得したデータ行が追記されていることを確認できました。

% cat /Users/yourusername/Downloads/ookla-speedtest-1.0.0-macosx/speedtest/speedtest_result.csv
"server name","server id","latency","jitter","packet loss","download","upload","download bytes","upload bytes","share url"
"OPEN Project (via 20G SINET) - Tokyo","15047","7.14","1.475","0","3457278","4213892","26781160","44256448","https://www.speedtest.net/result/c/dummy123-aa45-6789-1234-5bb6ccc7d89e"
"OPEN Project (via 20G SINET) - Tokyo","15047","7.245","224.851","2.10526","1623855","4399519","14582582","64562442","https://www.speedtest.net/result/c/dummy789-aa12-3456-7890-1bb2ccc3d45e"

インターネット接続速度の把握

CSV形式のファイルでデータは取得できたので、あとは出力されたファイルをExcelなどを使って自由に加工をすれば良いと思います。

私はダウンロード速度とアップロード速度を把握したかったので、出力されたCSVファイルの「download」列と「upload」列の値を使用しました。一般的にMbps形式が一番分かりやすいと思います。そのような場合は単位を変換する必要があり、「download」の値と「upload」の値を125,000で割るとMbps単位に変換できます。つまり、downloadが「1,623,855」であれば、1623855 / 125000 = 12.99084で、ダウンロード速度が12.99084Mbps(約13Mbps)ということです。

後片付け

必要なデータが取れたらcronの定義を消すことで、定期実行を止めることが出来ます。今回定義した内容以外にcronの定義がない場合は、crontab -rで一括削除で問題ないと思います。他の定義がある方はcrontab -eで削除したい定義行だけ削除してください。

% crontab -l
55 * * * * /Users/yourusername/Downloads/ookla-speedtest-1.0.0-macosx/speedtest -s 15047 -f csv >> /Users/yourusername/Downloads/ookla-speedtest-1.0.0-macosx/speedtest_results.csv 2>&1
% crontab -r
% crontab -l
crontab: no crontab for yourusername