Linux VPSでTCP BBRを有効化する方法(Debian・Ubuntu・CentOS・Rocky Linux)
TCP BBRはGoogleが開発した輻輳制御アルゴリズムで、Linuxカーネル4.9以降に標準で含まれています。JUSTGのヨハネスブルグやモスクワのVPSからアジアのユーザーへ配信するような遅延の大きい長距離回線では、標準のCUBICはわずかなパケットロスでも送信速度を大きく下げてしまいます。BBRは経路の実際の帯域と往復遅延を推定して送信するため、Webサイト、ダウンロード、API、ファイル転送のTCPスループットが改善することが多いです。本記事では、Debian、Ubuntu、CentOS、Rocky Linux、AlmaLinuxでsysctlを使ってTCP BBRを有効化し、動作を確認する手順を説明します。
長距離回線でTCP BBRが効果的な理由
CUBICのようなロスベースのアルゴリズムは、パケットロスを輻輳とみなして送信レートを下げます。遅延が150〜300msある大陸間の経路では、下げたレートが回復するまでに時間がかかり、1本の接続ではサーバーの帯域を使い切れません。BBRはボトルネック帯域と最小往復時間をモデル化し、それに合わせてパケットを送り出します。変わるのはサーバー側の送信方法だけなので、閲覧者側での設定は不要です。
ステップ1:カーネルバージョンと仮想化方式を確認する
rootまたはsudo権限のあるユーザーでVPSにログインし、カーネルを確認します。BBRには4.9以上が必要です。Debian 11/12、Ubuntu 20.04/22.04/24.04、Rocky Linux 8/9、AlmaLinux 8/9などの現行版は条件を満たしています。
uname -r
systemd-detect-virt
systemd-detect-virtがkvm、xen、vmwareを返せば、カーネルを自分で管理できるので次へ進めます。OpenVZやLXCのコンテナではホストのカーネルを共有しているため、コンテナ内からBBRを有効にすることはできません。
ステップ2:BBRモジュールが使えるか確認する
利用可能な輻輳制御アルゴリズムを表示し、bbrがなければモジュールを読み込みます。
sysctl net.ipv4.tcp_available_congestion_control
modprobe tcp_bbr
sysctl net.ipv4.tcp_available_congestion_control
通常はnet.ipv4.tcp_available_congestion_control = reno cubic bbrのように表示されます。modprobeでモジュールが見つからない場合はカーネルが古すぎるため、ステップ6を参照してください。
ステップ3:sysctlでTCP BBRを有効にする
BBRはfq(Fair Queue)キュー方式と組み合わせるのが推奨です。再起動後も設定が残り、後から削除しやすいよう専用の設定ファイルを作成します。コマンドはDebian/UbuntuとCentOS/Rocky/AlmaLinuxで共通です。
printf 'net.core.default_qdisc=fq\nnet.ipv4.tcp_congestion_control=bbr\n' | sudo tee /etc/sysctl.d/99-bbr.conf
sudo sysctl --system
新しい接続には即座に反映され、再起動は不要です。既存の接続は張り直すまで元のアルゴリズムのままです。
ステップ4:BBRが有効になったか確認する
次のコマンドで確認します。
sysctl net.ipv4.tcp_congestion_control
sysctl net.core.default_qdisc
lsmod | grep bbr
net.ipv4.tcp_congestion_control = bbrとnet.core.default_qdisc = fqが表示されれば成功です。lsmodでは通常tcp_bbrを含む行が出ますが、BBRがモジュールではなくカーネルに組み込まれている場合は何も表示されません。sysctlの値がbbrなら問題ありません。実際の接続で使われているかはss -tiの出力でbbrを探すと確認できます。
ステップ5:効果を測定する
サーバーから遠いクライアント(例:ヨハネスブルグのVPSに対するアジアの端末)から、有効化の前後でスループットを比較します。iperf3を使う方法が簡単です。
# Debian / Ubuntu
apt install -y iperf3
# CentOS / Rocky / AlmaLinux
dnf install -y iperf3
# サーバー側
iperf3 -s
# クライアント側(サーバーのIPに置き換え)
iperf3 -c 203.0.113.10 -t 30 -R
ファイアウォールのTCP 5201番ポートはテスト中だけ開放してください。時間帯やクライアント側の回線で結果は変わるため、複数回測定して比較しましょう。
/etc/sysctl.d/99-bbr.confを削除し、sysctl -w net.ipv4.tcp_congestion_control=cubicとsysctl --systemを実行します。ステップ6:非常に古いカーネルの場合(旧来の方法)
CentOS 6/7(カーネル2.6/3.10)やDebian 8などの古いOSにはBBRが含まれていません。以前はTeddysun氏によるワンクリックスクリプトがよく使われ、新しいメインラインカーネルの導入とBBRの有効化を一度に行っていました(OpenVZは非対応)。現在この方法は旧来のものとして扱っています。サポートが終了したディストリビューションでカーネルを入れ替えると、VPSが起動しなくなったり、セキュリティ更新を受けられなかったりするためです。データをバックアップし、クライアントエリアから現行バージョンのOSでVPSを再インストールしてから、ステップ1〜4を行うことをおすすめします。
よくある質問
OpenVZでTCP BBRは使えますか?
使えません。OpenVZなどのコンテナ環境はホストとカーネルを共有するため、ゲスト内で輻輳制御を変更できません。JUSTGのクラウドサーバーは完全仮想化なので、ステップ1〜4がそのまま使えます。
BBRでUDP通信も速くなりますか?
なりません。BBRが影響するのはサーバーが送信するTCP接続だけで、UDPのサービスや受信方向の通信は変わりません。
クライアント側でもBBRを有効にする必要がありますか?
不要です。送信側で有効にすれば十分で、Webサーバーやダウンロードサーバーであれば送信側はVPSです。
この手順で解決しない場合は、チケットを送信してJUSTGテクニカルサポートにお問い合わせください。