全局maxconn和服务器maxconn haproxy之间的区别

cha*_*man 86 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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样直截了当,但我对maxconn属性如何工作有点困惑.

在listen块中,服务器上有全局one和maxconn.我的想法是这样的:全局管理作为服务的haproxy连接总数将一次排队或处理.如果数量超过这个数量,它会杀死连接,还是某些linux套接字中的池?我不知道如果数字高于4000会发生什么.

然后你将服务器maxconn属性设置为15.首先,我将其设置为15,因为我的php-fpm,这是转发到一个单独的服务器上,只有它可以使用的这么多子进程,所以我确保我是在这里汇集请求,而不是在php-fpm中.我觉得哪个更快.

但回到这个主题,关于这个数字的理论是这个块中的每个服务器一次只能发送15个连接.然后连接将等待打开的服务器.如果我打开了cookie,连接将等待CORRECT打开服务器.但我没有.

所以问题是:

  1. 如果全球连接超过4000会发生什么?他们死了吗?或以某种方式在Linux中池?
  2. 全局连接是否与服务器连接相关,除了事实上您不能使服务器连接总数大于全局?
  3. 在确定全局连接时,不应该是服务器部分中添加的连接数量加上一定的池化百分比吗?很明显,你对连接有其他约束,但实际上你想要发送给代理的数量是多少?

先感谢您.

cha*_*man 153

威利通过电子邮件给我一个答案.我以为我会分享它.他的答案是大胆的.

我对我的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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样直截了当,但我对maxconn属性如何工作有点困惑.

在listen块中,服务器上有全局one和maxconn.

而listen块中还有另一个默认为2000的东西.

我的想法是这样的:全局管理作为服务的haproxy连接总数将一次排队或处理.

正确.它是每进程最大并发连接数.

如果数量超过这个数量,它会杀死连接,还是某些linux套接字中的池?

后者,它只是停止接受新连接,它们仍保留在内核的套接字队列中.可编程套接字的数量由(net.core.somaxconn,net.ipv4.tcp_max_syn_backlog和listen块的maxconn)的min确定.

我不知道如果数字高于4000会发生什么.

多余的连接在被接受之前等待另一个连接完成.但是,只要内核的队列未饱和,客户端甚至不会注意到这一点,因为连接在TCP级别被接受但未被处理.因此客户端只注意到处理请求的一些延迟.但实际上,listen块的maxconn更重要,因为默认情况下它比全局的小.listen的maxconn限制了每个监听器的连接数.通常,最好根据服务所需的连接数配置它,并将全局maxconn配置为让haproxy进程处理的最大连接数.如果只有一个服务,则两者都可以设置为相同的值.但是当你有很多服务时,你可以很容易地理解它会产生很大的不同,因为你不希望单个服务占用所有连接并阻止其他服务工作.

然后你将服务器maxconn属性设置为15.首先,我将其设置为15,因为我的php-fpm,这是转发到一个单独的服务器上,只有它可以使用的这么多子进程,所以我确保我是在这里汇集请求,而不是在php-fpm中.我觉得哪个更快.

是的,它不仅应该更快,而且它允许haproxy尽可能找到另一个可用的服务器,并且如果客户端在连接转发到服务器之前命中"停止",它还允许它终止队列中的请求.

但回到这个主题,关于这个数字的理论是这个块中的每个服务器一次只能发送15个连接.然后连接将等待打开的服务器.如果我打开了cookie,连接将等待CORRECT打开服务器.但我没有.

这正是原则.有每个代理队列和每个服务器队列.与持久性cookie的连接转到服务器队列,其他连接转到代理队列.但是,由于在您的情况下没有配置cookie,所有连接都将转到代理队列.如果需要,您可以查看haproxy源中的图doc/queuing.fig,它解释了决策的执行方式/位置.

所以问题是:

  1. 如果全球连接超过4000会发生什么?他们死了吗?或以某种方式在Linux中池?

    他们在linux中排队.一旦你压倒了内核的队列,它们就会被丢弃在内核中.

  2. 全局连接是否与服务器连接相关,除了事实上您不能使服务器连接总数大于全局?

    不,全局和服务器连接设置是独立的.

  3. 在确定全局连接时,不应该是服务器部分中添加的连接数量加上一定的池化百分比吗?很明显,你对连接有其他约束,但实际上你想要发送给代理的数量是多少?

    你做对了.如果您的服务器的响应时间很短,那么排队数千个连接一次只能服务几个连接没有任何问题,因为它大大减少了请求处理时间.实际上,现在建立连接在千兆位LAN上大约需要5微秒.因此,让haproxy尽可能快地将连接从其队列分发到具有非常小的maxconn的服务器是很有意义的.我记得有一个游戏站点排队超过30000个并发连接,每个服务器运行30个队列!它是一个apache服务器,apache比少数连接的连接数少得多.但为此你真的需要一个快速的服务器,因为你不想让所有的客户端排队等待连接槽,因为服务器正在等待数据库.另外一个非常有效的方法是专用服务器.如果您的站点有许多静态,您可以将静态请求定向到服务器池(或缓存),这样就不会对它们排队静态请求,并且静态请求不会占用昂贵的连接槽.希望这有帮助,威利

  • 感谢发布此内容. (10认同)
  • 我有一个haproxy代表大约200个其他后端.一旦后端被DDOS编辑,大约有~30万连接/秒,其他所有后端都会死掉.在后端服务器上使用maxconn 2048(在ddos下),我们的haproxy运行良好.非常感谢你,你救了我一晚:) (8认同)