本文為您介紹Alibaba Cloud Linux 2系統中TCP擁塞控制算法BBR(Bottleneck Bandwidth and RTT)對網絡性能有影響的原因及解決方案。
問題描述
符合下列條件的ECS實例中,內核TCP擁塞控制算法默認為BBR算法。該算法會在CPU使用率高、網絡數據包(PPS)高的情況下,對網絡性能產生一定影響。例如,Redis數據庫的性能降低。
鏡像:
aliyun_2_1903_64_20G_alibase_20190619.vhd
及之前所有的鏡像版本。內核:
kernel-4.19.48-14.al7
及之前所有的內核版本。
問題原因
Alibaba Cloud Linux 2系統的內核TCP擁塞控制目前支持Reno 、BBR、cubic三種算法,在不同網絡場景下,控制性能會有差異。BBR算法估算當前連接的BW(吞吐)和RTT(時延)以調整擁塞窗口。BBR算法依賴于TCP連接的封裝(pacing)功能,而TCP的封裝實現有下列兩種方式:
若網卡設備使用qdisc的tc-fq(Fair Queue Traffic Policing)調度,則直接復用tc-fq調度中基于流的封裝。
若網卡設備沒有使用qdisc的tc-fq調度,則TCP改用其內部的封裝方式。
TCP協議內部的封裝方式依賴于Linux系統的高精度計時器(hrtimer),每個連接的高精度計時器會額外增加CPU消耗。在CPU使用率和網絡PPS均高的情況下,BBR算法對網絡性能的影響更加明顯。在CPU空閑并且網絡PPS低的情況下,影響不大。
解決方案
請參考下列TCP擁塞控制算法的建議,選擇符合您業務實際情況的解決方式。
修改TCP擁塞控制算法。
如果ECS實例中的應用僅對內網提供服務,建議參考下列命令,修改TCP擁塞控制算法為cubic。因為內網環境帶寬高、時延低。
sysctl -w net.ipv4.tcp_congestion_control=cubic sh -c "echo 'net.ipv4.tcp_congestion_control=cubic'" >> /etc/sysctl.d/50-aliyun.conf
修改相應網卡的調度策略。
如果ECS實例中的應用對外提供服務,建議繼續使用BBR算法,但需要將相應網卡的調度策略修改為tc-fq。修改的命令如下。
tc qdisc add dev <$Dev> root fq
說明<$Dev>指需要調整的網卡名稱。
使用BBR算法時,不建議使用其他非tc-fq的調度策略。因為這樣會占用更多額外的CPU資源。
建議您升級ECS實例的內核至
kernel-4.19.57-15.al7
及之后的版本,徹底解決該問題。