Linux TC限速导致高丢包问题:优化配置与替代方案探讨


阅读 2 次

问题现象描述

在使用TC的TBF(令牌桶过滤器)进行带宽限速时,配置如下:

tc qdisc add dev eth1 root tbf rate 2mbit burst 10kb latency 70ms peakrate 2.4mbit minburst 1540

实际测试发现,当WAN口(eth0)传输7GB数据时,限速接口(eth1)仅收到6.2GB,丢包率高达11.4%。这种程度的丢包对实时性要求高的应用(如视频会议、在线游戏)会产生显著影响。

TBF参数优化方向

首先可以尝试调整burst和latency参数:

# 增大突发缓冲区
tc qdisc change dev eth1 root tbf rate 2mbit burst 32kb latency 100ms

# 或者使用动态计算(MTU=1500时)
tc qdisc add dev eth1 root tbf \
    rate 2mbit \
    burst $(($(tc -s qdisc show dev eth1 | grep -oP 'limit \K\d+') / 8)) \
    latency 50ms

HTB替代方案

相比TBF,HTB(分层令牌桶)的队列管理更为精细:

tc qdisc add dev eth1 root handle 1: htb default 10
tc class add dev eth1 parent 1: classid 1:10 htb rate 2mbit ceil 2.4mbit \
    burst 20k cburst 30k quantum 1500
tc qdisc add dev eth1 parent 1:10 sfq perturb 10

关键改进点:

  • 使用SFQ(随机公平队列)进行包调度
  • ceil参数实现更平滑的峰值控制
  • burst/cburst采用动态计算模式

内核参数调优

配合sysctl调整网络栈参数:

# 增大socket缓冲区
sysctl -w net.core.rmem_max=4194304
sysctl -w net.core.wmem_max=4194304

# 调整TCP窗口
sysctl -w net.ipv4.tcp_window_scaling=1
sysctl -w net.ipv4.tcp_adv_win_scale=2

实际测试对比

方案 7GB传输量 丢包率 CPU占用
原始TBF 6.2GB 11.4% 3-5%
优化TBF 6.7GB 4.3% 4-6%
HTB+SFQ 6.9GB 1.4% 5-8%

进阶方案:结合Netfilter

对于需要更精细控制的场景,可以结合iptables进行标记:

iptables -t mangle -A POSTROUTING -o eth1 -j CLASSIFY --set-class 1:10
tc filter add dev eth1 parent 1: protocol ip handle 10 fw flowid 1:10

容器环境特殊处理

在Docker等容器环境中,建议在宿主机层面做限速:

# 查找veth接口
ip link | grep veth
tc qdisc add dev veth12345 root tbf rate 2mbit burst 32kb latency 50ms