JMeter进行网络延迟模拟、带宽限制和丢包测试,JMeter本身不有底层网络损伤能力,一般需要配合操作系统流量控制工具、代理软件或用JMeter内置组件
方案一:操作系统级流量控制
直接限制JMeter主机的网卡,可精确控制延迟、丢包率、带宽。
1. Linux-使用tc + netem
在运行 JMeter 的机器上执行(需要 root),如网卡为 eth0:
bash
# 基础延迟 200ms(抖动 ±50ms) + 5% 丢包
sudo tc qdisc add dev eth0 root netem delay 200ms 50ms loss 5%
# 再限制带宽为 1Mbit(令牌桶)
sudo tc qdisc add dev eth0 parent 1:1 handle 10: tbf rate 1mbit burst 32kbit latency 400ms
# 测试完立刻清除规则
sudo tc qdisc del dev eth0 root
组合示例(延迟200ms、抖动50ms、丢包3%、带宽2Mbit):
bash
tc qdisc add dev eth0 root handle 1: prio
tc qdisc add dev eth0 parent 1:3 handle 30: tbf rate 2mbit burst 32kbit latency 200ms
tc qdisc add dev eth0 parent 30:1 handle 31: netem delay 200ms 50ms loss 3%
2. Windows - 使用 Clumsy
下载 Clumsy(根据 WinDivert)。
勾选 Lag(延迟)、Drop(丢包)、Throttle(带宽),可设置过滤规则如 tcp.DstPort == 8080,点击 Start。
JMeter 运行时保持 Clumsy 开启即可。
3. macOS-使用Network Link Conditioner
从Xcode附加工具包中获取,安装后在系统设置中启用。
可自定义延迟、丢包、带宽配置,一键开启,JMeter流量同样受影响。
方案二:通过HTTP代理限速
在 JMeter 和目的服务之间加代理,控制传输速率和延迟,适合不修改系统网络配置的场景。
常用工具:Charles、Fiddler、Burp Suite
以Charles为例:
JMeter 的 HTTP 请求默认值中设置代理为 127.0.0.1:8888。
Charles 中启用 Throttle Settings,自定义带宽(如 256 kbps)并可设置延迟。
执行脚本,流量被限速。注意 Charles 原生不支持随机丢包,可改用 Fiddler。
Fiddler 脚本模拟延迟和丢包:在 OnBeforeResponse 中加入:
javascript
if (oSession.HostnameIs("your.test.server.com")) {
oSession["response-trickle-delay"] = "200"; // 200ms 延迟
if (Math.random() < 0.05) {
oSession.oRequest.FailSession(408, "Request Timeout", "Simulated loss");
}
}
方案三:JMeter内置组件近似模拟
不改变网络,仅通过控制请求间隔和吞吐量在思路上接近弱网效果。
模拟延迟:使用 Constant Timer(固定等待)、Gaussian Random Timer(抖动延迟)等,在请求前插入等待。
注意:这是请求间延迟,非真实网络传输延迟,但可用于观察系统整体响应能力。
模拟带宽限制:通过控制 TPS(每秒请求数)间接限制带宽。
如目的带宽 1Mbps(约128KB/s),单次请求传输数据50KB,则 TPS ≈ 2.5。可使用 Throughput Shaping Timer 设定不断 TPS 为 2.5。
模拟丢包:JMeter 自身无法随机丢弃请求,不建议用脚本随机跳过请求,会破坏业务完整性。
方案四:Docker容器内测试
如果用 Docker 运行 JMeter,可在容器内直接配置 tc:
dockerfile
jmeter:
image: justb4/jmeter:latest
cap_add:
- NET_ADMIN
command: >
sh -c "
tc qdisc add dev eth0 root netem delay 100ms loss 2% rate 512kbit &&
jmeter -n -t test.jmx -l results.jtl
"
总结建议
追求高真实度延迟、丢包和带宽限制,第一选择Linux的tc netem或Windows的Clumsy,直接作用于网卡,效果最准。
仅需带宽限制和延迟,代理工具(如 Charles)操作简单、可视化,适合单接口分析。
快速思路性延迟验证,可用 JMeter 内置定时器,但它是请求间延迟,非真实网络效果。
带宽限制,通过吞吐量整形定时器设置 TPS,需要根据请求数据量换算,适用性有限。
可重复的自动化弱网环境,推荐Docker + tc,完美融入CI/CD,结果可复现。
推荐流程:
用系统工具设计典型弱网场景(3G、4G、高延迟、高丢包)。
将限速命令封装为脚本,在 JMeter 执行前后自动设置和恢复。
如仅验证接口延迟容忍度,可叠加JMeter随机定时器,多方面观察系统表现。