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


91

私の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接続しか送信されないということです。そして、接続は開いているサーバーを待ちます。クッキーをオンにしていた場合、接続は正しいオープンサーバーを待機します。しかし、私はしません。

だから質問は:

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

前もって感謝します。

回答:


166

ウィリーは私にメールで答えをもらいました。共有したいと思いました。彼の答えは太字です。

私の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は、デフォルトではグローバルブロックよりも小さいため、はるかに重要です。待機のmaxconnは、リスナーごとの接続数を制限します。一般に、サービスに必要な接続数に合わせて構成し、グローバルなmaxconnを、haproxyプロセスに処理させる接続の最大数に構成するのが賢明です。サービスが1つしかない場合は、両方に同じ値を設定できます。しかし、多くのサービスがある場合、

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

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

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

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

だから質問は:

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

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

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

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

  3. グローバル接続を把握する場合、それはサーバーセクションで追加された接続の数に、プールの特定の割合を加えたものではありませんか?そして、明らかに接続に他の制約がありますが、実際にはプロキシに送信する数はどれくらいですか?

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


10
これを投稿してくれてありがとう。
タランチュラ

9
私は他の約200のバックエンドをプロキシする1つのプロキシを持っています。バックエンドが1秒あたり約30万接続でDDOS処理されると、他のすべてのバックエンドは停止します。バックエンドサーバー(ddosの下)で値maxconn 2048を使用すると、haproxyは正常に動作します。どうもありがとう、あなたは私を一晩救った:)
hungnv '29
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.