Linux
CentOS
TCP
proxy
shadowsocks

GoogleのTCP BBRでTCPを高速化しProxyもその恩恵にあずかる

More than 1 year has passed since last update.


GoogleのTCP BBRでTCPを高速化しProxyもその恩恵にあずかる

TCP BBR(以下BBRと略します)は、Googleが新しく開発したTCPを高速化するための輻輳(ふくそう)制御アルゴリズムです。

上記資料にもある通り、YouTubeに採用した結果、一部の国でスループットを14%以上も引き上げた実績があるとの事なので、先日構築したProxy(Qiita記事)のサーバーへ導入してみる事にしました。

上記Qiitaの記事では、Shadowsocksという日本では知名度の低い仕組みを採用していますが、SquidでProxyを構築している方やApacheでWebサーバを構築している方などにも、興味を持っていただけたら幸いです。



対象としている人


  • 最低限のLinuxの知識がありテスト環境を構築できる人1


  • 手軽に最新の技術に触れてみたい人

  • Linuxのネットワーク高速化に興味がある人



輻輳制御アルゴリズム??

輻輳制御アルゴリズム…何やら難しそうな言葉ですね。私もあまり理解できていませんのでご心配なく(笑)

Googleがどのような考え方でTCPの高速化を実現したかについては、下記をご参考ください。

Qiitaの↓の記事も、素晴らしい内容だと思います。

現在どのようなアルゴリズムが利用可能で、どのアルゴリズムを使用しているかは、以下のコマンドで確認できます。

$ sysctl net.ipv4.tcp_available_congestion_control

net.ipv4.tcp_available_congestion_control = cubic reno

$ sysctl net.ipv4.tcp_congestion_control
net.ipv4.tcp_congestion_control = cubic

私の環境では、cubicreno が利用可能で、現在は cubic を使用している事が分かります。



BBRの導入

私は、仮想マシンでのテスト後に、先日構築したShadowsocksのサーバーに導入しました。


  • さくらインターネットのVPS「さくらのVPS」を利用しています。



  • CentOS6.8で検証しました。


    • 6.9や7系は未検証です。




  • インストールはGitHubでteddysun氏が公開しているシェルスクリプトを利用しています。


    • Linuxのカーネルを更新しrebootを行います。


    • Linuxの最新安定版カーネル導入にELRepo2を利用します。
      2017年11月3日時点のバージョンは以下の通りです。


      • CentOS6系:6-8.el6.elrepo.noarch.rpm

      • CentOS7系:7.0-3.el7.elrepo.noarch.rpm




    • /etc/sysctl.confの書き換えを行います。(スクリプト内sysctl_config()の部分)

    • 実行したディレクトリ内へ install_bbr.log としてインストールログを残します。



スクリプトに任せるのが不安な方は、下記サイトなどを参考に、手動でインストールしてください。



インストールスクリプトのダウンロード ~ 実行

#-- カーネルのバージョンを確認

$ uname -r
2.6.32-642.13.1.el6.x86_64

#-- インストールスクリプトをダウンロード
$ wget https://github.com/teddysun/across/raw/master/bbr.sh

#-- 実行権限を与える
$ chmod +x ./bbr.sh

#-- インストールスクリプトを実行
$ ./bbr.sh



インストール

---------- System Information ----------

OS : CentOS 6.8
Arch : x86_64 (64 Bit)
Kernel : 2.6.32-642.13.1.el6.x86_64
----------------------------------------
Auto install latest kernel for TCP BBR

URL: https://teddysun.com/489.html
----------------------------------------

Press any key to start...or Press Ctrl+C to cancel

…と表示されますので、問題がなければEnterを押せばインストールが始まります。キャンセルしたい場合はCtrl+Cです。

Complete!

Info: The system needs to reboot.
Do you want to restart system? [y/n]

インストールが成功すると上記のようなメッセージが表示されます。y を入力してrebootさせてください。



インストール結果の確認

念のため、インストール結果を確認します。

#-- インストールログの確認

$ cat ./install_bbr.log

#-- カーネルが更新されている事を確認
$ uname -r
4.13.11-1.el6.elrepo.x86_64

#-- カーネルモジュールに BBR が追加されている事を確認
$ lsmod | grep bbr
tcp_bbr

#-- /etc/sysctl.conf の更新を以下3回の sysctl コマンドで確認
# $ cat /etc/sysctl.conf
#
#-- /proc/sys/net/ 以下の確認でもOK
# $ cat /proc/sys/net/ipv4/tcp_available_congestion_control
# bbr cubic reno
#
# $ cat /proc/sys/net/ipv4/tcp_congestion_control
# bbr

#-- 利用可能な輻輳制御アルゴリズムに bbr が追加されている事を確認
$ sysctl net.ipv4.tcp_available_congestion_control
net.ipv4.tcp_available_congestion_control = bbr cubic reno

#-- 輻輳制御アルゴリズムに bbr を使用している事を確認
$ sysctl net.ipv4.tcp_congestion_control
net.ipv4.tcp_congestion_control = bbr

#-- キューイングアルゴリズムに fq を使用している事を確認
$ sysctl net.core.default_qdisc
net.core.default_qdisc = fq

Linuxカーネルに詳しい方は更にチューニング(特に net.ipv4.tcp_ 周り)を行うと良いと思いますが、とりあえず今回はここまでとしておきます。

「えぇ!もう終わり!?」と驚く方もいらっしゃると思いますが、たったこれだけで導入は完了です。素晴らしいスクリプトを公開している GitHub teddysun氏 に、この場を借りてお礼申し上げます。I'd like to take this opportunity to thank GitHub/teddysun!!



効果の検証

それでは効果の検証です…と書きたいところなのですが、BBR導入前のiperfでの検証データを失うという大ポカをやらかしてしまいました…(涙)

比較可能なデータとして、iPhoneの「Speedtest.net Speed Test」というアプリのログが残っていましたので、中国国内 ⇒ さくらのVPS上のShadowsocksR(Proxy) という状況で計測してみたところ、驚く事に約 1500% ~ 2000% 速度が向上 しています。(決して桁は間違ってません)

パケットロスの検知に基づかない方法 = パケットロスが大きい環境だとより効果が高くなる = 中国国内 ⇔ 中国国外なら特に効果があるかも…とは思っていましたが、正直ここまで効果があるとは驚きです。Youtubeの4K動画やX○ideosのあんな動画やこんな動画も、中国国内からサクサク閲覧できるようになりました。3

こんな締まらない終わり方で本当に申し訳ありません。iperf以外の検証方法も併せて紹介しておきます。



参考URL






  1. いきなり本番環境にぶち込んでおかしくなったと言われても、一切の責任は持ちません。 



  2. Enterprise Linux Repository。RHELで最新の安定版カーネルを試したい時にはオススメのサードパーティ製リポジトリです。 



  3. さくらのVPSを公開プロキシとして利用する事は規約で禁じられています。あくまでも個人でのみお楽しみ?ください。