首页/系统/Linux 内核与性能调优速查/netem 延迟与丢包模拟
网络栈调优98 条

netem 延迟与丢包模拟

在测试环境用 netem 注入延迟、丢包与乱序, 验证应用在弱网下的超时与重试逻辑。

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 命令会立即影响在线业务。操作前必须确认接口用途,并在维护窗口内进行,同时准备好一条删除队列的恢复命令。

易错点

  • 在生产接口误加规则,直接影响真实流量
  • 测试结束后忘记删除队列,后续测量数据被污染且难以察觉
  • 只注入延迟不考虑抖动,得出的结论过于理想
  • 用极高的丢包率做测试,问题被淹没在一堆无关错误里

数据来源与参考

  • man tc-netem
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