全局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个连接。然后,连接将等待打开服务器。如果我有cookie,连接将等待正确的打开服务器。但是我没有。

所以问题是:

  1. 如果全局连接数超过4000,会发生什么?他们会死吗?还是以某种方式在Linux中合​​并?
  2. 全局连接是否与服务器连接相关,而不是您的服务器连接总数不能大于全局?
  3. 确定全局连接时,难道不是服务器部分中添加的连接数量加上一定比例的缓冲池吗?显然,您在连接方面还有其他限制,但实际上是要发送给代理多少个?

先感谢您。

Answers:


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和侦听块的maxconn)的最小值确定。

我不知道如果数字超过4000会怎样。

多余的连接会等待另一连接完成才能被接受。但是,只要内核的队列未达到饱和,客户端甚至都不会注意到这一点,因为该连接在TCP级别被接受但未处理。因此,客户端仅注意到处理请求的一些延迟。但实际上,侦听块的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的速度要快于大量连接。但是为此,您确实需要一台快速的服务器,因为您不需要 不想让所有客户端排队等待连接插槽,因为服务器正在等待数据库。专用服务器也很有效。如果您的站点有很多静态变量,则可以将静态请求定向到服务器(或缓存)池,这样就不会在它们上排队静态请求,并且静态请求不会占用昂贵的连接插槽。希望这会有所帮助,威利


10
感谢您发布此信息。
塔兰图拉毒蛛2012年

9
我有一个haproxy代理大约200个其他后端。一旦后端以每秒约30万个conneitons的速度被DDOS处理,所有其他后端都将消失。后端服务器上的maxconn值为2048(在ddos下),我们的haproxy运行良好。非常感谢,您救了我一晚:)
hungnv 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.