本サイトは、オープンソースソフトウェアのライブラリ「LibreSpeed(HTML5 Speedtest)」(GNU LGPLv3 License)を利用して通信速度の測定を行っています。
クライアント側のプログラミング言語はJavaScriptです。
本サイトは、測定サーバーにLinodeのクラウドサーバー(東京リージョン)を利用しています。
※ 経路の問題で特定の回線環境で大幅な遅延が発生する場合はLinodeの代わりにVultrを利用しています。
測定サーバーはプログラミング言語Goを利用して通信速度の測定を行っています。LibreSpeedではPHP、Node.js、Goのいずれかを測定サーバーのプログラミング言語として利用出来ますが、当サイトはGoを利用しています。
Goで記述しているサーバー側のプログラムの詳細はGitHubより確認出来ます。
本サイトは、WebサーバーにNginxを利用しています。
本サイトはNginxの設定をBetter reverse proxy conf for go | Issue #381 | librespeed/speedtestを参考に以下のような設定を行っています。(一部抜粋)
gzip off;
proxy_cache off;
proxy_redirect off;
proxy_buffering off;
proxy_request_buffering on;
more_clear_headers Vary;
※ NginxでHTTP/2の設定は行っておらずHTTP/1.1で通信しています。(HTTP/2でテストした際に一部端末でアップロード速度が極端に遅くなる事象が発生したため)
ネットワークのパフォーマンスを最大化するために一部Linuxカーネルパラメータのチューニングを行っています。
具体的には以下のパラメータのチューニングを行っています。
# サーバーのメモリ容量に合わせて決定
net.core.rmem_max=N
net.core.wmem_max=N
net.ipv4.tcp_rmem=N
net.ipv4.tcp_wmem=N
net.core.netdev_max_backlog=N
# 以下のパラメータは固定
net.ipv4.tcp_mtu_probing=1
net.ipv4.tcp_congestion_control=bbr
net.core.default_qdisc = fq
net.ipv4.tcp_window_scaling = 1
■ 参考リンク
・Linux Tuning - Fasterdata - ESnet
https://fasterdata.es.net/host-tuning/linux
・LinuxサーバーのTCPネットワークのパフォーマンスを決定するカーネルパラメータ – 1編
https://meetup-jp.toast.com/1505
・LinuxサーバーのTCPネットワークのパフォーマンスを決定するカーネルパラメータ – 2編
https://meetup-jp.toast.com/1509
・BBR, the new kid on the TCP block | APNIC Blog
https://blog.apnic.net/2017/05/09/bbr-new-kid-tcp-block/
■ ダウンロードのスピードテストのTCPコネクション数
-> Chromiumベースのブラウザ: 5
-> Edge(IE): 3
-> その他ブラウザ: 6
■ アップロードのスピードテストのTCPコネクション数
-> PC: 5
-> スマホ・タブレット: 3
当サイトはダウンロード・アップロードのスピードテストにおいて、同時に複数のTCPコネクションを開いてスピードテストを行っています。
複数のTCPコネクションを開く理由は、単一の接続の場合では最大通信速度を測定することが難しく、また速度が非常に不安定な場合があるためで、使用可能な帯域幅を正確に測定するために複数のTCPコネクションを開いてスピードテストを行っています。
■ 参考リンク
・What is Multi & Single while testing speed on Ookla? - Quora
https://www.quora.com/What-is-Multi-Single-while-testing-speed-on-Ookla
当サイトが利用しているLinodeの最大ネットワーク帯域幅は約4.5Gbpsです。
一方、10Gbpsの光回線を使っている場合でも十分な速度が出ていない測定結果があることを確認していますが、これはCPU性能がボトルネックになっている、ネットワーク経路の一部のルーターがボトルネックになっているなど複数の要因が考えられます。
なお、最大ネットワーク帯域幅は随時変更される可能性があります。
■ 参考リンク
・Can't go past 1 Gbps · Issue #379 · librespeed/speedtest
https://github.com/librespeed/speedtest/issues/379#issuecomment-733725013
LibreSpeedで任意の値に設定出来るパラメータのうち「overheadCompensationFactor」という値がありますが、こちらはHTTP/S通信で発生するオーバーヘッドの補正値です。
デフォルトでは「overheadCompensationFactor」は「1.06」で設定されていますが、これはやや楽観的すぎるため、当サイトでは「1.022」に設定しています。
■ 参考リンク
・speedtest/doc.md at master · librespeed/speedtest | GitHub
https://github.com/librespeed/speedtest/blob/master/doc.md
・What % of traffic is network overhead on top of HTTP/S requests
https://stackoverflow.com/questions/3613989/what-of-traffic-is-network-overhead-on-top-of-http-s-requests
・Trying to find out exact TCP overhead cost
https://networkengineering.stackexchange.com/questions/19976/trying-to-find-out-exact-tcp-overhead-cost