インターネット回線の速度計測
インターネット回線の上りと下りの速度計測を行う必要があり、王道であるiperfを調べていました。
https://iperf.fr/
iperfの場合、いくつかpublicなサーバーが存在するため、そちらを使って上りと下りを計測しようと考えたのですが、publicなサーバーの場合下りがうまく計測できませんでした。(クライアントからサーバーへの上り方向は測れるのですが)
public iperf server
https://iperf.fr/iperf-servers.php#public-servers
自分でAWSのEC2などにiperfをインストールするのも面倒なので、別の手段を探していたところ、speedtestというpythonのツールがありました。こちらがとても便利でしたので紹介させて頂きます。
Speed Testでやっている事
ざっとコードを見たところ、Speed Testに利用可能なサーバーリストから一番近いサーバーを探してきて、そのサーバーに対してHTTPのダウンロードとアップロードを行なっています。--secureのオプションでHTTPSのダウンロードとアップロードの計測も可能な模様です。
インストールは上記のGithubに書かれていますが、Macの場合Pipでインストール可能です。
$ pip install speedtest-cli
計測は以下のコマンドで可能です。
$ $ speedtest
Retrieving speedtest.net configuration...
Testing from XXXXX ...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by GIAM PING VIETPN.COM (Tokyo) [23.22 km]: 17.611 ms
Testing download speed................................................................................
Download: 67.19 Mbit/s
Testing upload speed................................................................................................
Upload: 92.91 Mbit/s
Pythonスクリプトから呼んでみる
Pythonスクリプトからはspeedtestをimportすれば以下のような形でテストできます。まずは、サーバーリストを取得して、一番近いサーバーを選択します。後はdownload()とupload()を実施すれば回線速度を計測する事ができます。計測結果は、それぞれbpsで出力されます。
import sys
import speedtest
def get_speed_test():
servers = []
stest = speedtest.Speedtest()
stest.get_servers(servers)
stest.get_best_server()
return stest
def command_line_runner():
stest = get_speed_test()
down_result = stest.download()
up_result = stest.upload()
print str(down_result) + ',' + str(up_result)
if __name__ == '__main__':
command_line_runner()
1分に一度速度を計測させてみる
上記のスクリプトを修正して、1分に1度計測するように修正する。
import speedtest
import datetime
import time
INTERVAL_SEC = 60
def get_speed_tester():
servers = []
stester = speedtest.Speedtest()
stester.get_servers(servers)
stester.get_best_server()
return stester
def get_timestamp():
date = datetime.datetime.now()
timestamp = str(date.strftime('%Y-%m-%d %H:%M:%S'))
return timestamp
def test_speed(stester):
down_result = str(int(stester.download()))
up_result = str(int(stester.upload()))
return down_result, up_result
def command_line_runner():
stester = get_speed_tester()
print 'time,down(bps),up(bps)'
while True:
t1 = time.time()
timestamp = get_timestamp()
down_result, up_result = test_speed(stester)
print timestamp + ',' + down_result + ',' + up_result
t2 = time.time()
next_sleep_time = int(INTERVAL_SEC - (t2 - t1))
time.sleep(next_sleep_time)
if __name__ == '__main__':
command_line_runner()