以下は私のhaproxy設定です
global
log /dev/log local0 notice
log /dev/log local0 debug
log 127.0.0.1 local0
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
maxconn 5000
defaults
log global
mode tcp
option tcplog
option tcpka
timeout connect 60s
timeout client 1000s
timeout server 1000s
frontend aviator-app
option tcplog
log /dev/log local0 debug
bind *:4433 ssl crt /etc/haproxy/certs/{domain_name}.pem
mode tcp
option clitcpka
option http-server-close
maxconn 5000
default_backend aviator-app-pool
# Table definition
stick-table type ip size 2000k expire 30s store conn_cur
# Allow clean known IPs to bypass the filter
tcp-request connection accept if { src -f /etc/haproxy/whitelist.lst }
# Shut the new connection as long as the client has already 100 opened
# tcp-request connection reject if { src_conn_cur ge 500 }
tcp-request connection track-sc1 src
backend aviator-app-pool
option tcplog
log /dev/log local0 debug
balance roundrobin
mode tcp
option srvtcpka
option http-server-close
maxconn 50
# list each server
server appserver1 10.0.1.205 maxconn 12
server appserver2 10.0.1.183 maxconn 12
server appserver3 10.0.1.75 maxconn 12
server appserver4 10.0.1.22 maxconn 12
# end of list
listen stats
bind *:8000
mode http
log global
maxconn 10
clitimeout 100s
srvtimeout 100s
contimeout 100s
timeout queue 100s
stats enable
stats hide-version
stats refresh 30s
stats show-node
stats auth username:password
stats uri /haproxy?stats
1秒あたり約12〜13のHTTPリクエストで負荷テストを実行すると、テストの最初の約1時間はエラーが表示されません。しかし、テスト開始から約90分で、多数のリクエストが失敗し始めます。 jmeterからのエラーメッセージには、通常、「接続がタイムアウトしました:接続」または「domain_name:4433」が応答しませんでした。以下は、haproxy.logからのいくつかのログメッセージです。また、上の画像で強調表示されているように、多数の「connエラー」といくつかの「応答エラー」が表示されます。
May 7 19:15:00 ip-10-0-0-206 haproxy[30349]: 64.112.179.79:55894
[07/May/2018:19:14:00.488] aviator-app~ aviator-app-pool/<NOSRV>
60123/-1/60122 0 sQ 719/718/717/0/0 0/672
May 7 19:15:00 ip-10-0-0-206 haproxy[30349]: 64.112.179.79:49905
[07/May/2018:19:12:53.483] aviator-app~ aviator-app-pool/appserver2
60022/1/127171 2283568 -- 719/718/716/11/0 0/666
バックエンドサーバーにエラーやスタックトレースが表示されません。ロードバランサーのCPU使用率は、ロードバランサーのテスト中は低く(10%未満)、各バックエンドサーバーで約30%です。この問題をデバッグするための助けがありがたいです。
バックエンドにはmaxconn 50
があるため、HAProxyはオーバーフローをキューに入れ、既存の50のいずれかが終了するのを待ちます。各接続が切断されると、別の接続がバックエンドへの通過を許可されますが、バックエンドは十分に高速ではありません。リクエストはプロキシでバックアップされており、最終的に、プロキシはtimeout connect 60s
のプロキシキューに配置された後、リクエストを破棄します。
ログエントリのsQ
がこれを説明しています。
s
:サーバーがデータを送受信するのを待機しているときに、サーバー側のタイムアウトが期限切れになりました。
Q
:プロキシはキューで接続スロットを待機していました。これは、サーバーに「maxconn」パラメーターが設定されている場合にのみ発生する可能性があります。
HAProxy構成ガイドの 切断時のセッション状態 を参照してください。