一、背景与核心定位
TC(Traffic Control)是 Linux 内核内置的流量控制子系统,而 Netem(Network Emulator)是 TC 提供的专门用于网络故障模拟的队列规则(qdisc)模块。它无需额外安装第三方软件,直接通过内核级实现对网络流量的精确控制,是分布式系统、微服务、数据库、云原生应用可靠性测试的行业标准工具。
与之前介绍的工具形成完整测试体系:
Netem 的核心价值在于:能够在可控的实验室环境中,精确复现生产环境中可能出现的各种网络问题,验证系统在恶劣网络条件下的容错能力、熔断降级机制、数据一致性和用户体验。
二、工作原理与基础操作
2.1 工作原理
Netem 工作在 Linux 内核的网络协议栈中,位于网卡驱动和协议栈之间。它会拦截所有经过指定网络接口的数据包,根据配置的规则对数据包进行延迟、丢弃、重复、损坏、乱序等处理,然后再转发到目标地址。
Netem 是一个出站流量控制工具,默认只能控制从本机发出的流量。如果需要控制入站流量,需要配合 IFB(Intermediate Functional Block)虚拟网卡使用。
2.2 基础操作命令
bash # 查看网卡接口列表 ip link show # 为指定网卡添加 netem 队列规则(基础命令模板) tc qdisc add dev eth0 root netem [故障参数] # 查看当前 netem 配置 tc qdisc show dev eth0 # 修改现有 netem 配置(使用 change 代替 add) tc qdisc change dev eth0 root netem [新的故障参数] # 删除 netem 配置,恢复正常网络 tc qdisc del dev eth0 root |
重要说明:
三、核心网络故障模拟能力
3.1 网络延迟与抖动模拟
网络延迟是最常见的网络异常,Netem 支持模拟固定延迟、随机抖动延迟以及符合特定分布的延迟。
基础参数
参数 | 作用 | 示例 |
delay TIME | 固定延迟时间 | delay 100ms |
delay TIME JITTER | 基础延迟 + 随机抖动 | delay 100ms 20ms |
delay TIME JITTER CORRELATION | 带相关性的抖动延迟 | delay 100ms 20ms 25% |
distribution TYPE | 延迟分布类型 | distribution normal |
分布类型说明:
uniform:均匀分布(默认),抖动在范围内完全随机
normal:正态分布,大多数延迟集中在平均值附近
pareto:帕累托分布,模拟长尾延迟
paretonormal:帕累托 + 正态混合分布
常用示例
bash # 1. 固定延迟 100ms tc qdisc add dev eth0 root netem delay 100ms # 2. 基础延迟 100ms,随机抖动 ±20ms tc qdisc add dev eth0 root netem delay 100ms 20ms # 3. 带相关性的抖动延迟(25%的相关性,模拟网络延迟的连续性) tc qdisc add dev eth0 root netem delay 100ms 20ms 25% # 4. 符合正态分布的延迟(大多数延迟在 100ms 左右,少数极端值) tc qdisc add dev eth0 root netem delay 100ms 50ms distribution normal |
3.2 数据包丢失模拟
数据包丢失是分布式系统中最严重的网络故障之一,Netem 支持模拟随机丢包、突发丢包和带相关性的丢包。
基础参数
参数 | 作用 | 示例 |
loss PERCENT | 随机丢包率 | loss 1% |
loss PERCENT CORRELATION | 带相关性的丢包 | loss 5% 25% |
loss gemodel P1 P2 P3 P4 | 基于 Gilbert-Elliot 模型的突发丢包 | loss gemodel 0.1% 1% 10% 0.1% |
相关性说明:
相关性表示当前数据包丢失的概率与上一个数据包是否丢失的关联程度
0% 表示完全随机,100% 表示一旦丢包就会连续丢包
生产环境中的网络丢包通常具有一定的相关性(20%-50%)
常用示例
bash # 1. 随机丢包 1% tc qdisc add dev eth0 root netem loss 1% # 2. 带 30% 相关性的丢包 5%(模拟连续丢包) tc qdisc add dev eth0 root netem loss 5% 30% # 3. Gilbert-Elliot 突发丢包模型(模拟网络拥塞导致的突发丢包) # 参数含义:P(好→坏), P(坏→好), 好状态丢包率, 坏状态丢包率 tc qdisc add dev eth0 root netem loss gemodel 0.1% 1% 0% 50% |
3.3 数据包重复模拟
数据包重复会导致应用层收到重复请求,可能引发数据重复写入、幂等性问题等。
基础参数
参数 | 作用 | 示例 |
duplicate PERCENT | 数据包重复率 | duplicate 1% |
duplicate PERCENT CORRELATION | 带相关性的重复 | duplicate 2% 20% |
常用示例
bash # 1. 1% 的数据包重复 tc qdisc add dev eth0 root netem duplicate 1% # 2. 带 20% 相关性的 2% 数据包重复 tc qdisc add dev eth0 root netem duplicate 2% 20% |
3.4 数据包损坏模拟
数据包损坏会导致数据校验失败,触发重传或应用层错误。Netem 会随机修改数据包中的一个比特位来模拟损坏。
基础参数
参数 | 作用 | 示例 |
corrupt PERCENT | 数据包损坏率 | corrupt 0.1% |
corrupt PERCENT CORRELATION | 带相关性的损坏 | corrupt 0.5% 10% |
常用示例
bash # 1. 0.1% 的数据包损坏 tc qdisc add dev eth0 root netem corrupt 0.1% # 2. 带 10% 相关性的 0.5% 数据包损坏 tc qdisc add dev eth0 root netem corrupt 0.5% 10% |
3.5 数据包乱序模拟
数据包乱序会导致 TCP 协议触发不必要的重传,降低网络吞吐量,也可能导致应用层协议处理错误。
基础参数
参数 | 作用 | 示例 |
reorder PERCENT | 数据包乱序率 | reorder 25% |
reorder PERCENT CORRELATION | 带相关性的乱序 | reorder 25% 50% |
gap GAP | 乱序的数据包间隔 | gap 3 |
工作原理:
常用示例
bash # 1. 25% 的数据包乱序,间隔 3 个包 tc qdisc add dev eth0 root netem reorder 25% gap 3 # 2. 带 50% 相关性的 30% 数据包乱序 tc qdisc add dev eth0 root netem reorder 30% 50% gap 2 # 3. 结合延迟的乱序(更真实的网络场景) tc qdisc add dev eth0 root netem delay 100ms reorder 25% gap 3 |
3.6 带宽限制模拟
带宽限制用于模拟低带宽网络环境(如移动网络、跨地域网络),验证系统在带宽不足时的表现。
基础参数
参数 | 作用 | 示例 |
rate RATE | 最大带宽限制 | rate 10mbit |
rate RATE BURST | 带宽限制 + 突发流量 | rate 10mbit 15k |
常用示例
bash # 1. 限制带宽为 10Mbps tc qdisc add dev eth0 root netem rate 10mbit # 2. 限制带宽为 1Mbps,允许 15KB 的突发流量 tc qdisc add dev eth0 root netem rate 1mbit 15k # 3. 结合延迟和丢包的低带宽模拟(模拟 4G 网络) tc qdisc add dev eth0 root netem rate 50mbit delay 50ms 10ms loss 0.5% |
3.7 数据包重传模拟
Netem 本身不直接模拟 TCP 重传,但可以通过组合延迟、丢包、乱序来间接触发 TCP 重传。TCP 协议会在以下情况下触发重传:
数据包丢失,超时未收到 ACK
收到 3 个重复的 ACK(快速重传)
数据包乱序,导致接收窗口无法向前移动
模拟 TCP 重传的典型配置
bash # 模拟高丢包率导致的大量重传 tc qdisc add dev eth0 root netem loss 5% 30% delay 100ms 20ms # 模拟乱序导致的快速重传 tc qdisc add dev eth0 root netem reorder 30% gap 2 delay 50ms |
四、高级用法
4.1 组合多种网络故障
Netem 支持同时配置多种故障参数,模拟复杂的真实网络环境:
bash # 模拟跨地域广域网:100ms 延迟 ±20ms 抖动,1% 丢包,0.1% 损坏,10Mbps 带宽 tc qdisc add dev eth0 root netem \ delay 100ms 20ms \ loss 1% 25% \ corrupt 0.1% \ rate 10mbit |
4.2 针对特定流量过滤
默认情况下 Netem 会影响所有经过网卡的流量。可以结合 TC 的过滤器(filter)功能,只对特定 IP、端口或协议的流量生效:
bash # 1. 先添加一个根队列规则 tc qdisc add dev eth0 root handle 1: htb # 2. 创建一个子类,应用 netem 规则 tc class add dev eth0 parent 1: classid 1:1 htb rate 1000mbit tc qdisc add dev eth0 parent 1:1 netem delay 100ms loss 1% # 3. 添加过滤器,只对目标 IP 192.168.1.100 的流量生效 tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 \ match ip dst 192.168.1.100/32 flowid 1:1 # 4. 只对目标端口 3306(MySQL)的流量生效 tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 \ match ip dport 3306 0xffff flowid 1:1 |
4.3 控制入站流量
Netem 默认只能控制出站流量。如果需要控制入站流量,需要使用 IFB 虚拟网卡:
bash # 1. 加载 IFB 模块 modprobe ifb # 2. 启用 IFB 虚拟网卡 ip link set dev ifb0 up # 3. 将 eth0 的入站流量重定向到 ifb0 tc qdisc add dev eth0 ingress tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev ifb0 # 4. 在 ifb0 上应用 netem 规则(控制入站流量) tc qdisc add dev ifb0 root netem delay 100ms loss 1% |
4.4 查看与清除配置
bash # 查看当前所有队列规则 tc qdisc show # 查看指定网卡的队列规则 tc qdisc show dev eth0 # 查看过滤器规则 tc filter show dev eth0 # 清除指定网卡的所有队列规则 tc qdisc del dev eth0 root # 清除 IFB 配置 tc qdisc del dev ifb0 root ip link set dev ifb0 down rmmod ifb |
五、典型应用场景与实践
1. 分布式系统一致性测试
目标:验证分布式数据库、分布式锁、共识算法在网络分区、延迟和丢包情况下的一致性 测试方案:
bash # 模拟网络分区:在节点 A 上配置到节点 B 的丢包率 100% tc qdisc add dev eth0 root netem loss 100% # 模拟网络分区恢复:删除配置 tc qdisc del dev eth0 root # 模拟拜占庭故障:随机丢包、延迟和损坏 tc qdisc add dev eth0 root netem delay 200ms 50ms loss 10% corrupt 1% |
2. 微服务熔断降级测试
目标:验证微服务架构中的熔断、降级、限流机制是否正常工作 测试方案:
bash # 模拟服务调用超时:增加延迟到 2s tc qdisc add dev eth0 root netem delay 2000ms # 模拟服务调用失败:增加丢包率到 50% tc qdisc change dev eth0 root netem loss 50% # 模拟服务恢复:逐步降低延迟和丢包率 tc qdisc change dev eth0 root netem delay 500ms loss 10% tc qdisc change dev eth0 root netem delay 100ms loss 1% |
3. 数据库主从复制测试
目标:验证数据库主从复制在网络异常情况下的数据一致性和延迟 测试方案:
bash # 模拟主从之间的网络延迟和丢包 tc qdisc add dev eth0 root netem delay 500ms 100ms loss 2% # 模拟网络中断:丢包率 100%,持续 5 分钟 tc qdisc change dev eth0 root netem loss 100% sleep 300 tc qdisc change dev eth0 root netem loss 2% # 验证主从数据一致性和复制延迟 |
4. 移动网络模拟
目标:验证移动应用在不同网络环境下的用户体验 测试方案:
bash # 模拟 2G 网络 tc qdisc add dev eth0 root netem rate 256kbit delay 500ms 100ms loss 5% # 模拟 3G 网络 tc qdisc change dev eth0 root netem rate 2mbit delay 200ms 50ms loss 2% # 模拟 4G 网络 tc qdisc change dev eth0 root netem rate 50mbit delay 50ms 10ms loss 0.5% # 模拟网络切换:从 4G 切换到 2G tc qdisc change dev eth0 root netem rate 256kbit delay 500ms 100ms loss 5% |
六、优势与局限性
核心优势
内核级实现:性能高,对系统资源消耗极小
轻量无依赖:Linux 内核自带,无需安装任何第三方软件
精确控制:支持纳秒级延迟、万分之一级丢包率的精确配置
功能全面:覆盖所有常见的网络故障类型
灵活过滤:支持针对特定 IP、端口、协议的流量控制
局限性
平台限制:仅支持 Linux 系统,不支持 Windows 和 macOS
出站优先:默认只能控制出站流量,入站流量需要配合 IFB 模块
无应用层感知:只能模拟网络层故障,无法模拟应用层协议的故障
单机限制:原生不支持分布式集群的统一网络故障模拟
七、使用注意事项
bash # 10 分钟后自动清除配置 echo "tc qdisc del dev eth0 root" | at now + 10 minutes |
测试后清理:测试完成后务必删除所有配置,避免影响正常网络
逐步加压:从低强度故障开始逐步增加,避免一开始就压垮系统
监控配合:结合 tcpdump、Wireshark 等工具,验证故障模拟是否生效