Speedtest.net by Ookla ホスト登録

Speedtest.net 1

オンラインゲームでラグが酷い、動画がカクカクなどインターネットの回線が遅いなぁと思った時や新しい回線を契約した際などに、回線速度はどのくらい出ているんだろう、ping値はどのくらいなんだろうと思ってつい試してみるのが回線速度計測サイト。

かなり昔からあるBNRスピードテストRadish Network Speed Testingなどの定番サイトは多くの人が利用し過去の計測結果の蓄積も多いので非常に参考になるのですが基本的に東京や大阪などの大都市にだけ計測ホストがあるので自宅と東京・大阪間だけの計測となります。

例えば神戸に住むNTTのフレッツ回線の人でプロバイダAを使用すると神戸の自宅と東京は非常に遅いが神戸-大阪間はもしかしたら速いかもしれません。でも、その人が東京との速度しか計測しなければ途中の何処が遅いか解らないので、もしかしたらNTTと自宅の間が遅いとかプロバイダAが糞だとかフレッツがダメとかいろいろ暗い方向に考えてしまうかもしれません。正直、自宅と東京間が遅いと使い物にならないと思って当然ですが・・・

詳しい人ならネットワークの経路を追って何処が遅いかある程度目処を付けることができるかもしれないので必要に応じて機材を変えるとかプロバイダを変えるとかNTTに直させるとか的確な対応が可能かもしれませんが普通の人は何を改善すれば良いのか解りません。
一般の人が問題を切り分ける為には幾つかの場所との間で速度を計測する方法があります。

フレッツ回線の場合はNTTが用意しているフレッツ専用の計測サイトで計測してある程度速度が出るのであれば自宅とNTT(フレッツ地域網)との間は問題無いことになります。次にプロバイダ側を調べるために、神戸からであれば近畿や中国地方ある計測サイトを複数使ってみるというのが有効です。(ただしこのエリアだと実際は大阪くらいしかありませんが・・)次に東京の計測サイトを複数使ってみることで東京の計測サイト側が問題で遅くなっていないかも確認します。
これで問題が何処なのか何となくは切り分けできる筈です。

ただ、東京や大阪ならともかく地方の場合は近場に計測サイトが殆ど無いのが困りものです。また、地理的には近くてもネットワーク的には遠い場合が結構あります。神戸-姫路のつもりが実際には東京経由というパターン。自分と通信相手のプロバイダが違う場合はよく発生します。このような場合はネットワーク的には経由地の東京の方が遥かに近いということになります。tracerouteなどで経由するホスト名を見て東京の地名が混じっていたら東京経由と考えられます。

Speedtest.netという計測サイトがあります。こちらもかなり古株の海外で有名な計測サイトでiPhone・Androidスマートフォン用のアプリもあるのでここ数年は日本でもよく利用されるようになっています。インターネットの掲示板を見るとSpeedtest.netの計測結果が貼ってあるのをよく見かけるので使ったことはなくても存在だけは知ってる人も多いと思います。
ただ、このSpeedtest.netの計測サイトの計測ホストはBNRやRadishなどとは違い「Speedtest.netが用意した太い回線の凄いサーバ」ではなく、ネットワーク的に近場にある有志が設置したホストになります。なので場合によってはその有志のホストは企業が提供する帯域の保証された太い回線ゴージャスな計測サーバかもしれませんし個人の家庭用細い回線のショボいPCかもしれません。
なお、計測ホストは計測ユーザーが選ぶことも可能なので必ず近所にあるショボイ計測ホストで計測されるせいで毎回計測結果が塩っぱいわということはありません。
と、いうか、そもそも日本にはその有志自体が殆どいませんが・・(2015年5月現在)

そんなわけで1台でも日本にSpeedtest.netの計測ホストを増やしたいということで今回、自宅ではなく実家のFreeBSDルーターをSpeedtest.netの計測ホストにしてみました。

