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

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

- [GitHub/google/bbrのプレゼン資料(PDF)](https://github.com/google/bbr/blob/master/Presentations/bbr-2017-02-08-google-net-research-summit.pdf)
- [Google Cloud Platform Japan 公式ブログ](https://cloudplatform-jp.googleblog.com/2017/08/TCP-BBR-congestion-control-comes-to-GCP-your-Internet-just-got-faster.html)

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

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

--------------------------------------------------------------------------------

## 対象としている人

- 最低限のLinuxの知識がありテスト環境を構築できる人[^1]
- **手軽に**最新の技術に触れてみたい人
- Linuxのネットワーク高速化に興味がある人

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

--------------------------------------------------------------------------------

## 輻輳制御アルゴリズム？？

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

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

- [How Google is speeding up the Internet(Network World)](https://www.networkworld.com/article/3218084/lan-wan/how-google-is-speeding-up-the-internet.html)
	- [日本語訳を見つけました(日経BPネット/ITpro)](http://itpro.nikkeibp.co.jp/atcl/idg/14/481542/082500407/)

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

- [ns-3でTCPの輻輳制御を観察する](https://qiita.com/haltaro/items/d479538345357f08c595)
	- [ns-3.26で始めるネットワークシミュレーション(Qiita)](https://qiita.com/haltaro/items/b474d924f63692c155c8)

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

```bash
$ 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のサーバー](https://qiita.com/fallout/items/39360befe4dd35ee98c2)に導入しました。

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

- CentOS6.8で検証しました。
	- 6.9や7系は未検証です。

- インストールは[GitHubでteddysun氏が公開しているシェルスクリプト](https://github.com/teddysun/across/raw/master/bbr.sh)を利用しています。
	- **Linuxのカーネルを更新しrebootを行います。**
	- **Linuxの最新安定版カーネル導入に[ELRepo](http://elrepo.org/tiki/)[^2]を利用します。**<br>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` としてインストールログを残します。

[^2]: **E**nterprise **L**inux **Repo**sitory。RHELで最新の安定版カーネルを試したい時にはオススメの[サードパーティ製リポジトリ](https://wiki.centos.org/AdditionalResources/Repositories)です。

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

- [GoogleのTCP BBRでLinuxサーバーの高速化を試す](http://www.segmentation-fault.xyz/entry/2017/07/29/184111)
- [Amazon Linux 2017.03で新しいTCP輻輳制御アルゴリズムBBRを試してみた](https://dev.classmethod.jp/server-side/amazon-linux-enable-bbr/)

--------------------------------------------------------------------------------

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

```bash
#-- カーネルのバージョンを確認
$ 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させてください。

--------------------------------------------------------------------------------

### インストール結果の確認

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

```bash
#-- インストールログの確認
$ 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]

[^3]: [さくらのVPSを公開プロキシとして利用する事は規約で禁じられています。](https://help.sakura.ad.jp/hc/ja/articles/206052842)あくまでも個人でのみお楽しみ？ください。

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

- `netperf`を利用する方法
	- [NetPerf (Windows版) で VPN のスループットを測ってみた。](http://takaq1.plala.jp/contents/windows/netperf/index.html)
	- [AWSなどサーバー間でネットワーク帯域を手軽に測定する方法(Qiita)](https://qiita.com/takish/items/3a9ea74cfec4683ddf56)

- `iperf`で検証しているサイト：http://www.segmentation-fault.xyz/entry/2017/07/29/184111
	- [ネットワーク測定ツールiperfの使い方(Qiita)](https://qiita.com/takish/items/bff7a1df712d475432df)

- `tc qdisc`で検証しているサイト：https://dev.classmethod.jp/server-side/amazon-linux-enable-bbr/
	- [tcコマンドの使い方(Qiita)](https://qiita.com/hana_shin/items/d9ba818b49aca87b2314)

--------------------------------------------------------------------------------

## 参考URL

- https://github.com/google/bbr/blob/master/Documentation/bbr-quick-start.md