97

私のhaproxy設定について質問があります:

#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    log         127.0.0.1 syslog emerg
    maxconn     4000
    quiet
    user        haproxy
    group       haproxy
    daemon
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will 
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode        http
    log         global
    option      abortonclose
    option      dontlognull
    option      httpclose
    option      httplog
    option      forwardfor
    option      redispatch
    timeout connect 10000 # default 10 second time out if a backend is not found
    timeout client 300000 # 5 min timeout for client
    timeout server 300000 # 5 min timeout for server
    stats       enable

listen  http_proxy  localhost:81

    balance     roundrobin
    option      httpchk GET /empty.html
    server      server1 myip:80 maxconn 15 check inter 10000
    server      server2 myip:80 maxconn 15 check inter 10000

ご覧のとおり単純明快ですが、maxconn のプロパティがどのように機能するかについて少し混乱しています。

listen ブロックには、グローバルなものとサーバー上の maxconn があります。私の考えは次のとおりです。グローバルなものは、サービスとしての haproxy が一度にキューまたは処理する接続の総数を管理します。数値がそれを超えると、接続が切断されるか、Linux ソケットにプールされますか? 4000を超えるとどうなるかわかりません。

次に、サーバーの maxconn プロパティを 15 に設定します。まず、これを 15 に設定します。これは、別のサーバーに転送する php-fpm が使用できる子プロセスが非常に多いためです。 php-fpm ではなく、ここでリクエストをプールします。どちらが速いと思います。

しかし、本題に戻ると、この数に関する私の理論では、このブロック内の各サーバーは一度に 15 接続しか送信されないということです。そして、接続は開いているサーバーを待ちます。Cookie をオンにすると、接続は正しいオープン サーバーを待機します。しかし、私はしません。

質問は次のとおりです。

  1. グローバル接続が 4000 を超えるとどうなりますか? 彼らは死ぬのですか?または何とか Linux にプールしますか?
  2. サーバー接続の総数をグローバルよりも大きくすることはできないという事実以外に、グローバル接続はサーバー接続に関連していますか?
  3. グローバル接続を計算するとき、それはサーバー セクションに追加された接続の量とプール用の特定の割合ではないでしょうか? もちろん、接続には他にも制限がありますが、実際には、プロキシに送信したい数は何ですか?

前もって感謝します。

4

1 に答える 1

175

ウィリーからメールで返事が来ました。シェアしようと思いました。彼の答えは太字です。

私のhaproxy設定について質問があります:

   #---------------------------------------------------------------------
   # Global settings
   #---------------------------------------------------------------------
   global
       log         127.0.0.1 syslog emerg
       maxconn     4000
       quiet
       user        haproxy
       group       haproxy
       daemon
   #---------------------------------------------------------------------
   # common defaults that all the 'listen' and 'backend' sections will 
   # use if not designated in their block
   #---------------------------------------------------------------------
   defaults
       mode        http
       log         global
       option      abortonclose
       option      dontlognull
       option      httpclose
       option      httplog
       option      forwardfor
       option      redispatch
       timeout connect 10000 # default 10 second time out if a backend is not found
       timeout client 300000 # 5 min timeout for client
       timeout server 300000 # 5 min timeout for server
       stats       enable

   listen  http_proxy  localhost:81

       balance     roundrobin
       option      httpchk GET /empty.html
       server      server1 myip:80 maxconn 15 check inter 10000
       server      server2 myip:80 maxconn 15 check inter 10000

ご覧のとおり単純明快ですが、maxconn のプロパティがどのように機能するかについて少し混乱しています。

listen ブロックには、グローバルなものとサーバー上の maxconn があります。

また、リッスン ブロックには、デフォルトで 2000 のような別のものもあります。

私の考えは次のとおりです。グローバルなものは、サービスとしての haproxy が一度にキューまたは処理する接続の総数を管理します。

正しい。これは、プロセスごとの同時接続の最大数です。

数値がそれを超えると、接続が切断されるか、Linux ソケットにプールされますか?

後者の場合、新しい接続の受け入れを停止するだけで、それらはカーネルのソケット キューに残ります。キュー可能なソケットの数は、(net.core.somaxconn、net.ipv4.tcp_max_syn_backlog、およびリッスン ブロックの maxconn) の最小値によって決まります。

