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
私の環境では、cubic
と reno
が利用可能で、現在は cubic
を使用している事が分かります。
BBRの導入
私は、仮想マシンでのテスト後に、先日構築したShadowsocksのサーバーに導入しました。
-
さくらインターネットのVPS「さくらのVPS」を利用しています。
-
CentOS6.8で検証しました。
- 6.9や7系は未検証です。
-
インストールはGitHubでteddysun氏が公開しているシェルスクリプトを利用しています。
スクリプトに任せるのが不安な方は、下記サイトなどを参考に、手動でインストールしてください。
インストールスクリプトのダウンロード ~ 実行
#-- カーネルのバージョンを確認
$ 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
以外の検証方法も併せて紹介しておきます。
-
netperf
を利用する方法 -
iperf
で検証しているサイト:http://www.segmentation-fault.xyz/entry/2017/07/29/184111 -
tc qdisc
で検証しているサイト:https://dev.classmethod.jp/server-side/amazon-linux-enable-bbr/
参考URL
-
いきなり本番環境にぶち込んでおかしくなったと言われても、一切の責任は持ちません。 ↩
-
Enterprise Linux Repository。RHELで最新の安定版カーネルを試したい時にはオススメのサードパーティ製リポジトリです。 ↩
-
さくらのVPSを公開プロキシとして利用する事は規約で禁じられています。あくまでも個人でのみお楽しみ?ください。 ↩