4.9.7 性能压测与问题定位流程
本节聚焦网络性能压测与问题定位的标准流程,覆盖目标设定、压测设计、执行监控、瓶颈定位与复盘优化,形成可复用的闭环方法,并给出完整命令、示例与练习。
一、压测目标与范围定义#
- 明确业务目标:吞吐(QPS/TPS)、延迟(P50/P95/P99)、错误率、连接数上限、带宽利用率。
- 设定基线与验收阈值:与历史稳定版本或生产基线对比。
- 确定范围:单服务、链路、跨机房、第三方依赖(DNS、网关、负载均衡、中间件)。
- 选择场景:冷启动、稳态、峰值、突发、长稳压测。
原理草图(压测闭环)
二、压测设计与准备#
- 测试工具选择:wrk/hey/ab、iperf3、tc/netem(模拟丢包/抖动)、脚本化回放。
- 流量模型:固定并发、阶梯增长、混合读写比例、长短连接比例。
- 环境隔离:避免与生产互相影响,保证可重复性。
- 监控准备:系统(CPU/内存/IO)、网络(带宽、丢包、重传、队列)、应用(延迟、错误、连接数)。
工具安装(以 Ubuntu/CentOS 为例)
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y iperf3 wrk hey tcpdump iproute2 sysstat ethtool
# CentOS/RHEL
sudo yum install -y epel-release
sudo yum install -y iperf3 wrk tcpdump iproute sysstat ethtool
# hey 可用二进制安装
wget -O /usr/local/bin/hey https://hey-release.s3.us-east-2.amazonaws.com/hey_linux_amd64
chmod +x /usr/local/bin/hey
压测环境说明文件(示例)
# /opt/bench/README.env
# 目标服务:10.0.0.10:8080
# 客户端:10.0.0.20
# 网络:1Gbps,MTU 1500
# 基线:P99 < 120ms,QPS >= 3000
三、压测执行与实时观测#
- 逐步升压:观察拐点与饱和点,记录对应指标。
- 关键网络指标:RTT、抖动、丢包率、重传率、吞吐、队列长度、连接状态分布。
示例1:业务接口压测(wrk)
# 预热 30s,8 线程 200 并发,持续 2 分钟
wrk -t8 -c200 -d2m --latency http://10.0.0.10:8080/api/ping
# 关注:
# 1) Requests/sec
# 2) Latency Distribution (P50/P95/P99)
示例2:固定请求数压测(hey)
# 10k 请求,200 并发
hey -n 10000 -c 200 http://10.0.0.10:8080/api/ping
# 输出包含:平均响应时间、P99、成功率
示例3:链路带宽压测(iperf3)
# 服务端
iperf3 -s
# 客户端(并发 4 流,持续 30s)
iperf3 -c 10.0.0.10 -P 4 -t 30
# 关注:sender/receiver 带宽、重传(retrans)
示例4:模拟丢包与延迟(tc/netem)
# 给网卡 eth0 注入 100ms 延迟与 1% 丢包
sudo tc qdisc add dev eth0 root netem delay 100ms loss 1%
# 清理
sudo tc qdisc del dev eth0 root
实时监控命令(并行执行)
# 连接状态与计数
ss -s
# 网络统计(每 1s)
sar -n DEV,TCP,ETCP 1
# 带宽按进程
sudo nethogs eth0
# 抓包(只抓 8080 端口,写到文件)
sudo tcpdump -i eth0 port 8080 -w /tmp/8080.pcap
四、瓶颈定位流程#
- 确认是否为网络瓶颈
- 带宽打满、丢包/重传上升、RTT异常增大。 - 定位瓶颈层级
- 客户端侧(并发限制、带宽不足、DNS延迟)
- 传输层(TCP重传、窗口不足、拥塞控制)
- 服务端侧(accept队列、端口耗尽、软中断饱和)
- 中间设备(LB、交换机、网关) - 分层验证
- 抓包检查三次握手、重传、乱序
- 查看软中断与网卡队列负载(/proc/softirqs、/proc/net/softnet_stat)
- 检查内核参数(backlog、conntrack、rmem/wmem)
分层排查命令示例
# 1) 连接状态分布
ss -ant | awk '{print $1}' | sort | uniq -c
# 2) TIME_WAIT 统计
ss -ant state time-wait | wc -l
# 3) 软中断观察(关注 NET_RX/NET_TX)
grep -E "NET_RX|NET_TX" /proc/softirqs
# 4) 连接跟踪占用
cat /proc/sys/net/netfilter/nf_conntrack_count
cat /proc/sys/net/netfilter/nf_conntrack_max
抓包定位重传(tcpdump + tshark)
# 抓包
sudo tcpdump -i eth0 tcp port 8080 -w /tmp/8080.pcap
# 统计重传(需安装 tshark)
tshark -r /tmp/8080.pcap -q -z io,stat,1 -z tcp,analysis
五、常见问题与处理建议#
- 连接数耗尽:扩大端口范围、调整 TIME_WAIT 策略、优化连接复用。
- 高重传率:检查丢包链路、MTU 不一致、拥塞控制算法选择。
- 带宽未满但延迟高:队列拥塞、软中断过载、应用层处理慢。
- RST/超时频发:防火墙策略、SYN backlog 不足、超时设置不合理。
排错示例:端口耗尽
# 现象:客户端出现 "Cannot assign requested address"
# 排查端口范围与 TIME_WAIT
cat /proc/sys/net/ipv4/ip_local_port_range
ss -ant state time-wait | wc -l
# 临时调整端口范围与 TIME_WAIT 复用(谨慎使用)
sudo sysctl -w net.ipv4.ip_local_port_range="10240 65535"
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
排错示例:SYN backlog 不足
# 现象:连接建立慢,SYN_RECV 增多
ss -ant state syn-recv | wc -l
# 调整 backlog
sudo sysctl -w net.ipv4.tcp_max_syn_backlog=16384
sudo sysctl -w net.core.somaxconn=16384
六、结果输出与复盘#
- 输出压测报告:测试环境、工具版本、场景模型、拐点指标、瓶颈结论。
- 形成优化清单:内核参数、网络结构、应用协议与连接策略。
- 再压验证:优化后对比基线,确认指标提升或稳定性改善。
报告模板(示例)
# /opt/bench/report.md
# 1. 环境信息
# 2. 测试工具与版本
# 3. 压测场景与模型
# 4. 关键指标与拐点
# 5. 瓶颈定位证据(命令输出/抓包)
# 6. 优化项与复测结果
七、推荐流程图(文字版)#
目标设定 → 压测模型设计 → 环境准备 → 小流量验证 → 逐级升压 → 监控分析 → 瓶颈定位 → 参数/架构优化 → 复测与固化
流程草图(ASCII)
[目标/基线] -> [模型] -> [环境] -> [小流量] -> [升压]
| |
v v
[监控] <-------- [瓶颈定位] <-------- [分析]
| |
v v
[优化] -------------------------------> [复测]
八、练习与实战#
- 使用
iperf3测试两台主机的带宽,记录峰值与重传次数,写出结论。 - 用
wrk对接口进行阶梯升压(100/300/500 并发),记录 P99 与 QPS 的拐点。 - 使用
tc netem模拟 50ms 延迟与 0.5% 丢包,观察延迟变化与重传增加。 - 在压测过程中抓包,使用
tshark输出 TCP 重传统计并解释原因。