netem 是什么
netem 是 Linux 流量控制中的网络模拟模块,用来在测试环境注入延迟、抖动、丢包与乱序,验证应用在弱网条件下的超时、重试与降级逻辑是否可靠。它通过 tc 挂在某个接口的出口队列上,因此只影响该接口的发送方向,入向流量需要另想办法。
基本信息
| 模块 | sch_netem,通过 tc 加载 |
|---|---|
| 注入延迟 | tc qdisc add dev eth0 root netem delay 100ms 20ms |
| 叠加丢包 | 在同一命令行追加 loss 1% |
| 查看 | tc qdisc show dev eth0 |
| 清理 | tc qdisc del dev eth0 root |
典型使用场景
- 验证客户端超时与重试策略在 200ms 延迟下是否合理
- 测试弱网下的降级与熔断逻辑是否按预期触发
- 验证音视频类业务在丢包与抖动下的表现
- 复现线上偶发的长尾延迟问题
- 评估数据库主从复制在链路抖动下的行为
注入与清理
注入与清理
tc qdisc add dev eth0 root netem delay 100ms 20ms # 100ms 基准延迟,抖动 20ms
tc qdisc add dev eth0 root netem loss 1% # 叠加 1% 丢包
tc qdisc show dev eth0 # 确认规则已生效
tc qdisc del dev eth0 root # 测试结束后清理
# 建议从轻到重逐档加码,记录每档下应用的表现常用参数
| 参数 | 作用 | 注意 |
|---|---|---|
| delay | 注入固定或带抖动的延迟 | 只影响出口方向 |
| loss | 按百分比丢弃报文 | 过高会掩盖真实问题 |
| duplicate | 按比例复制报文 | 用于测试重复报文的处理 |
| reorder | 按比例乱序(需配合延迟) | 不能单独使用 |
| corrupt | 按比例损坏报文 | 验证校验与容错逻辑 |
使用注意
- 只在测试环境使用,生产接口上误加规则会直接影响真实流量
- 测试脚本结束时必须删除队列,并验证已恢复
- 不要一次注入过多参数,从轻到重逐档验证
- 记录每档参数与应用表现,形成可复现的测试记录
netem 只作用于加了队列的那个接口的发送方向。要模拟双向弱网,需要在两端各自注入,或使用支持出入向分别处理的方案。
在承载生产流量的接口上执行 tc 命令会立即影响在线业务。操作前必须确认接口用途,并在维护窗口内进行,同时准备好一条删除队列的恢复命令。