輻輳制御アルゴリズム TCP BBR の有効化
ネットアシスト技術部のykinjoです。弊社のとあるWebサイトを移設するにあたってTCP BBRを有効化出来る機会が有りましたので、実際の速度を見てみたいと思います。
TCP BBRとは
TCP/IPでの通信を行う上で輻輳制御を行うための方法(アルゴリズム)がいくつかあります。このアルゴリズムによってネットワークが混雑していたりパケットが消失するような通信状況での通信効率が変わってきます。今回Webサイトの移設先となるサーバーのAmazon Linux 2ではCUBICがデフォルトで選択されていますが、これをBBRに変更してみます。これはGoogleにより開発された新しいアルゴリズムで、実際にYoutube等に導入され、スループットの向上に役立っているようです。
TCPを高速化する新アルゴリズム「BBR」、Googleが開発
https://tech.nikkeibp.co.jp/it/atcl/idg/14/481542/082500407/
「TCP BBR」等で検索すると、実際にパケットロスが発生する状況を再現したネットワークにおいて、比較的スループットの高い結果になっているようなベンチマーク結果をいくつか確認できます。モバイル向けWebサイトでは効果が大きそうですね。
Amazon Linux 2017.03で新しいTCP輻輳制御アルゴリズムBBRを試してみた
https://dev.classmethod.jp/server-side/amazon-linux-enable-bbr/
有効化してみる
TCP BBRを利用するにはバージョン4.9以降の新しいLinuxカーネルが必要、かつBBRを有効にしたカーネルビルドが必要となりますが、今回の移行先サーバーである Amazon Linux 2 ではその条件を満たしており、設定で有効化することができます。
# cat /proc/sys/net/ipv4/tcp_congestion_control cubic 現在はcubicであることを確認 設定ファイルに追記し反映 # vim /etc/sysctl.conf # sysctl -p net.ipv4.tcp_congestion_control = bbr net.core.default_qdisc = fq 確認 # cat /proc/sys/net/ipv4/tcp_congestion_control bbr OSを再起動しておく # reboot # cat /proc/sys/net/ipv4/tcp_congestion_control bbr 再起動後もBBRである事を確認
動作確認
2つのサイトで動作確認しています。移行元A、移行元BともにPHPとMySQLを利用しています。移行元AではPHPでの処理は軽めですがアクセス解析など外部サーバー・CDNからの読み込みが多いです。移行元BではWordPressが動作しておりPHPとMySQLの処理がAに対して重めです。
移行元サーバーはPHP 5.3、MySQL 5.1、ストレージはHDDとレガシーな環境、移行先ではPHP 7.2、MariaDB 10.2、http/2有効化のうえでストレージはSSDという環境になっています。Google Chromeの開発者ツールを利用し、キャッシュ無効・連続した2回目のアクセスの結果を採用しています。
まずはTCP BBRを有効化しない(CUBIC)状態での確認。
移行元A
167 request
3.7MB transferred
Finish 3.03s
DOMContentLoaded 204ms
Load 1.08s
HTML読み込み完了は36ms
移行元B
86 request
964KB transferred
Finish 3.28s
DOMContentLoaded 304ms
Load 3.33s
HTML読み込み完了は173ms
移行先A(CUBIC)
167 request
3.7MB transferred
Finish 2.86s
DOMContentLoaded 157ms
Load 1.01s
HTML読み込み完了は14ms
移行先B(CUBIC)
86 request
960KB transferred
Finish 2.99s
DOMContentLoaded 245ms
Load 3.06s
HTML読み込み完了は72ms
ミドルウェア的には速度改善が大いにありそうですが、実際にはサイト外サーバーからの読み込みく、そこまでインパクトのある結果にはなっていません。とはいえ全体的に高速化されており、特に外部サイトの影響を受けないHTML単体を返すまでの時間は移行先Bの環境で大きく短縮されています。このあたりはPHPバージョンアップによる効果でしょう。
次はBBRを有効にした状態です。安定したネットワークであり、パケットロスはほとんど発生しない環境です。
移行先A(BBR)
167 request
3.7MB transferred
Finish 2.89s
DOMContentLoaded 217ms
Load 1.05s
HTML読み込み完了は31ms
移行先B(BBR)
86 request
959KB transferred
Finish 2.90s
DOMContentLoaded 234ms
Load 2.92s
HTML読み込み完了は71ms
移行元Bでは誤差レベルですが全体的に遅くなっています。何度か試すと速くなっている場合もあるのですが、外部サイトからの読み込みが多い為そこでの速度のバラつきが大きく、実環境においては管理するサーバーだけの調整ではすべての高速化が難しいことと、その測定が難しいことが分かります。
移行先Bでは高速化していますがこちらも誤差レベルかと思います。
まとめ
Amazon Linux 2 での TCP BBRの有効化方法について説明いたしました。今回の動作確認において、輻輳制御アルゴリズムであるため安定したネットワーク環境ではやはり目に見えた効果は見えません。
モバイル環境やパケットロスをエミュレーションした環境では効果が出てくるものと思われますが、実Webサイトを計測対象とすると外部からの読み込みによる速度ブレが課題として大きく、計測には十分なサンプル数をとる必要が有りそうです。予めどう計測するかを入念に検討しておく必要が有るでしょう。