web-dev-qa-db-ja.com

haproxyとTomcatが断続的にハングする

Solaris x86ボックスのTomcatの前でhaproxyを実行しようとしていますが、断続的にエラーが発生します。一見ランダムな間隔で、haproxyが接続をタイムアウトするまでリクエストはハングします。

自分のアプリかもしれないと思っていたのですが、Tomcatマネージャーアプリで再現できて、Tomcatを直撃しても全く問題ありません。

カールで繰り返し叩くと、10〜15回以内にエラーが発生します

  curl -ikL http://admin:admin@<my server>:81/manager/status

haproxyはポート81で実行され、Tomcatはポート7000で実行されます。haproxyはクライアントに504ゲートウェイタイムアウトを返し、これをログファイルに入れます。

Sep  7 21:39:53 localhost haproxy[16887]: xxx.xxx.xxx.xxx:65168 [07/Sep/2009:21:39:23.005] http_proxy http_proxy/Tomcat7000 5/0/0/-1/30014 504 194 - - sHNN 0/0/0/0/0 0/0 "GET /manager/status HTTP/1.1"

Tomcatは何も表示せず、ログにエラーも表示されず、要求がTomcatサーバーに到達したことを示すものもありません。リクエスト数は増加しません。マネージャーアプリは1つのスレッドでのみアクティビティを表示し、マネージャーアプリを提供します。

これが私のhaproxyとTomcatコネクタの設定です。私は両方とも問題を追跡しようとかなり遊んでいるので、理想的ではないかもしれませんが、間違いなくこのエラーを引き起こすとは思われません。

server.xml

<Connector 
    port="7000" protocol="HTTP/1.1"
    enableLookups="false" maxKeepAliveRequests="1"
    connectionLinger="10"
/>

haproxy config

global
  log loghost local0
  chroot /var/haproxy

listen http_proxy :81
  mode http
  log global
  option httplog
  option httpclose
  clitimeout  150000
  srvtimeout  30000
  contimeout  3000 
  balance roundrobin
  cookie SERVERID insert
  server Tomcat7000 127.0.0.1:7000 cookie server00 check inter 2000
3
user7347

Tomcatが完全なガベージコレクションを一時停止していると思われます。そのため、Tomcatは応答もログも記録していません。この問題の詳細については、 ここ を参照してください。

1
rmalayter

さて、何が起こっているのかを理解するために、haproxyとnetcatの間でtcpdumpを実行する必要があります。 Haproxyは、応答が得られなかったと述べています。これについては議論の余地がありますが、接続して要求を送信したことは明らかです。そうでない場合、ヘッダーを待つことができませんでした。少なくともhaproxyのバグを受け入れて応答がタイムアウトする可能性があるため、Tomcatが着信要求を認識しないという事実は問題ですが、Tomcatはそれを考慮しないため、応答する理由がないと言っています。リクエストがありました。 Tomcat自体にバグがあるか、ネットワークに何か奇妙なものがあります(同じIP上の2つのサーバー?)。少なくとも、接続と要求を受信したことが通知されるはずです。 Tcpdumpはそれを非常に簡単に分類します。また、どのバージョンのhaproxyを実行していますか? 1.3.16と1.3.19の間のバージョンにはいくつかの問題があり、その中で最後の応答パケットでランダムなタイムアウトが発生しました(ただし、Tomcatは応答しなかったと言っていますが、とにかく修正したほうがよいです)。

ウィリー

0
Willy Tarreau

Haproxy統計サーバーをオンにすると、追加情報がデバッグに役立つ場合があります

0
Casey