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 属性的工作方式有点困惑。

在服务器上的监听块中有全局和 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 属性的工作方式有点困惑。

在服务器上的监听块中有全局和 maxconn。

在 listen 块中还有另一个默认为 2000 之类的东西。

我的想法是这样的:全局的管理 haproxy 作为一项服务将同时查询或处理的连接总数。

正确的。这是每个进程的最大并发连接数。

如果数字超过该数字,它要么终止连接,要么在某个 linux 套接字中池化?

后者,它只是停止接受新连接,并且它们保留在内核的套接字队列中。可排队套接字的数量由(net.core.somaxconn、net.ipv4.tcp_max_syn_backlog 和侦听块的 maxconn)的最小值确定。

我不知道如果数字超过 4000 会发生什么。

多余的连接在被接受之前等待另一个连接完成。然而,只要内核的队列没有饱和,客户端甚至不会注意到这一点,因为连接在 TCP 级别被接受但没有被处理。所以客户端只注意到处理请求的一些延迟。但实际上,listen 块的 maxconn 更为重要,因为默认情况下它比全局的要小。侦听器的 maxconn 限制每个侦听器的连接数。通常,明智的做法是将其配置为您想要的服务连接数,并将全局 maxconn 配置为您让 haproxy 进程处理的最大连接数。当您只有一项服务时,可以将两者设置为相同的值。但是当你有很多服务时,

然后你将服务器 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 个队列!它是一个 apache 服务器,与少量连接相比,连接数量多时 apache 的速度要快得多。但是为此,您确实需要一个快速的服务器,因为您不需要 不想让所有客户端排队等待连接槽,因为服务器正在等待数据库。还有一个非常有效的方法是专用服务器。如果您的站点有许多静态,您可以将静态请求定向到服务器池(或缓存),这样您就不会在它们上排队静态请求,并且静态请求不会占用昂贵的连接槽。希望这会有所帮助,威利

于 2012-01-07T17:32:09.557 回答