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/server15s
2. reload HAProxy
3. wrk 压测对比

wrk -t4 -c200 -d30s http://127.0.0.1:8080/

预期:延迟下降、连接清理更快,scur波动更小。

练习2:启用连接复用
1. 打开 http-reuse safe
2. 观察 show statbin/boutscur

预期:吞吐提升、后端连接数减少。

练习3:验证后端瓶颈
1. 将后端其中一台 maxconn 调低到 50
2. 压测观察 qcurqmax

预期:队列上升、延迟增大,验证瓶颈定位能力。

通过“基线—定位—优化—复测”闭环,结合系统参数、HAProxy配置与后端能力评估,可形成稳定可复用的性能优化流程。