負荷がかかった状態でアプリに問題が発生し、いくつかの負荷テストを実行した後、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 構成を更新して、https で既に構成されているのと同じバックエンドに http を転送するようにしました。この変更により、負荷テスト (http 上の haproxy 経由) は、すべてのリクエストをサーバーに直接送信した負荷テストと同様に実行されました。
したがって、問題 (またはいくつかの問題のうち最大の問題) は haproxy の ssl 構成であると確信しています。パフォーマンスを向上させるために何を変更すればよいかについて、何かアドバイスはありますか?
答え1
すでに AWS を使用している場合は、ELB + AWS Certificate Manager を使用して SSL を実行します。Haproxy を http モードで実行し、問題を無視します。
または、次の Haproxy オプションを試してみましょう。
tune.ssl.cachesize
tune.ssl.lifetime
ciphers
defer-accept
force-tlsv12
また、できれば同じホスト上のバックエンドで静的ページを使用するようにしてください。テスト中のアプリケーションへの影響を制限するためです。