13.8.1 性能瓶颈分析与基准测试方法

性能调优的前提是明确瓶颈所在。HAProxy常见瓶颈可归为四类:CPU(线程饱和、TLS握手成本高、规则复杂)、内存(缓冲区过大或连接过多)、网络(带宽或丢包)、后端(应用响应慢导致队列堆积)。分析时应从指标与日志入手,结合实时统计与系统层观测,建立“症状—指标—假设—验证”的闭环。

原理草图(数据流与观测点):

文章图片

关键指标与观察点:
- 连接与吞吐:sessions、rate、byte in/out、conn_rate、conn_cur,识别突发流量与持续高载
- 队列与重试:qcur/qmax、retries、redispatch,判断后端处理能力是否不足
- 延迟与响应:Tq/Tw/Tc/Tr/Tt(队列/等待/连接/响应/总时延),定位延迟阶段
- 错误与失败:srv_abrt、cli_abrt、econ、conn_err、l4/l7错误码,确认失败类型

必备工具安装与说明(基准测试与观测):

# Debian/Ubuntu
sudo apt update
sudo apt install -y haproxy wrk apache2-utils iperf3 htop socat jq curl

# RHEL/CentOS
sudo yum install -y haproxy wrk httpd-tools iperf3 htop socat jq curl
  • wrk/ab:HTTP基准测试
  • iperf3:TCP吞吐测试
  • socat:读取HAProxy运行时stats socket
  • htop/ss:系统与连接观测

HAProxy统计页与socket启用示例(/etc/haproxy/haproxy.cfg):

global
  stats socket /run/haproxy/admin.sock mode 660 level admin
  stats timeout 30s

listen stats
  bind :8404
  mode http
  stats enable
  stats uri /stats
  stats refresh 5s

验证与效果:

# Web 统计页
curl -s http://127.0.0.1:8404/stats | head -n 2

# 运行时指标(CSV)
echo "show stat" | socat /run/haproxy/admin.sock stdio | head -n 5

基线建立与系统层观测:

# HAProxy实时连接
ss -tanp | grep haproxy | wc -l

# CPU/内存/负载
htop

# 网卡吞吐
ip -s link show eth0

基准测试方法与完整示例(HTTP):

# 1) 低并发基线
wrk -t2 -c50 -d30s http://127.0.0.1:8080/

# 2) 阶梯升压
wrk -t4 -c200 -d60s http://127.0.0.1:8080/
wrk -t8 -c800 -d60s http://127.0.0.1:8080/

# 3) 输出P95/P99(wrk默认不输出P99,可用wrk2/hey或自采样)
ab -n 10000 -c 200 http://127.0.0.1:8080/

命令解释:
- -t 线程数、-c 并发连接、-d 持续时间
- 观察延迟和错误率拐点,对照HAProxy统计指标(qcur/Tr/Tt)

TCP场景基准测试(后端为TCP服务):

# 服务端
iperf3 -s

# 客户端经HAProxy转发
iperf3 -c 127.0.0.1 -p 5001 -P 10 -t 30

瓶颈定位流程与操作化示例:
1. 先看HAProxy指标是否出现 qcur/qmax 增长
2. 再看系统层:CPU是否满、网卡是否丢包
3. 直连后端压测对比

# 直连后端(绕过HAProxy)
wrk -t4 -c200 -d30s http://10.0.0.11:8080/

# 对比经HAProxy
wrk -t4 -c200 -d30s http://127.0.0.1:8080/

运行时指标查询与解释示例:

# 获取Tq/Tw/Tc/Tr/Tt
echo "show stat" | socat /run/haproxy/admin.sock stdio | \
  awk -F, 'NR==1||$1=="http_front"||$1=="app_backend" {print $1,$2,$59,$60,$61,$62,$63}'
  • $59-$63对应Tq/Tw/Tc/Tr/Tt(队列/等待/连接/响应/总时延),用于定位延迟阶段

排错清单(常见现象→检查点→命令):
- 延迟升高但qcur=0:检查后端响应慢
bash curl -w "connect:%{time_connect} start:%{time_starttransfer} total:%{time_total}\n" -o /dev/null -s http://127.0.0.1:8080/
- qcur持续增长:后端并发不足或timeout不合理
bash echo "show stat" | socat /run/haproxy/admin.sock stdio | grep app_backend | head -n1
- 错误率上升:检查L7/L4错误与连接重试
bash grep -E "503|504|L4|L7" /var/log/haproxy.log | tail -n 20

练习与验收:
1. 建立基线:低并发(50)测得QPS与P95延迟,记录统计页截图
2. 阶梯升压:200/800并发分别测试,找出拐点
3. 直连后端对比:确认瓶颈在HAProxy还是后端
4. 输出报告:表格列出QPS、P95、错误率、qcur峰值、CPU使用率
5. 提交命令清单与关键指标截图(stats页与socatat输出)

注意事项:
- 避免将后端性能不足误判为HAProxy瓶颈,必要时对后端进行直连压测
- TLS终止压测需区分RSA/ECDSA与证书链长度,避免混淆CPU消耗
- 压测流量应尽量模拟真实分布(请求大小、Keep-Alive比例、Header复杂度)以提高结论有效性