注意:
かなり以前、まだナローバンドからブロードバンドに切り替わる頃にJAVAで計測ホストを立てたことがありましたが計測数値が小さくて可愛かったものです。
しかし、今は迂闊に計測ホストを立てると回線食いつくされてシャレにならない部分があるのでSpeedtest.net用の計測ホスト提供はよくよくよくよく考えてからの方が良いです。   マジで結構凄いよ

ちなみにGatolaboサーバは田舎にあって利用数が少ないにも関わらず1ヶ月平均1500GB程度の転送量になります。ISPによっては規制対象になるので念の為。

で、本題のホスト建てはここから。

この記事はFreeBSD用に書いていますがMacOS,Linuxの人はほぼ同じでできます。WindowsServerもホストになれますがこちらはUNIX系とは全く違うので割愛。

計測ホストの必要スペック

  • CPU: 2GHzの4コアでメモリが4GB以上。 (底スペ: 2GHz 2コアでメモリ2GB)
  • OS: Linux, MacOS X, FreeBSD, WindowsServer。
  • ウェブサーバ: PHP, ASP, ASP.NET, JSPのどれかが動くこと。
  • 計測ホストで1IPアドレスを使用して2つのホスト名を使用。要するに名前ベースのバーチャルホスト2つ公開。
  • ポートを3つ開放
  • 回線は1Gbps (底スペ:100Mbps   たぶん論理値でなく実効速度が常時100Mbps以上出ないと役に立たない)

CPUについては実際のところ書かれている程のスペックは全然必要無いようです。atomでもいけちゃうかも。回線スペックだけがネックになりますが、それ以外は今どきのPCを使えば個人でも簡単に満たせる条件となります。NICは良いもの使わないと苦労するかも。

何処かSpeedtest用ファイルの置き場所を作り、スクリプトファイルをダウンロードする。

OoklaServer 2.2の場合
% fetch http://files.netgauge.ookla.com/netgauge_ooklaserver_install.sh

OoklaServer 2.3の場合
% fetch http://install.speedtest.net/ooklaserver/ooklaserver.sh

FreeBSD以外ならfetchでなくwgetなど。

スクリプトに実行権限を付ける。

OoklaServer 2.2の場合
% chmod a+x netgauge_ooklaserver_install.sh

OoklaServer 2.3の場合
% chmod a+x ooklaserver.sh

スクリプトを実行してインストールする

OoklaServer 2.2の場合
% ./netgauge_ooklaserver_install.sh install

OoklaServer 2.3の場合
./ooklaserver.sh install

設定用ファイルはOoklaServer.properties。殆どは触る必要が無いと思いますが、2箇所だけ。

OoklaServer.allowedDomains = *.ookla.com, *.speedtest.net
OoklaServer.maxThreads   = 8の倍数で適度な値

OoklaServer.allowedDomainsはこの値にすると後に出てくるOokla Server Testerで合格になります。行ごとコメントにしても良いのですが、Ookla Server Testerでは「注意」になります。
OoklaServer.maxThreadsはマルチセッションの最大値の筈で、初期値の512は複数クライアントの同時計測があったとしても大きすぎかと個人的には思います。極端にいえば8,16でも、普通に32〜64,多くて128で良いと思う。計測数多くて10Gb回線のところは512でも1024でも好きな値で構わないかと。
計測の様子を# iftop -nNpPi ng0で見ていると500Mbps程度の速度が出る人の時に32セッション使って(確保して)います。モバイルとかで遅い人だと1,2,4,8セッションとか。1Gbpsとか超える人が計測に来ると64セッションとか128セッションとか使うのかもしれませんが私の回線がそんなのに対応していないので実際はどうなのか解りません。

OoklaServer 2.3の場合は自動更新をオフにしたいならOoklaServer.enableAutoUpdate = falseを指定。

ファイアウォールの設定で外側からのTCP/UDPポート80,5060,8080の3つを開ける。
何か理由があって5060,8080が使えないならOoklaServer.propertiesファイルのOoklaServer.tcpPortsとOoklaServer.udpPortsで使えるポート番号に変更。80はたぶん必須。

