本文为您介绍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
及之后的版本,彻底解决该问题。