4000を超えるとどうなるかわかりません。

過剰な接続は、受け入れられる前に別の接続が完了するのを待ちます。ただし、カーネルのキューが飽和していない限り、接続は TCP レベルで受け入れられますが処理されないため、クライアントはこれに気付きません。そのため、クライアントはリクエストを処理するための遅延に気付くだけです。しかし実際には、listen ブロックの maxconn の方がはるかに重要です。これは、デフォルトでグローバルなものよりも小さいためです。リッスンの maxconn は、リスナーごとの接続数を制限します。一般に、サービスに必要な接続数に合わせて構成し、グローバル maxconn を haproxy プロセスに処理させる最大接続数に構成するのが賢明です。サービスが 1 つしかない場合は、両方を同じ値に設定できます。しかし、多くのサービスがある場合、

次に、サーバーの maxconn プロパティを 15 に設定します。まず、これを 15 に設定します。これは、別のサーバーに転送する php-fpm が使用できる子プロセスが非常に多いためです。 php-fpm ではなく、ここでリクエストをプールします。どちらが速いと思います。

はい、高速である必要があるだけでなく、haproxy が可能な限り別の利用可能なサーバーを見つけることを可能にし、接続がサーバーに転送される前にクライアントが「停止」を押した場合にキュー内の要求を強制終了することも可能にします。

しかし、本題に戻ると、この数に関する私の理論では、このブロック内の各サーバーは一度に 15 接続しか送信されないということです。そして、接続は開いているサーバーを待ちます。Cookie をオンにすると、接続は正しいオープン サーバーを待機します。しかし、私はしません。

まさにそれが原則です。プロキシごとのキューとサーバーごとのキューがあります。永続 Cookie を使用する接続はサーバー キューに送られ、その他の接続はプロキシ キューに送られます。ただし、あなたのケースでは Cookie が構成されていないため、すべての接続はプロキシ キューに送られます。必要に応じて、haproxy ソースの図 doc/queuing.fig を見ることができます。決定がどのように/どこで行われるかが説明されています。

質問は次のとおりです。

  1. グローバル接続が 4000 を超えるとどうなりますか? 彼らは死ぬのですか?または、何らかの方法で Linux にプールしますか?

    それらはLinuxでキューに入れられています。カーネルのキューを圧倒すると、それらはカーネルにドロップされます。

  2. サーバー接続の総数をグローバルよりも多くすることはできないという事実以外に、グローバル接続はサーバー接続に関連していますか?

    いいえ、グローバル接続設定とサーバー接続設定は独立しています。

  3. グローバル接続を把握するとき、それはサーバー セクションで合計された接続の量に、プール用の特定の割合を加えたものであるべきではありませんか? もちろん、接続には他にも制限がありますが、実際には、プロキシに送信したい数は何ですか?

    あなたはそれを正しく理解しました。サーバーの応答時間が短い場合、数千の接続をキューに入れて一度に少数の接続だけを処理しても問題はありません。これにより、要求の処理時間が大幅に短縮されるためです。実際、最近の接続の確立には、ギガビット LAN で約 5 マイクロ秒かかります。そのため、haproxy がキューから非常に小さな maxconn を持つサーバーに接続をできるだけ速く分散できるようにすることは非常に理にかなっています。30000 を超える同時接続をキューに入れ、サーバーあたり 30 のキューで実行している 1 つのゲーム サイトを覚えています。それはApacheサーバーであり、Apacheは多数の接続よりも少数の接続の方がはるかに高速です。しかし、これには本当に高速なサーバーが必要です。たとえば、サーバーがデータベースを待機しているため、すべてのクライアントをキューに入れ、接続スロットを待機させたい場合。また、非常にうまく機能するのは、サーバーを専用にすることです。サイトに多くの静的要素がある場合は、静的要求をサーバー (またはキャッシュ) のプールに送信して、静的要求をキューに入れず、静的要求が高価な接続スロットを消費しないようにすることができます。これが役に立てば幸いです、ウィリー

于 2012-01-07T17:32:09.557 に答える