У меня возникли проблемы с приложением под нагрузкой, и после проведения нескольких нагрузочных тестов я понял, что при прямом нагрузочном тестировании сервера приложений через http
порт 8080
сервер приложений реагирует довольно быстро.
Когда я запускаю нагрузочный тест, нажимая на доменное имя и используя https
, т. е. конечный элемент, который я нажимаю, — https://load.api.example.in
, время отклика увеличивается примерно в 5 раз.
Это приводит меня к выводу, что промежуточный HAProxy является узким местом.
Я увеличил размер сервера для haproxy, и при большой нагрузке загрузка ЦП резко возрастает, но из-за большего сервера она составляет всего около 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. С этим изменением мой нагрузочный тест (через haproxy на http) выполнился так же хорошо, как и нагрузочный тест, где я отправлял все запросы напрямую на сервер.
Поэтому я почти уверен, что проблема (или самая большая проблема из нескольких проблем) заключается в конфигурации ssl в haproxy. Есть ли какие-нибудь предложения о том, что мне следует попробовать изменить для повышения производительности?
решение1
Поскольку вы уже используете AWS, используйте ELB+AWS Certificate Manager для SSL. Запустите Haproxy в режиме http и проигнорируйте проблему.
Или начните экспериментировать со следующими опциями Haproxy:
tune.ssl.cachesize
tune.ssl.lifetime
ciphers
defer-accept
force-tlsv12
Также попробуйте использовать статическую страницу на бэкенде, желательно на том же хосте. Чтобы ограничить влияние приложений во время тестирования.