我的应用程序在负载下一直遇到问题,在运行一些负载测试后,我意识到当我直接在http
端口上对应用服务器进行负载测试时8080
,应用服务器的响应相当快。
当我通过点击域名并使用进行加载测试时https
,即我点击的结果是https://load.api.example.in
,响应时间增加了约 5 倍。
这使我得出结论:中间的 haproxy 是一个瓶颈。
我增加了 haproxy 的服务器大小,在高负载下,CPU 利用率会飙升,但由于服务器较大,因此只有 50% 左右。(根据 AWS 监控)
我需要在 haproxy 配置中(或其他任何地方)进行哪些更改才能解决此问题?
我现在的 haproxy 配置(匿名)
global
ulimit-n 99999
maxconn 99999
maxpipes 99999
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
maxconn 4096
tune.ssl.default-dh-param 2048
chroot /var/lib/haproxy
user haproxy
group haproxy
daemon
defaults
log global
mode http
option httplog
option dontlognull
option forwardfor
option http-server-close
retries 3
option redispatch
maxconn 2000
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
frontend mqtt
bind *:1883
bind *:1884
mode tcp
option clitcpka # TCP Keep-alive
timeout client 3h
timeout server 3h
option tcplog
acl host_mqtt_staging hdr(host) -i staging.mqtt.example.in
acl host_mqtt_staging hdr(host) -i staging.mqtt.example.com
acl host_mqtt hdr(host) -i mqtt.example.in
acl host_mqtt hdr(host) -i mqtt.example.com
use_backend mqtt_staging if host_mqtt_staging
use_backend mqtt if host_mqtt
frontend http
bind *:80
mode http
reqadd X-Forwarded-Proto:\ http
redirect scheme https code 301 if !{ ssl_fc }
frontend https
bind *:443 ssl crt /etc/haproxy/certs/staging.myservice.example-2.com.pem
mode http
reqadd X-Forwarded-Proto:\ https
acl letsencrypt-acl path_beg /.well-known/acme-challenge/
acl host_myservice_staging hdr(host) -i staging.api.example.in
acl host_myservice_staging hdr(host) -i staging.api.example.com
acl host_myservice_load hdr(host) -i load.api.example.in
use_backend letsencrypt-backend if letsencrypt-acl
use_backend myservice_staging if host_myservice_staging
use_backend myservice_load if host_myservice_load
default_backend api
backend letsencrypt-backend
server letsencrypt 127.0.0.1:54321
backend api
balance roundrobin
option httpclose
option forwardfor
server web00 app00.staging.internal.example-2.com:8080 check
backend myservice_staging
balance roundrobin
option httpclose
option forwardfor
server myservice00 myservice00.staging.internal.example-2.com:8080 check weight 1
backend myservice_load
balance roundrobin
option httpclose
option forwardfor
server myserviceload00 load00.staging.internal.example-2.com:8080 check weight 1
backend mqtt_staging
balance leastconn
server mqttdev00 mqtt00.internal.example-2.com:1883 check
backend mqtt
balance leastconn
server prodmqttdev00 prodmqtt00.internal.example-2.com:1883 check
响应时间
- 使用 haproxy:平均超过 3 秒
- 没有使用 haproxy:平均在 500-600 毫秒之间
更新:
在测试时,我更新了我的 haproxy 配置,将 http 转发到与 https 中已配置的相同的后端。通过此更改,我的负载测试(通过 http 上的 haproxy)与我将所有请求直接发送到服务器的负载测试一样好。
因此,我很确定问题(或几个问题中最大的问题)是 haproxy 中的 ssl 配置。关于我应该尝试更改哪些内容以提高性能,有什么建议吗?
答案1
由于您已经在使用 AWS,请使用 ELB+AWS 证书管理器为您执行 SSL。以 http 模式运行 Haproxy 并忽略该问题。
或者开始使用以下 Haproxy 选项:
tune.ssl.cachesize
tune.ssl.lifetime
ciphers
defer-accept
force-tlsv12
另外,尽量在后端使用静态页面,最好在同一主机上。以限制测试期间对应用程序的影响。