2

「Hello World!」を提供する単純なねじれたアプリがあります。HTTP プロトコル経由。すべてのプロセッサを利用するために、いくつかのインスタンスを実行しようとしています。

しかし、単一のねじれたアプリは、haproxy の背後にある同じアプリの 1 つ、2 つ、または 5 つのインスタンスよりもはるかに多くの要求を処理すると述べました。なぜこれが起こっているのかわかりません。

/JMeter 経由で取得する 5000 のスレッドを実行します。127.0.0.1:9001 で実行すると、各リクエストが 500 ミリ秒で正常に処理されます。127.0.0.1:8080 で実行すると、一部の応答は503 Service Unavailable500 ミリ秒を超えて実行されます。

ここに私の設定ファイルがあります:

global
    maxconn 500000
    user german

defaults
    mode http
    retries 0
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms
    balance roundrobin
    # if something goes wrong with server, redistribute client to a working server
    option redispatch

listen http 127.0.0.1:8080
    mode http
    option httpchk GET / HTTP/1.1

    server prototype-local 127.0.0.1:9001 maxconn 0 weight 1 maxqueue 0 cookie server01 check inter 5000 rise 1 fall 3

    balance roundrobin

    # to see ip's of clients
    option forwardfor
    option http-server-close
    # disable or enable immediate session resource cleaning(useful for chat)
    # option nolinger
    # inserts cookie to each client requet to identify a process
    cookie SWCOMMET insert indirect nocache
    # will be enalbed as soon as main server with process crashed :nice fail resistance
    option allbackups
4

1 に答える 1

0

127.0.0.1:9001 で実行すると、各リクエストは 500 ミリ秒で正常に処理されます

冗談ですか ?「hello world」のような単純なアプリケーションが 500 ミリ秒で応答する場合、どこかで何かが壊れていることは確かです。

サーバーがスワッピングしていないことを確認する必要があります (例: メモリ リークが原因)。これにより、応答時間が非常に長くなり、チェーンに haproxy を追加するとさらに悪化する理由が説明できます。これは、両方のプロセスが影響を受けるためです。

haproxy から 503 を受け取ったという事実は、ヘルスチェックに応答できなかったサーバーを失ったことを意味します。これは、ところで、巨大な応答時間と一致しています。

何らかの理由で、アプリケーションがすべての CPU を消費し、同じ CPU にバインドされている場合、haproxy へのスケジューリングの待ち時間が長くなる可能性もあります。CPU 使用率を監視し、各プロセスがどの CPU で実行されているかを確認する必要があります (これには「top」を使用します)。理想的には、haproxy を特定のコア (タスクセットを使用) に強制し、アプリケーションを別のコアに強制する必要があります。高負荷を実現するには、コア間でのスレッドの移行を回避することが重要であるため、新しいインスタンスはそれぞれ専用のコアで実行する必要があります。

サーバーが大量のメモリを消費している場合は、haproxy のサーバー maxconn パラメーターを使用して要求をシリアル化する (および maxqueue を削除する) 必要があります。

あなたのhaproxy構成で私が見ている他のものの中で、グローバルmaxconnは巨大であり、この制限に達するためにhaproxyのためだけに約9 GBのRAMが必要になるため、あまり意味がありません. また、フロントエンドのデフォルト値は 2000 であるため、デフォルト セクションで maxconn 値を設定する必要があります。これはおそらく、試している値よりも低い値です。

「maxconn 0」、「maxqueue 0」、および「weight 1」はデフォルトであり、構成の理解を複雑にするだけであるため、削除する必要があります。

于 2012-08-25T07:53:05.537 に答える