web-dev-qa-db-ja.com

グローバルmaxconnとサーバーmaxconn haproxyの違い

私の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に設定します。まず、php-fpmは別のサーバーに転送され、使用できる子プロセスが非常に多いため、15に設定します。 php-fpmではなく、ここでリクエストをプールします。私はそれが速いと思います。

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

質問は次のとおりです。

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

前もって感謝します。

84
chantheman

ウィリーは私にメールで答えをもらった。私はそれを共有すると思った。彼の答えは大胆です。

私の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があります。

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

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

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

数値がそれを超える場合、接続を強制終了するか、Linuxソケットにプールしますか?

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

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

余分な接続は、別の接続が完了するまで待ってから受け入れられます。ただし、カーネルのキューが飽和していない限り、接続はTCPレベルで受け入れられますが、処理されないため、クライアントはこれに気づきさえしません。しかし、実際には、listenブロックのmaxconnはデフォルトでグローバルなものよりも小さいため、listenブロックのmaxconnははるかに重要です。listenのmaxconnはリスナーごとの接続数を制限します。サービスに必要な接続、およびグローバルmaxconnをhaproxyプロセスが処理できる接続の最大数に設定します。サービスが1つだけの場合は、両方を同じ値に設定できますが、多くのサービスがある場合は、単一のサービスがすべての接続を取得し、他の接続が機能しないようにしたくないので、それが大きな違いをもたらすことを簡単に理解できます。

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

はい、高速であるだけでなく、可能な場合はいつでもhaproxyが別の使用可能なサーバーを見つけることができます。また、クライアントが前に「stop」を押すと、キュー内のリクエストを強制終了できます接続はサーバーに転送されます。

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

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

質問は次のとおりです。

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

    Linuxでキューに入れられています。カーネルのキューがいっぱいになると、カーネルにドロップされます。

  2. グローバル接続はサーバー接続に関連していますか?サーバー接続の総数をグローバルより多くすることはできません。

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

  3. グローバル接続を計算するとき、サーバーセクションで追加された接続の量に、プールの特定の割合を加えてはいけませんか?そして、明らかにあなたは接続に他の制限がありますが、実際にプロキシに送信したいのは何人ですか?

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

150
chantheman