当前位置:首页>Linux>Linux tc实战指南:限流、丢包、延迟与混沌工程

Linux tc实战指南:限流、丢包、延迟与混沌工程

  • 2026-10-11 08:08:44
Linux tc实战指南:限流、丢包、延迟与混沌工程

在很多线上故障中,真正的问题并不是服务崩溃,而是:

  • 网络延迟突然升高

  • 带宽被打满

  • TCP 重传激增

  • 某个下游接口偶发超时

  • 跨机房网络抖动

而 Linux 内核其实早已提供了一套非常强大的网络控制能力:

tc(Traffic Control)

它既能做:

  • 带宽限流

  • QoS

  • 延迟控制

也能做:

  • 丢包模拟

  • 弱网模拟

  • 混沌工程(Chaos Engineering)

本文将带你快速掌握:

  • tc 核心原理

  • 常见限流方式

  • netem 弱网模拟

  • 混沌工程实践


一、tc 是什么?

tc 属于 Linux iproute2 工具集。

它工作在 Linux 内核网络协议栈中:

应用程序   ↓TCP/IP Stack   ↓qdisc(队列调度器)   ↓网卡驱动   ↓NIC

tc 本质上控制的是:

数据包如何排队、发送、延迟、丢弃

核心对象:

组件
作用
qdisc
队列调度器
class
流量分类
filter
流量匹配规则

二、最常见的 tc 场景

Linux tc 最核心的能力其实只有两类:

1. 流量控制(Traffic Shaping)

例如:

  • 限制带宽

  • QoS 优先级

  • 防止某服务抢占带宽

核心 qdisc:TBF / HTB


2. 弱网模拟(Network Emulation)

例如:

  • 延迟

  • 丢包

  • 抖动

  • 乱序

核心 qdisc:netem


三、最常见限流:TBF

TBF(Token Bucket Filter)是 Linux 最经典的限流器。

核心思想:

token 按固定速率生成发送数据需要消耗 token

没有 token:

数据包进入队列等待


1. 限制带宽为 10Mbps

tc qdisc add dev eth0 root tbf   rate 10mbit   burst 32kbit   latency 400ms

2. 查看规则

tc -s qdisc show dev eth0

3. 删除规则

tc qdisc del dev eth0 root

4. 参数解释

参数
含义
rate
限速
burst
突发流量桶大小
latency
最大排队等待时间

四、企业级 QoS:HTB

TBF 适合:整体限流

但企业环境通常需要:

  • 多租户

  • 多服务

  • 不同优先级

  • 带宽共享

这时需要:

HTB(Hierarchical Token Bucket)

示例:高低优先级带宽

创建根队列

tc qdisc add dev eth0 root handle 1: htb default 20

总带宽 100Mbps

tc class add dev eth0 parent 1: classid 1:1   htb rate 100mbit

高优先级流量

tc class add dev eth0 parent 1:1 classid 1:10   htb rate 50mbit ceil 100mbit prio 1

低优先级流量

tc class add dev eth0 parent 1:1 classid 1:20   htb rate 10mbit ceil 30mbit prio 2

五、filter:流量分类

HTB 的关键在于:

如何识别不同流量?

依赖:filter


按 IP 分类

tc filter add dev eth0 protocol ip parent 1:0 \  prio 1 u32 \  match ip dst 10.0.0.10 flowid 1:10

按端口分类

match ip dport 443 0xffff

六、netem:弱网与混沌工程神器

如果说 TBF 是限流核心,

那么:netem = 混沌工程核心

它可以模拟真实网络问题。


七、模拟网络延迟

固定延迟

tc qdisc add dev eth0 root netem delay 100ms

模拟网络抖动

tc qdisc add dev eth0 root netem \  delay 100ms 20ms

表示:

100ms ± 20ms

八、模拟丢包

10% 丢包

tc qdisc add dev eth0 root netem loss 10%

随机丢包

tc qdisc add dev eth0 root netem \  loss random 5%

九、模拟复杂弱网

真实网络问题通常是组合故障。

例如:

tc qdisc add dev eth0 root netem \  delay 80ms 20ms \  loss 5% \  reorder 10%

这已经非常接近:跨国公网网络质量


十、tc 在混沌工程中的应用

Chaos Engineering 的核心思想:

主动制造故障,验证系统韧性

tc 是最轻量、最真实的网络故障模拟方案。


常见演练场景

1. Redis 网络抖动

验证:

  • 超时配置

  • 重试机制

  • 熔断策略


2. Kafka 丢包

验证:

  • ISR 收缩

  • producer retry

  • follower lag


3. MySQL 高延迟

验证:

  • ORM 超时

  • 连接池阻塞

  • 线程池堆积


4. 跨机房 RTT

模拟:

上海 ↔ 新加坡美国 ↔ 亚洲

十一、生产环境注意事项

1. 先测试再上线

错误 tc 配置:可能直接导致网络不可用


2. 丢包影响巨大

即使:

1% loss

也可能导致:TCP 吞吐量大幅下降


3. 容器需要权限

需要:

CAP_NET_ADMIN

4. 推荐 fq_codel

现代 Linux 推荐:fq_codel

用于降低 Bufferbloat。


十二、总结

tc 是 Linux 网络世界最强大的工具之一。

它既能:

  • 限流

  • QoS

  • 带宽管理

也能:

  • 模拟弱网

  • 做混沌工程

  • 验证系统韧性

而随着:

eBPF + 云原生网络的发展,

tc 已经不仅仅是一个“命令行工具”,而是:

下一代 Linux 网络数据面的核心基础设施。


附录:常用 tc 命令速查

查看规则

tc qdisc showtc class show dev eth0tc filter show dev eth0

删除规则

tc qdisc del dev eth0 root

限流

tc qdisc add dev eth0 root tbf \  rate 10mbit burst 32k latency 400ms

延迟模拟

tc qdisc add dev eth0 root netem delay 100ms

丢包模拟

tc qdisc add dev eth0 root netem loss 5%
参考链接:
https://man7.org/linux/man-pages/man8/tc.8.htmlhttps://man7.org/linux/man-pages/man8/tc-netem.8.htmlhttps://tldp.org/HOWTO/html_single/Traffic-Control-HOWTO/
文章推荐
ss比netstat更好的Linux网络排障工具
从应用到网卡:Linux网络栈7层排查全景图

最新文章

随机文章