4.10.4 压测工具与结果分析
压测工具与结果分析#
压测原理草图#
常用压测工具与适用场景#
- ab:轻量级 HTTP 压测,适合快速验证单接口吞吐与延迟。
- wrk:多线程高并发 HTTP 压测,支持 Lua 脚本构造复杂请求。
- siege:支持 URL 列表与会话保持,适合模拟多页面访问。
- jmeter:功能全面的协议压测与场景编排,适用于复杂业务链路。
- iperf3:网络带宽与吞吐能力测试,区分 TCP/UDP。
- sysbench:CPU、内存、磁盘、数据库等综合基准测试。
- fio:磁盘 I/O 压测,精细控制读写模式与队列深度。
- stress-ng:系统资源极限压测,验证稳定性与恢复能力。
安装与环境准备#
# Debian/Ubuntu
sudo apt-get update
sudo apt-get install -y apache2-utils wrk siege jmeter iperf3 sysbench fio stress-ng
# RHEL/CentOS
sudo yum install -y httpd-tools epel-release
sudo yum install -y wrk siege jmeter iperf3 sysbench fio stress-ng
# 验证版本
ab -V
wrk -v
jmeter -v
iperf3 -v
sysbench --version
fio -v
stress-ng --version
压测示例与命令解释#
1)ab:快速 HTTP 接口压测
# -n 总请求数;-c 并发数;-k 启用 Keep-Alive;-H 增加头部
ab -n 10000 -c 200 -k -H "Authorization: Bearer demo" \
http://127.0.0.1:8080/api/health
- 预期效果:输出 Requests per second、Time per request、Failed requests。
2)wrk:多线程压测与 Lua 场景
# -t 线程数;-c 并发连接;-d 持续时间
wrk -t 4 -c 400 -d 30s http://127.0.0.1:8080/api/items
-- /opt/wrk/post.lua
wrk.method = "POST"
wrk.body = '{"id":1,"name":"demo"}'
wrk.headers["Content-Type"] = "application/json"
wrk -t 4 -c 200 -d 30s -s /opt/wrk/post.lua \
http://127.0.0.1:8080/api/items
- 预期效果:输出 Requests/sec、Latency 分位分布、Socket errors。
3)siege:URL 列表与会话模拟
cat >/opt/siege/urls.txt <<'EOF'
http://127.0.0.1:8080/
http://127.0.0.1:8080/api/items
http://127.0.0.1:8080/api/orders
EOF
# -c 并发;-t 持续;-i 随机访问
siege -c 100 -t 1M -i -f /opt/siege/urls.txt
4)jmeter:非 GUI 模式执行
# 生成一个简单的测试计划模板
jmeter -n -t /opt/jmeter/testplan.jmx -l /opt/jmeter/result.jtl \
-Jhost=127.0.0.1 -Jport=8080
# 结果聚合报告
jmeter -g /opt/jmeter/result.jtl -o /opt/jmeter/report
- 预期效果:report 目录包含吞吐、延迟、错误率图表。
5)iperf3:网络吞吐测试
# 服务器端
iperf3 -s
# 客户端 TCP 测试,-t 时长,-P 并行流
iperf3 -c 192.168.1.10 -t 30 -P 4
- 预期效果:输出 sender/receiver 的带宽与重传。
6)sysbench:CPU/内存/磁盘/数据库
# CPU
sysbench cpu --cpu-max-prime=20000 run
# 内存
sysbench memory --memory-block-size=1M --memory-total-size=10G run
# 文件 I/O(准备、测试、清理)
sysbench fileio --file-total-size=4G prepare
sysbench fileio --file-test-mode=rndrw --time=60 --max-requests=0 run
sysbench fileio --file-total-size=4G cleanup
7)fio:磁盘 I/O 压测
# /opt/fio/randrw.fio
[global]
ioengine=libaio
direct=1
runtime=60
time_based=1
group_reporting=1
iodepth=32
bs=4k
numjobs=4
filename=/data/fio_testfile
[randrw]
rw=randrw
rwmixread=70
fio /opt/fio/randrw.fio
- 预期效果:输出 IOPS、BW、clat/slat 分布。
8)stress-ng:资源压力与稳定性
# 2 个 CPU worker,1 个内存 worker,持续 60s
stress-ng --cpu 2 --vm 1 --vm-bytes 1G --timeout 60s --metrics-brief
压测结果核心指标#
- 吞吐量(TPS/QPS):单位时间处理请求数,评估系统处理能力。
- 响应时间(RT):平均值、P95、P99 延迟,反映尾部性能。
- 并发数:同时处理请求数量,验证并发承载能力。
- 错误率:请求失败比例,识别稳定性与资源瓶颈。
- 资源利用率:CPU、内存、磁盘 I/O、网络带宽与连接数。
结果分析方法与命令联动#
# 关键系统指标:CPU/负载/内存/IO/上下文切换
top -H -p <PID>
vmstat 1 10
iostat -x 1 10
pidstat -u -r -d 1 10
ss -s
# 记录压测时间窗口内的系统指标
sar -u 1 60
sar -n DEV 1 60
- 趋势对比:与基线指标对比,识别性能退化与提升。
- 瓶颈定位:若 iowait 高且磁盘队列大,优先排查磁盘;若 CPU 使用率高且上下文切换频繁,考虑线程/锁争用;若丢包明显,排查网卡/MTU。
- 分位延迟分析:重点关注 P95/P99,平均值仅供参考。
- 饱和点识别:吞吐增速下降且延迟飙升时的并发拐点。
- 稳定性评估:长时间压测下是否出现抖动、错误率飙升或资源泄露。
典型输出解读示例#
# wrk 输出重点
Requests/sec: 12000.34 # 吞吐
Latency: 12.34ms # 平均延迟
Socket errors: connect 0, read 2, write 0, timeout 5
# fio 输出重点
IOPS=45.6k, BW=178MiB/s, clat (usec): min=50, max=1200, avg=120
# jmeter 汇总指标
Throughput=5000.0/min, Avg=20ms, 90% Line=35ms, Error%=0.2%
常见排错与修复建议#
# 1)压测客户端成为瓶颈
# 观察 CPU 占用与连接耗尽
top -H
ulimit -n
# 修复:提高句柄数
ulimit -n 65535
# 2)端口耗尽/连接失败
ss -s
cat /proc/sys/net/ipv4/ip_local_port_range
# 修复:扩大端口范围
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
# 3)连接数/队列过小(服务端)
sysctl -a | egrep "somaxconn|tcp_max_syn_backlog"
# 修复示例
sysctl -w net.core.somaxconn=65535
sysctl -w net.ipv4.tcp_max_syn_backlog=65535
# 4)磁盘 IO 饱和
iostat -x 1 5
# 修复:调整队列深度/切换更快介质/优化写入模式
结果报告要点#
- 测试环境与版本说明(硬件、内核、配置参数)。
- 场景与数据规模描述(请求类型、并发数、持续时间)。
- 核心指标汇总与图表(吞吐、延迟、错误率)。
- 瓶颈结论与优化建议(参数、架构、资源)。
练习#
- 用 wrk 对本机 API 进行 3 轮压测:并发 100/200/400,记录吞吐与 P95,绘制拐点。
- 用 fio 设计 70% 读 30% 写的 4k 随机 I/O 压测,并解释 IOPS 与 latency 的关系。
- 使用 iperf3 进行 4 并行流测试,比较 TCP 与 UDP 模式的带宽差异。
- 模拟 5 分钟稳定压测后,结合
sar与iostat输出,判断瓶颈属于 CPU、内存还是磁盘。