Linux tc 常用命令总结(网卡限速、延迟、丢包与整形)
文章目录
- @[toc]
- 快速认知:tc 能做什么
- 核心概念与术语速记
- 基础命令速查
- 查看当前规则
- 清空/删除
- 常用 qdisc 与典型用法
- 1)netem:延迟/抖动/丢包
- 2)tbf:令牌桶限速(单速率)
- 3)htb:分层带宽管理
- Ingress 限速与 IFB(下载方向整形)
- 实战案例
- A. 一键模拟弱网(延迟 + 抖动 + 丢包)
- B. 限制上传到 8Mbit,并启用 fq_codel 保持低延迟
- C. 下载(ingress)限速到 20Mbit(IFB)
- F. 一键清理(恢复默认)
- 验证与排障技巧
- 速记清单(Cheat Sheet)
- 结语
文章目录
- @[toc]
- 快速认知:tc 能做什么
- 核心概念与术语速记
- 基础命令速查
- 查看当前规则
- 清空/删除
- 常用 qdisc 与典型用法
- 1)netem:延迟/抖动/丢包
- 2)tbf:令牌桶限速(单速率)
- 3)htb:分层带宽管理
- Ingress 限速与 IFB(下载方向整形)
- 实战案例
- A. 一键模拟弱网(延迟 + 抖动 + 丢包)
- B. 限制上传到 8Mbit,并启用 fq_codel 保持低延迟
- C. 下载(ingress)限速到 20Mbit(IFB)
- F. 一键清理(恢复默认)
- 验证与排障技巧
- 速记清单(Cheat Sheet)
- 结语
- 适用系统:大多数 Linux(内核已启用
tc
、sch_*
、act_*
模块) - 涉及组件:
qdisc
(队列规则)、class
(类)、filter
(过滤器)、action
(动作)
快速认知:tc 能做什么
- 带宽整形:限制速率、突发(burst)、峰值(peakrate)
- 时延模拟:固定延迟、抖动(jitter)
- 丢包/乱序/损坏:模拟弱网、移动网络
- 队列管理:公平队列、主动队列管理(AQM)降低 bufferbloat
- 按流分类:基于 ip/port/proto 等进行不同带宽/优先级
核心概念与术语速记
- qdisc(queueing discipline):挂在某网卡的 egress/ingress 上的队列规则。
- class:在 classful qdisc(如 HTB)下的子队列,便于做分层与分配。
- filter:流量分类器,把包分到某个 class,或触发某个 action。
- handle/parent:句柄与父子关系,如
1:
、1:10
。根通常是root
或ingress
。 - egress/ingress:
- egress(发出/上传)通常直接整形。
- ingress(进入/下载)常用 policer 或配合 IFB 做“伪 egress”整形。
- ifb(Intermediate Functional Block):虚拟网卡,用于把 ingress 重定向后作为 egress 整形。
基础命令速查
查看当前规则
# 查看网卡 egress 的 qdisc
sudo tc qdisc show dev eth0# 查看 class(以 HTB 为例)
sudo tc class show dev eth0# 查看 filter(包含 match 条件与去向)
sudo tc filter show dev eth0
清空/删除
# 删除根 qdisc(恢复内核默认)
sudo tc qdisc del dev eth0 root# 删除 ingress qdisc
sudo tc qdisc del dev eth0 ingress
提示:若提示“没有此对象”,说明当前并未设置对应 qdisc。
常用 qdisc 与典型用法
1)netem:延迟/抖动/丢包
最适合模拟弱网,默认作用于 egress。
# 固定延迟 100ms
sudo tc qdisc add dev eth0 root netem delay 100ms# 延迟 100ms,抖动 20ms,相关性 25%
sudo tc qdisc replace dev eth0 root netem delay 100ms 20ms 25%# 丢包 2%
sudo tc qdisc replace dev eth0 root netem loss 2%# 丢包 1%,相关性 25%
sudo tc qdisc replace dev eth0 root netem loss 1% 25%# 组合:延迟 + 丢包 + 抖动
sudo tc qdisc replace dev eth0 root netem delay 80ms 10ms 20% loss 1%# 取消
sudo tc qdisc del dev eth0 root
易错点:netem
并不做限速;它是时延/丢包/乱序等“质量”模拟。
2)tbf:令牌桶限速(单速率)
适合简单、稳定的限速。关键参数:rate
、burst
(桶大小)、latency
(排队上限)。
# 将上传(egress)限速到 10Mbit,桶 32KB,最大等待 400ms
sudo tc qdisc add dev eth0 root tbf rate 10mbit burst 32kbit latency 400ms# 调整为 20Mbit
sudo tc qdisc replace dev eth0 root tbf rate 20mbit burst 64kbit latency 400ms# 取消
sudo tc qdisc del dev eth0 root
技巧:burst
过小会导致速度“上不去”或抖动大;合理取值一般为几倍 MTU 到几十 KB。
3)htb:分层带宽管理
支持 class 树与最小/最大带宽(rate
/ceil
)。适合多业务/多 IP/端口的带宽分配。
# 根 qdisc
tc qdisc add dev eth0 root handle 1: htb default 30# 根 class,带宽上限 100Mbit
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit# 子类:视频流(保证 60M,上限 100M)
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 60mbit ceil 100mbit# 子类:普通业务(保证 20M,上限 60M)
sudo tc class add dev eth0 parent 1:1 classid 1:20 htb rate 20mbit ceil 60mbit# 默认类(兜底 5M,上限 20M)
sudo tc class add dev eth0 parent 1:1 classid 1:30 htb rate 5mbit ceil 20mbit# 过滤:把目的端口 1935(RTMP)流量打到 1:10
sudo tc filter add dev eth0 parent 1: protocol ip prio 1 \u32 match ip dport 1935 0xffff flowid 1:10# 过滤:把源网段 10.0.0.0/24 打到 1:20
sudo tc filter add dev eth0 parent 1: protocol ip prio 2 \u32 match ip src 10.0.0.0/24 flowid 1:20# 查看
sudo tc -s class show dev eth0
备注:
u32
过滤器简单直接;更复杂可用flower
(支持 IPv6/VLAN/TCP flags 等)。
Ingress 限速与 IFB(下载方向整形)
ingress 端无法像 egress 一样“排队后再发”,常见两种做法:
1)policer:超速即丢(或标记),实现简单但体验差。
# 对下载方向做 policer,超过 50Mbit 的直接丢弃
sudo tc qdisc add dev eth0 handle ffff: ingress
sudo tc filter add dev eth0 parent ffff: protocol ip prio 1 \u32 match u32 0 0 police rate 50mbit burst 100k drop flowid :1
2)IFB:把 ingress 重定向到 ifb0
,再在 ifb0
的 egress 上用 tbf/htb 整形(用户体验更好)。
# 启动 IFB
action_ifb() {sudo modprobe ifbsudo ip link add ifb0 type ifb || truesudo ip link set ifb0 up# 把 eth0 的 ingress 重定向到 ifb0sudo tc qdisc add dev eth0 handle ffff: ingress 2>/dev/null || truesudo tc filter add dev eth0 parent ffff: protocol ip prio 1 \u32 match u32 0 0 action mirred egress redirect dev ifb0
}# 对下载做 30M 限速(在 ifb0 的 egress 使用 tbf)
sudo tc qdisc add dev ifb0 root tbf rate 30mbit burst 64kbit latency 400ms# 恢复
sudo tc qdisc del dev ifb0 root
sudo tc qdisc del dev eth0 ingress
实战案例
A. 一键模拟弱网(延迟 + 抖动 + 丢包)
sudo tc qdisc replace dev eth0 root netem delay 120ms 30ms 25% loss 1%
B. 限制上传到 8Mbit,并启用 fq_codel 保持低延迟
sudo tc qdisc replace dev eth0 root handle 1: htb default 20
sudo tc class replace dev eth0 parent 1: classid 1:1 htb rate 8mbit ceil 8mbit
C. 下载(ingress)限速到 20Mbit(IFB)
sudo modprobe ifb
sudo ip link add ifb0 type ifb || true
sudo ip link set ifb0 up
sudo tc qdisc add dev eth0 handle ffff: ingress 2>/dev/null || true
sudo tc filter add dev eth0 parent ffff: protocol ip prio 1 \u32 match u32 0 0 action mirred egress redirect dev ifb0
sudo tc qdisc add dev ifb0 root tbf rate 20mbit burst 64kbit latency 400ms
F. 一键清理(恢复默认)
sudo tc qdisc del dev eth0 root 2>/dev/null || true
sudo tc qdisc del dev eth0 ingress 2>/dev/null || true
sudo tc qdisc del dev ifb0 root 2>/dev/null || true
验证与排障技巧
- 用
tc -s qdisc show dev eth0
查看统计(-s
显示字节/包数与丢包统计)。 - 配合
iperf3
验证吞吐、ping
/mtr
验证时延、curl -w
观测首包时间。 tcpdump
/wireshark
观察乱序、重传与 ECN 标记。- 常见问题:
- 设了下载限速不生效:是否使用了 IFB?仅在 egress 生效会造成误判。
- 速率跑不满:
burst
太小或 CPU 不足;检查latency
、MTU 与网卡 offload。 - 多次叠加 qdisc:注意
root
/parent
层级是否正确,避免被后续replace
覆盖。
速记清单(Cheat Sheet)
# 查看现状
sudo tc -s qdisc show dev eth0# egress 限速:tbf
sudo tc qdisc replace dev eth0 root tbf rate 10mbit burst 32kbit latency 400ms# 弱网模拟:netem(延迟+丢包)
sudo tc qdisc replace dev eth0 root netem delay 100ms 20ms 25% loss 1%# Ingress policer(超速丢)
sudo tc qdisc add dev eth0 handle ffff: ingress
sudo tc filter add dev eth0 parent ffff: protocol ip prio 1 \u32 match u32 0 0 police rate 50mbit burst 100k drop flowid :1# IFB 下载限速(重定向后整形)
sudo modprobe ifb && sudo ip link add ifb0 type ifb && sudo ip link set ifb0 up
sudo tc qdisc add dev eth0 handle ffff: ingress
sudo tc filter add dev eth0 parent ffff: protocol ip prio 1 \u32 match u32 0 0 action mirred egress redirect dev ifb0
sudo tc qdisc add dev ifb0 root tbf rate 20mbit burst 64kbit latency 400ms# 清理
sudo tc qdisc del dev eth0 root; sudo tc qdisc del dev eth0 ingress; sudo tc qdisc del dev ifb0 root
结语
- 开发/联调:
netem
还原弱网; - 线上整形:
tbf/htb
保证关键业务; - 降延迟:默认使用
fq_codel
优化排队时延; - 下载限速:优先选择 IFB 方案获得更好体验。