网络延迟突然升高
带宽被打满
TCP 重传激增
某个下游接口偶发超时
跨机房网络抖动
而 Linux 内核其实早已提供了一套非常强大的网络控制能力:
tc(Traffic Control)
它既能做:
带宽限流
QoS
延迟控制
也能做:
丢包模拟
弱网模拟
混沌工程(Chaos Engineering)
本文将带你快速掌握:
tc 核心原理
常见限流方式
netem 弱网模拟
混沌工程实践
tc 属于 Linux iproute2 工具集。
它工作在 Linux 内核网络协议栈中:
应用程序↓TCP/IP Stack↓qdisc(队列调度器)↓网卡驱动↓NIC
tc 本质上控制的是:
数据包如何排队、发送、延迟、丢弃
核心对象:
Linux tc 最核心的能力其实只有两类:
例如:
限制带宽
QoS 优先级
防止某服务抢占带宽
核心 qdisc:TBF / HTB
例如:
延迟
丢包
抖动
乱序
核心 qdisc:netem
TBF(Token Bucket Filter)是 Linux 最经典的限流器。
核心思想:
token 按固定速率生成发送数据需要消耗 token
没有 token:
数据包进入队列等待
tc qdisc add dev eth0 root tbfrate 10mbitburst 32kbitlatency 400ms
tc -s qdisc show dev eth0tc qdisc del dev eth0 rootTBF 适合:整体限流
但企业环境通常需要:
多租户
多服务
不同优先级
带宽共享
这时需要:
HTB(Hierarchical Token Bucket)tc qdisc add dev eth0 root handle 1: htb default 20tc class add dev eth0 parent 1: classid 1:1htb rate 100mbit
tc class add dev eth0 parent 1:1 classid 1:10htb rate 50mbit ceil 100mbit prio 1
tc class add dev eth0 parent 1:1 classid 1:20htb rate 10mbit ceil 30mbit prio 2
HTB 的关键在于:
如何识别不同流量?
依赖:filter
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如果说 TBF 是限流核心,
那么:netem = 混沌工程核心
它可以模拟真实网络问题。
tc qdisc add dev eth0 root netem delay 100mstc qdisc add dev eth0 root netem \delay 100ms 20ms
表示:
100ms ± 20mstc 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%
这已经非常接近:跨国公网网络质量
Chaos Engineering 的核心思想:
主动制造故障,验证系统韧性
tc 是最轻量、最真实的网络故障模拟方案。
验证:
超时配置
重试机制
熔断策略
验证:
ISR 收缩
producer retry
follower lag
验证:
ORM 超时
连接池阻塞
线程池堆积
模拟:
上海 ↔ 新加坡美国 ↔ 亚洲
错误 tc 配置:可能直接导致网络不可用
即使:
1% loss也可能导致:TCP 吞吐量大幅下降
需要:
CAP_NET_ADMIN现代 Linux 推荐:fq_codel
用于降低 Bufferbloat。
tc 是 Linux 网络世界最强大的工具之一。
它既能:
限流
QoS
带宽管理
也能:
模拟弱网
做混沌工程
验证系统韧性
而随着:
eBPF + 云原生网络的发展,tc 已经不仅仅是一个“命令行工具”,而是:
下一代 Linux 网络数据面的核心基础设施。
tc qdisc showtc class show dev eth0tc filter show dev eth0
tc qdisc del dev eth0 roottc qdisc add dev eth0 root tbf \rate 10mbit burst 32k latency 400ms
tc qdisc add dev eth0 root netem delay 100mstc 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/