はじめに

Amazon Linux 2 で TCP BBR を有効にするにあたって調べてみると、再起動を伴う手順ばかりなので、ほんとにそうなのか検証しました。

  • 検証環境
    • OS: Amazon Linux 2 AMI
      • AMI: amzn2-ami-hvm-2.0.20190618-x86_64-gp2 (ami-0c3fd0f5d33134a76)
      • カーネル: 4.14.123-111.109.amzn2.x86_64
    • OS: Amazon Linux AMI 2018.03.0
      • AMI: amzn-ami-hvm-2018.03.0.20190611-x86_64-gp2 (ami-04b2d1589ab1d972c)
      • カーネル: 4.14.123-86.109.amzn1.x86_64

設定方法

結論から言うと、再起動せずに有効にできるようです。

sysctl の設定

# sysctl -w net.ipv4.tcp_congestion_control=bbr
# sysctl -w net.core.default_qdisc=fq

(もちろん、sysctl.conf にも書いておきましょう)

### /etc/sysctl.d/bbr.conf
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq
  • sysctl -w するだけで関連のカーネルモジュール (tcp_bbr, sch_fq) は読み込まれていたので、modprobe する必要はなさそうです。
  • 再起動するのであれば、設定はここまでで OK です。

qdisc の変更

multiqueue な NIC かどうかで手順がかわるので、まずはその確認です。

(multiqueue でない例)
# tc qdisc show
qdisc noqueue 0: dev lo root refcnt 2
qdisc pfifo_fast 0: dev eth0 root refcnt 2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1

(multiqueue な例)
# tc qdisc show
qdisc noqueue 0: dev lo root refcnt 2
qdisc mq 0: dev eth0 root
qdisc pfifo_fast 0: dev eth0 parent :2 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
qdisc pfifo_fast 0: dev eth0 parent :1 bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1

変更します。

(multiqueue でない場合)
# tc qdisc replace dev eth0 root handle 1: fq quantum 3028 initial_quantum 15140

(multiqueue な場合)
# tc qdisc replace dev eth0 root handle 1: mq
# tc qdisc replace dev eth0 parent 1:1 handle 10: fq quantum 3028 initial_quantum 15140
# tc qdisc replace dev eth0 parent 1:2 handle 20: fq quantum 3028 initial_quantum 15140
  • パラメタは、/etc/sysctl.d/bbr.conf を書いて再起動してみた検証時のものを踏襲しています。
    • 起動時に quantum は MTU の 2 倍、initial_quantum は 10 倍に設定されるようです。
    • パラメタ未指定だと大きな値になってしまいました。

確認

net.ipv4.tcp_congestion_control の確認

ss コマンドにて、 設定以後 に確立した TCP コネクションが bbr になっていれば OK です。

# ss -tni
State             Recv-Q              Send-Q                            Local Address:Port                            Peer Address:Port
ESTAB             0                   36                                  10.24.3.157:22                             203.0.113.123:48378
         bbr wscale:7,7 rto:212 rtt:9.556/10.213 ato:40 mss:1448 pmtu:9001 rcvmss:1448 advmss:8949 cwnd:36 bytes_acked:5357 bytes_received:4637 segs_out:59 segs_in:77 data_segs_out:55 data_segs_in:36 bbr:(bw:14.9Mbps,mrtt:4.306,pacing_gain:2.88672,cwnd_gain:2.88672) send 43.6Mbps lastsnd:4 lastrcv:4 lastack:4 pacing_rate 78.1Mbps delivery_rate 14.9Mbps app_limited busy:320ms unacked:1 rcv_rtt:5 rcv_space:26847 rcv_ssthresh:41423 minrtt:4.306

qdisc の確認

tc コマンドで確認

(multiqueue でない場合)
# tc qdisc show
qdisc noqueue 0: dev lo root refcnt 2
qdisc fq 1: dev eth0 root refcnt 2 limit 10000p flow_limit 100p buckets 1024 orphan_mask 1023 quantum 3028 initial_quantum 15140 low_rate_threshold 550Kbit refill_delay 40.0ms

(multiqueue な場合)
# tc qdisc show
qdisc noqueue 0: dev lo root refcnt 2
qdisc mq 1: dev eth0 root
qdisc fq 10: dev eth0 parent 1:1 limit 10000p flow_limit 100p buckets 1024 orphan_mask 1023 quantum 3028 initial_quantum 15140 refill_delay 40.0ms
qdisc fq 20: dev eth0 parent 1:2 limit 10000p flow_limit 100p buckets 1024 orphan_mask 1023 quantum 3028 initial_quantum 15140 refill_delay 40.0ms