AccelTCPで遅延削減

ラズパイVPNサーバの総仕上げとしてAccelTCPでレイテンシーを最小化してみた。 AccelTCPは”プロキシサーバ間のコネクションプーリングにより、TCPコネクションの確立時に発生する3Wayハンドシェイクのオーバーヘッドを削減し、比較的小さなデータのやりとりを行う通信の待ち時間を大幅に短縮できます。”というものです。これで日独間のping 300ms分の遅延を減らすのが目的です。

dsas.blog.klab.org

web browser --> acceltcp:8080 --> (SoftEther VPNでL2TP/IPsec) --> acceltcp:10381 --> squid:3128 --> web site というフローになる。

まず、ラズパイにはsquidをhttp proxyとしてインストールしてポート3128で待機しておく。 キャッシュはいらないので/etc/squid/squid.confで

cache_dir null /tmp

としてディスクキャッシュは無効にしておく。 AccelTCPのbuildは簡単です。

sudo apt-get install libev-dev
git clone git://github.com/KLab/AccelTCP.git
cd AccelTCP
cmake .
make
sudo cp acceltcp /usr/local/bin

まずラズパイにAccelTCPサーバを立てる。AccelTCPは10381で待機します。-4でipv4にするか明示的に自アドレスを書かないとaddress already in useと言われました。バグっぽいです。

acceltcp -q -- --server -4 10381:127.0.0.1:3128

または

acceltcp -q -- --server 127.0.0.1:10381:127.0.0.1:3128

クライアントは自分のmacで下のようにして100本ほどプールを作ります。ラズパイのipは192.168.0.100とします。

acceltcp -q -- -4 --connection-num=100 8080:192.168.0.100:10381

あとはwebブラウザのプロキシを127.0.0.1:8080にすると、日本のサイトへのアクセスは爆速になります。ベンチマークだと1.5倍から2倍弱ですが、体感はもっと速い感じです。webのように小さなファイルをたくさんダウンロードすると効果はてきめんです。http/2が広まるまでは役に立ちそうです。 (googleのdata compression proxyもかなり速い)

ここまでくるとSoftEtherは拠点間接続にして常時つないでおき、AccelTCPもつなぎっぱなしにしておいたほうが使い勝手が良さそうですね。プロキシだけ切り替えればwebへの経路が変わるというのがよさそう。