iij mio ひかり(フレッツ)のVDSL回線を使っているのですが、不安定となる時間帯が目立つようになったのでスピードテストを定期実行、集計してみました。
speedtestのコンソールプログラムLinux版をNASであるDS720上で定期実行、CSVファイルをGoogleDriveに保存しGoogle Apps Script(GAS)でshpreadsheetに読ませるまでです。
DS720の有効化
コントロールパネルの「端末&SNMP」よりSSHサービスを有効化します。不要になったら再度無効すると良いでしょう。
DS720とGoogleDriveの同期
Cloud Syndを使います。
ssh接続
ssh接続します。windowsの場合powershellを立ち上げて下記でログオンできます。標準powershellコマンドラインでも良いですが、私はWindowsTerminal(Microsoft製ターミナルアプリ)にPowserShell7.2をインストールした環境です。
ssh userid@nasname
speedtest-cliをダウンロード
適当にフォルダを作り、speedtestをwgetし、実行権限を付与します。
mkdir speedtest cd speedtest wget -O speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py chmod +x speedtest-cli
ホームディレクトリ直下にフォルダを作ったので、WindowsからNASとして見ると下記のようになります。
speedtest-cliの実行とコピーシェル作成
speedtest-cliを実行して動作確認します。
今回はCSVモードで実行し、実行後google driveの同期フォルダにコピーを行いますので、適当にスクリプトを作成します。cronでの実行を行うのでフルパスです。各ディレクトリは環境に合わせてください。
/var/services/homes/USER_ID/speedtest-cli --csv >> /var/services/homes/USER_ID/speedtest.csv cp /var/services/homes/USER_ID/speedtest.csv /var/services/homes/USER_ID/GoogleDrive/speedtest/
chmod +xで実行権限も設定しておきました。(必要でしたっけ??)
cron設定
DS720のDSM 7.0.1-42218 Update 3環境だと、タスクスケジューラーで毎時実行に設定しても日時実行になってしまいます。解決方法がわからなかったのでcrontabを直接編集しました。
sudo vi /etc/crontab
これで毎時5分にspeedtestが実行され、結果ファイルがGoogleDriveに保存されます。
Google Apps Scriptでの読み込み
CSVを適当に開いてspreadsheetに入れるだけです。Spreadsheetで新規作成し、AppsScriptを選択。
スクリプトを作成します。
function auto_csv() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var sh = ss.getSheetByName('speedtest'); var charset = "utf-8"; var dir = DriveApp.getFoldersByName("speedtest"); var file = DriveApp.getFilesByName("speedtest.csv").next(); var csvData = Utilities.parseCsv(file.getBlob().getDataAsString()); var ary = Utilities.parseCsv(csvData); sh.getRange(1, 1).setValue("datetime"); sh.getRange(1, 2).setValue("date"); sh.getRange(1, 3).setValue("time"); sh.getRange(1, 4).setValue("ping"); sh.getRange(1, 5).setValue("down(Mbps)"); sh.getRange(1, 6).setValue("up(Mbps)"); sh.getRange(1, 7).setValue("server"); sh.getRange(1, 8).setValue("distance(10km)"); for (var i = 0; i < csvData.length; i++) { var execdt = new Date(csvData[i][3]); var execds = Utilities.formatDate(execdt, 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss'); var rowdts = sh.getRange(i + 2, 1).getValue(); if (rowdts != "" && Utilities.formatDate(rowdts, 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss') == execds) continue; sh.getRange(i + 2, 1).setValue(execds); sh.getRange(i + 2, 2).setValue(Utilities.formatDate(execdt, 'Asia/Tokyo', 'yyyy-MM-dd')); sh.getRange(i + 2, 3).setValue(Utilities.formatDate(execdt, 'Asia/Tokyo', 'HH:mm:ss')); sh.getRange(i + 2, 4).setValue(parseFloat(csvData[i][5]).toFixed(2)); sh.getRange(i + 2, 5).setValue((csvData[i][6] / 1024 / 1024).toFixed(2)); sh.getRange(i + 2, 6).setValue((csvData[i][7] / 1024 / 1024).toFixed(2)); sh.getRange(i + 2, 7).setValue(csvData[i][2]); sh.getRange(i + 2, 8).setValue(parseFloat(csvData[i][4] / 10).toFixed(2)); } }
実行で動作確認。
シートを追加してグラフを作成してもよいでしょう。
Google Apps Script定期実行
時計アイコンからトリガーを追加、1時間おきに実行を指定すると、毎時実行されます。
実行結果
混雑時間帯はspeedtestが国外のサーバに接続しているようです。経路混雑でそのような動きになっていると思いますので、やっぱ重いってことですね。
speedtestcliはサーバ指定も出来ますので、国内サーバに固定したほうが純粋な速度調査には向いていると思います。ただ、サーバ提供者に迷惑になるかもしれないので考えどころです。