netgauge_ooklaserver_install.sh, ooklaserver.shは起動・停止・再起動スクリプトでもあるので残しておく。

OoklaServer 2.2の場合
% ./netgauge_ooklaserver_install.sh start
% ./netgauge_ooklaserver_install.sh stop
% ./netgauge_ooklaserver_install.sh restart

OoklaServer 2.3の場合
% ./ooklaserver.sh start
% ./ooklaserver.sh stop
% ./ooklaserver.sh restart

それぞれ1行目が起動、2行目が停止、3行目が再起動。

起動した状態でブラウザでホストにアクセスする。http://hostA.example.com:8080など。

OoklaServer
It worked!
と表示されればOK.

次は普通のウェブサーバの設定
以下の2つのURLでアクセスできるようウェブサーバを設定する。ドメイン名は同一である必要はありません。URLが2つできれば良いのでドキュメントルートが同じでも可な筈。

  • http://hostA.example.com/ (port:80)
  • http://hostB.example.com/ (port:80)

nginxなら設定ファイルはこんなの。

server {
        listen 80;
        server_name hostA.example.com hostB.example.com;

        root /usr/local/www/ookla_speedtest;
        index index.php index.html;

        access_log /var/log/ookla_speedtest-access.log;
        error_log  /var/log/ookla_speedtest-error.log notice;

        location / {
                適当にホニャララ                                                                   
        }                                                                               
                                                                                        
        location ~ \.php$ {                                                             
                fastcgi_pass unix:/var/run/php-fpm.sock;                                
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include fastcgi_params;                                                 
        }                                                                               
}

ドキュメントルート/usr/local/www/ookla_speedtestを作成してHTTP Legacy Fallbackをインストールする。
/usr/local/www/ookla_speedtestに移動。
http://cdn.speedtest.speedtest.net/http_legacy_fallback.zipをダウンロードして解凍。

% fetch http://cdn.speedtest.speedtest.net/http_legacy_fallback.zip
% unzip http_legacy_fallback.zip

ドキュメントルート下にspeedtestフォルダが作成されてその中にファイルが解凍されるがそれで問題ない。(またはspeedtestフォルダの中身を全てドキュメントルートに配置しても構わない)
ドキュメントルートに何か適当にindex.htmlかindex.phpを作っておく。
crossdomain.xmlを作成する。内容は以下のとおり

<?xml version="1.0"?>
<cross-domain-policy>
  <allow-access-from domain="*.ookla.com" />
  <allow-access-from domain="*.speedtest.net" />
</cross-domain-policy>

nginxを起動するなり再起動するなり。

# /usr/local/etc/rc.d/nginx start

これで一応出来ている筈なのでテストを行う。
ブラウザでOokla Server Testerを開く。

  • NetGauge TCP Host:     hostA.example.com:8080
  • Legacy HTTP URL:     http://hostA.example.com/speedtest/upload.php
  • Legacy HTTP URL #2:     http://hostB.example.com/speedtest/upload.php

