真实网络抖动需连续采样分析p95/p99延迟而非单次ping平均值;iperf3脚本化测带宽应取瞬时速率标准差;压力测试须参数化控制并发、包大小等变量;tc命令可精准模拟弱网环境。

用 ping 和 subprocess 捕获真实延迟波动
单纯调用一次 ping 得到的平均值毫无压力测试意义。真实网络抖动要看连续采样下的分布——比如 100 次 ping -c 100 google.com 可能返回 20–300ms 的跳跃值,但脚本里若只取 avg= 后面那个数字,就丢掉了关键的 P95/P99 延迟信息。
实操建议:
- 用
subprocess.run(['ping', '-c', '50', '-i', '0.2', target], capture_output=True, text=True)控制发包频率(-i 0.2避免被目标限速) - 解析 stdout 时别信
min/avg/max/mdev行——它可能被本地 ICMP 限速干扰;逐行匹配'time='提取每个包的time=xx.x ms更可靠 - 记录每轮 50 个样本的
max()和percentile(data, 95),比单次avg更反映用户体验底线
用 iperf3 脚本化测带宽而非依赖网页工具
浏览器测速跑的是 HTTP 下载,受 CDN、缓存、TCP 拥塞控制影响极大;真正压测链路能力得用 iperf3 这类底层 TCP/UDP 工具,且必须两端都装好服务端和客户端。
实操建议:
- 先在远端机器运行
iperf3 -s -p 5201(注意防火墙放行端口),本地脚本调用iperf3 -c {server_ip} -p 5201 -t 30 -i 2 -J,-J输出 JSON 方便解析 -
-t 30是最低有效时长——少于 10 秒的测试结果常因 TCP 慢启动失真;-i 2每 2 秒输出瞬时速率,避免只看最终平均值 - 解析 JSON 时重点看
intervals数组里的每个sum.bits_per_second,计算标准差比盯住end.sum.bits_per_second更能发现带宽抖动
避免把“自动化”做成定时重跑脚本
真正的压力测试需要变量控制:并发连接数、包大小、协议类型(TCP vs UDP)、持续时间梯度。硬编码 for i in range(5): run_iperf_once() 只是重复测量,不是施压。
实操建议:
- 用参数化构造命令:例如
f'iperf3 -c {host} -P {parallel} -l {length} -t {duration}',其中parallel从 1 试到 32,length试 1KB/64KB/1MB - 每次执行前加
time.sleep(5)等待上一轮连接彻底释放——否则iperf3可能报错Connection refused或吞吐虚高 - 把每次结果写入 CSV,字段包含:
timestamp, parallel, length, duration, avg_bps, p95_latency_ms,后续才能做交叉分析
Linux 上 tc 模拟弱网环境比真实网络更可控
想验证应用在高丢包/高延迟下的表现?等真实网络出问题再测,代价太大。用 tc(traffic control)在本地或测试机上注入可控故障,才是工程化做法。
实操建议:
- 加 100ms 延迟:
tc qdisc add dev eth0 root netem delay 100ms;加 5% 丢包:tc qdisc change dev eth0 root netem loss 5% - 恢复命令不是
del而是tc qdisc del dev eth0 root,漏掉root会导致规则残留 - 脚本中用
subprocess.run(['tc', 'qdisc', 'show', 'dev', 'eth0'])确认规则已生效,再启动压测——否则你以为在测弱网,实际跑在裸带宽上
真正难的不是跑通命令,而是设计压测场景:比如先固定延迟测吞吐衰减曲线,再固定吞吐测延迟敏感度,这些组合维度容易被忽略。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











