Amazon Linux 2 で再起動せずに TCP BBR を有効にする
はじめに
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
- OS: Amazon Linux 2 AMI
設定方法
結論から言うと、再起動せずに有効にできるようです。
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