13.10.4 性能瓶颈与优化手段
性能瓶颈与优化手段主要围绕连接处理能力、转发效率、资源利用率与后端承载能力展开。本节以“先基线、再定位、后优化”为主线,给出可执行命令、配置与练习。
1) 基线测试与现象确认#
安装压测工具(示例以 Ubuntu/Debian)
sudo apt-get update
sudo apt-get install -y wrk
基线压测
# 预期:输出 QPS、延迟分布,作为优化前基线
wrk -t4 -c200 -d30s http://127.0.0.1:8080/
HAProxy实时连接观察
# 需要启用 stats socket
echo "show stat" | socat stdio /run/haproxy/admin.sock | head
观察指标:
scur(当前会话)、stot(总会话)、qcur(队列)、hrsp_5xx(后端错误)
2) 系统层排查与优化#
常见瓶颈点:文件句柄不足、SYN_RECV、TIME_WAIT过多、软中断过高。
# 1) 文件句柄
ulimit -n
cat /proc/sys/fs/file-max
# 2) TCP队列与端口范围
sysctl net.core.somaxconn
sysctl net.ipv4.ip_local_port_range
# 3) 连接状态
ss -s
ss -ant | awk '{++S[$1]} END{for(a in S) print a,S[a]}'
# 4) 软中断
cat /proc/softirqs | head
优化示例(/etc/sysctl.d/99-haproxy.conf)
net.core.somaxconn = 65535
net.ipv4.ip_local_port_range = 10240 65535
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_syn_backlog = 8192
应用配置并验证:
sudo sysctl -p /etc/sysctl.d/99-haproxy.conf
sysctl net.core.somaxconn
文件句柄提升(systemd服务)
# /etc/systemd/system/haproxy.service.d/limits.conf
[Service]
LimitNOFILE=200000
sudo systemctl daemon-reload
sudo systemctl restart haproxy
3) HAProxy配置层优化(含示例)#
核心思路:控制并发、减少僵连接、提高复用、降低I/O。
# /etc/haproxy/haproxy.cfg
global
maxconn 200000
nbthread 4
cpu-map 1/1 0
cpu-map 1/2 1
cpu-map 1/3 2
cpu-map 1/4 3
tune.bufsize 32768
stats socket /run/haproxy/admin.sock mode 660 level admin
defaults
mode http
timeout connect 5s
timeout client 30s
timeout server 30s
option http-keep-alive
http-reuse safe
frontend fe_http
bind *:8080
default_backend be_app
backend be_app
balance leastconn
option httpchk GET /health
http-check expect status 200
server app1 10.0.0.11:8080 check weight 10 maxconn 500
server app2 10.0.0.12:8080 check weight 10 maxconn 500
配置生效与语法验证
haproxy -c -f /etc/haproxy/haproxy.cfg
sudo systemctl reload haproxy
预期效果:QPS提升、qcur下降、scur更加稳定。
4) 后端瓶颈联动排查#
观察后端响应与错误
# Nginx/应用响应时间
tail -f /var/log/nginx/access.log | awk '{print $NF}'
在HAProxy查看后端队列
echo "show stat" | socat stdio /run/haproxy/admin.sock \
| awk -F, 'NR>1{print $1,$2,$5,$6,$7}' | head
# 字段示例:pxname,svname,qcur,qmax,scur
排错方向
- qcur持续上升:后端处理能力不足(考虑扩容/优化应用/数据库)
- hrsp_5xx增多:后端异常或超时配置过小
- scur稳定但延迟大:可能为后端耗时或网络瓶颈
5) 常见问题排错示例#
问题1:大量TIME_WAIT
ss -ant | grep TIME-WAIT | wc -l
# 处理:提升本地端口范围、缩短FIN超时
问题2:SYN_RECV占比高
ss -ant | grep SYN-RECV | wc -l
# 处理:提高tcp_max_syn_backlog、检查防火墙/上游连接
问题3:HAProxy线程争用
pidstat -t -p $(pidof haproxy) 1
# 处理:配置nbthread与cpu-map绑定
6) 练习与验证(含预期结果)#
练习1:调整超时优化
1. 修改 timeout client/server 为 15s
2. reload HAProxy
3. wrk 压测对比
wrk -t4 -c200 -d30s http://127.0.0.1:8080/
预期:延迟下降、连接清理更快,scur波动更小。
练习2:启用连接复用
1. 打开 http-reuse safe
2. 观察 show stat 中 bin/bout 与 scur
预期:吞吐提升、后端连接数减少。
练习3:验证后端瓶颈
1. 将后端其中一台 maxconn 调低到 50
2. 压测观察 qcur 和 qmax
预期:队列上升、延迟增大,验证瓶颈定位能力。
通过“基线—定位—优化—复测”闭环,结合系统参数、HAProxy配置与后端能力评估,可形成稳定可复用的性能优化流程。