の3つを入れる。UNIX系の場合は多くの場合PHP鯖だと思われるのでLegacy HTTP URL (#2も)はhttp://hostA.example.com/speedtest/upload.phpやhttp://hostA.example.com/upload.phpのようなURLになる筈。

Speedtest.net 2
全てのテストがPASSEDになること。

全ての準備ができたらブラウザでHost a Speedtest Serverを開く。

Speedtest.net 3
チェックボックス2つにチェックしてFill out our inquiry formを押す。

Speedtest.net 4
登録画面は全て英語で項目を入力する。
Contact Informationには個人情報を入力するが公開されるわけではない。
Server Installationは入力順序が違うがOokla Server Testerで入力したのと同じ。
Hardware Informationはそのまま正直にホストのCPUとメモリの搭載量を入力。
Connection Informationは回線速度を選択。最近の日本の家庭用なら両方1Gbを選択すれば良いです。名目1Gbps回線でも全然速度出ていないなら100Mbとか100Mb以下を選択するのもアリかも。
Hosted By Creditは公開される情報になるので慎重に決めて下さい。Host NameはSpeedTestのサーバ選択画面でホストの点にマウスオーバーした際にHosted by ○○で表示される部分になります。(他でも表示されます)
Host URLは会社のURLだとか自分のホームページだとかを指定しておけば良いです。
Cityは結構大きく表示される(何故かサーバ名にもなる)部分になるのでホストの設置場所の区市郡町村を記入。嘘は入力しないこと。
State or Regionは都道府県。岡山県ならOkayamaと記入、kenとか要らない。CountryにはJapan。

登録が終わるとOokla側で確認してからメールが届く。
メールにはホスト管理者用のIDとパスワードと測定状況のページへのURLが記載されています。
たぶん、メールが届いた頃にはガンガン測定されていると思います。
早速、計測レポートページにIDとパスワードを使ってアクセスします。

Speedtest.net 5
測定された結果が表示されます。一応IPアドレスの一部がマスクされるなど測定者の個人情報に気を使った内容となっていますがプロバイダや測定者の地域などは判ります。iPhone,Android,WindowsPhoneについては測定者の回線種類と測定場所の地図を見ることができます。測定状況によってはピンポイントで判ってしまうのでありゃりゃ・・・
測定日時は標準ではGMTになっているので9時間足せば日本時間になります。

最初はFreeBSDベースのpfSenseのルーターにインストールして試してみたんだけど、動くのは動くが僅か1〜3時間でネットワークが死ぬなど挙動がおかしすぎたので諦めました。死んだポートは再起動するまで再利用できないしWANも同じく再起動するまでもうプロバイダには繋がらなくなる。
そのルーターのpfSenseを消して普通にFreeBSDにmpd5,isc-dhcpd,nginx,php-server入れてOokla Speedtestのセット入れたら問題無かった。

OS側チューニング

ログにいっぱいICMPの頻度オーバーが記録されるのでしきい値を変更。同じく/etc/sysctl.conf

net.inet.icmp.icmplim=4000

たぶん値を1500程度にすれば頻度オーバーが続出することは無いかと思いますがログが出るならもっと大きく。

安いPCでネットワークチップがダメダメな蟹さんだったりするとFreeBSDの標準設定では高負荷ですぐにネットワークが死ぬので調整が必要。特に蟹でMSI,MSI-Xを有効にしてると負荷高くなるとダメ。気分的にはMSI,MSI-Xを有効にしたいところではあるのですが・・
うちでは以下を/etc/sysctl.confに追加。MSI,MSI-X無効は蟹のネットワーク死にはよく効くけど他のNICでも効くとは限りませんというか無効にしなくて済むのが一番です。

hw.pci.enable_msi=0
hw.pci.enable_msix=0
kern.ipc.somaxconn=1024
kern.ipc.maxsockbuf=2097152
net.inet.tcp.msl=5000
net.inet.tcp.sendspace=131072  #フレッツだと65044,130088,260176,520352とか?
net.inet.tcp.recvspace=131072  #フレッツだと同上?
net.inet.tcp.sendbuf_max=16777216
net.inet.tcp.recvbuf_max=16777216
net.inet.tcp.tso=0  #Intel系NICだと要るみたいだけど蟹ならこの行は不要かと
net.inet.tcp.cc.algorithm=htcp
net.inet.tcp.cc.htcp.rtt_scaling=1
net.inet.tcp.path_mtu_discovery=0

何故かpfSenseではネットワーク死に続けで効かなかった。FreeBSDベースなのに・・

以下は/boot/loader.confで試してみたい設定

cc_htcp_load="YES"
hw.re.prefer_iomap="1" 
hw.re.msi_disable="1"
hw.re.msix_disable="1"

適切な設定はネットワークドライバによっていろいろ違うと思います。
結局、高くてもまともなNIC使うのが設定に悩まなくて済む一番簡単な方法ですよね。