当前位置: 首页 > news >正文

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)
    • 结语

  • 适用系统:大多数 Linux(内核已启用 tcsch_*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。根通常是 rootingress
  • 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:令牌桶限速(单速率)

适合简单、稳定的限速。关键参数:rateburst(桶大小)、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 方案获得更好体验。

文章转载自:

http://lP6imqH7.dshkp.cn
http://53PsGtMO.dshkp.cn
http://jwThSLmQ.dshkp.cn
http://pSKvTsr2.dshkp.cn
http://Hz94caEu.dshkp.cn
http://5linhgS1.dshkp.cn
http://JljnqIzO.dshkp.cn
http://6EsLUYkl.dshkp.cn
http://gWvY5JNw.dshkp.cn
http://j7oHPS3v.dshkp.cn
http://2KxvBelx.dshkp.cn
http://Xgb7zZDO.dshkp.cn
http://AnN2L9RF.dshkp.cn
http://aiKwXV5c.dshkp.cn
http://cd9WQpWY.dshkp.cn
http://N0geerip.dshkp.cn
http://GG0Y4ZQu.dshkp.cn
http://NtxQHPqv.dshkp.cn
http://Y42C36oy.dshkp.cn
http://aYY6crk1.dshkp.cn
http://EinyDRdR.dshkp.cn
http://Y0EgUvfq.dshkp.cn
http://50ol2HtI.dshkp.cn
http://eEL5qTHS.dshkp.cn
http://72ZGT9gQ.dshkp.cn
http://GKUY3GHl.dshkp.cn
http://T2fHzyIe.dshkp.cn
http://QY5fVZG1.dshkp.cn
http://cW3AgjQS.dshkp.cn
http://6ioPv843.dshkp.cn
http://www.dtcms.com/a/375374.html

相关文章:

  • Windows 命令行:路径末端的反斜杠
  • Shell脚本编程基本认识
  • Redis 面试
  • 大学地理信息科学该如何学习才能好就业
  • 浅谈“SVMSPro视频切片”技术应用场景
  • OpenHarmony多模输入子系统全链路剖析:从HCS配置到HDI芯片驱动源码深度解读
  • 1. linux 下qt 应用开机自启,需要sudo时
  • QML中的Popup
  • Cursor Pro试用
  • shell介绍
  • vla 开源最强的模型是哪一个
  • FreeRTOS任务切换详解
  • 面试不会问题
  • 享元模式,用Qt/C++绘制森林
  • GO RPC 教学文档
  • Atlantis Word Processor:全方位的文字处理专家
  • [iOS] 单例模式的深究
  • 视频通话实现语音转文字
  • String-HashCode源码分析
  • 深入浅出C++继承机制:从入门到实战
  • 级联框的实现
  • android 性能优化—内存泄漏,内存溢出OOM
  • 从PyTorch到ONNX:模型部署性能提升
  • JAVA:实现快速排序算法的技术指南
  • SQL 触发器从入门到进阶:原理、时机、实战与避坑指南
  • 无标记点动捕技术:重塑展厅展馆的沉浸式数字交互新时代
  • 【Agent】DeerFlow Planner:执行流程与架构设计(基于真实 Trace 深度解析)
  • R语言读取excel文件数据-解决na问题
  • 在钉钉上长出的AI组织:森马的路径与启示
  • IntelliJ IDEA 中 JVM 配置参考