问题现象描述
在使用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