tc工具基础架构与工作原理
Linux内核的流量控制子系统由qdisc(队列规则
)、class(分类器)和filter(过滤器)三大组件构成。tc作为用户空间配置工具,通过netlink接口与内核交互,支持HTB(Hierarchy Token Bucket
)、CBQ(Class Based Queuing)等多种队列规则。在VPS环境中,典型的应用场景是为SSH、HTTP等关键服务保留最低带宽,同时限制大流量应用如文件传输的峰值速率。系统通过令牌桶算法实现带宽整形,每个令牌代表特定字节数的传输权限,这种机制能平滑突发流量,避免网络拥塞。
HTB分层令牌桶配置实战
创建HTB根队列是流量控制的起点,命令tc qdisc add dev eth0 root handle 1: htb default 20
将eth0网卡的根队列设置为HTB类型。其中default参数指定未分类流量的默认子类。接下来需要定义带宽上限:tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit
设置总带宽为100Mbps。针对具体服务分配带宽时,如要为Web服务保留20Mbps,可创建子类tc class add dev eth0 parent 1:1 classid 1:10 htb rate 20mbit ceil 30mbit
,其中ceil参数允许临时突破限制。
流量分类与过滤器绑定
基于端口的流量分类是最常用方法,使用u32过滤器将SSH流量定向到专用队列:tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 22 0xffff flowid 1:10
。对于需要深度包检测的场景,可以结合cgroup或fwmark实现更复杂的分类逻辑。多租户VPS环境中,建议为每个用户分配独立的classid,通过tc filter add dev eth0 parent 1:0 protocol ip handle 100 fw flowid 1:20
这样的规则实现基于标记的流量路由。
突发流量控制与延迟优化
合理配置burst参数能改善TCP性能,tc class change dev eth0 parent 1:1 classid 1:30 htb rate 10mbit burst 15k cburst 20k
允许短时间内突破速率限制。对于实时性要求高的语音流量,应采用PRIO队列优先调度:tc qdisc add dev eth0 parent 1:30 handle 30: prio bands 3
。监控环节不可忽视,tc -s qdisc ls dev eth0
命令可查看各队列的丢包统计,而tc class show dev eth0
则显示带宽使用详情。
典型VPS带宽管理方案
针对KVM虚拟化环境,建议在宿主机和虚拟机两个层面实施流量控制。宿主机上使用ifb(Intermediate Functional Block)设备镜像虚拟网卡流量:tc qdisc add dev eth0 handle ffff: ingress
后,通过tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0
重定向到ifb设备管理。虚拟机内部则可设置分层限速,将80%带宽分配给业务系统,剩余带宽用于管理通道。云服务商常用的"突发带宽"特性,实际是通过动态调整ceil参数实现的。
常见问题排查与性能调优
当发现限速规则未生效时,检查命令语法是否正确,特别是handle和parent参数的层级关系。网络延迟异常增大往往源于缓冲区设置不当,可尝试调整tc qdisc add dev eth0 root netem delay 50ms
这样的网络模拟参数。对于高并发连接场景,需要优化队列长度避免丢包:tc qdisc add dev eth0 parent 1:10 pfifo limit 1000
。值得注意的是,tc规则在重启后会丢失,需将配置写入/etc/rc.local或使用network-scripts持久化保存。