首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >全局maxconn和服务器maxconn haproxy的区别

全局maxconn和服务器maxconn haproxy的区别
EN

Stack Overflow用户
提问于 2012-01-06 06:06:05
回答 1查看 71.8K关注 0票数 97

我有一个关于我的haproxy配置的问题:

代码语言:javascript
复制
#---------------------------------------------------------------------
# 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会发生什么情况?他们会死吗?
  2. 是与服务器连接相关的全局连接,除此之外,服务器连接的总数不能大于全局?
  3. 当计算出全局连接时,它不应该是服务器部分中的连接总数加上一定的池化百分比吗?显然,您对连接还有其他限制,但实际上它是您想要发送给代理的数量。--

提前谢谢你。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-08 01:32:10

威利通过电子邮件给我回了个信。我想我会分享它。他的答案是粗体的。

我有一个关于我的haproxy配置的问题:

代码语言:javascript
复制
   #---------------------------------------------------------------------
   # 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限制每个侦听器的连接数。通常,明智的做法是将其配置为您想要的服务连接数,并将全局maxconn配置为您让haproxy进程处理的最大连接数。当您只有一个服务时,可以将这两个服务设置为相同的值。但是当你有许多服务时,你会很容易理解这有很大的不同,因为你不想让一个服务占用所有的连接并阻止其他服务工作。

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

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

但回到这个问题上,我关于这个数字的理论是,这个块中的每个服务器一次只能发送15个连接。然后连接将等待打开的服务器。如果我打开了cookie,连接将等待正确的打开服务器。但我不知道。

,这就是原则。有一个按代理队列和一个按服务器队列。具有持久性cookie的连接转到服务器队列,其他连接转到代理队列。但是,由于在您的示例中没有配置cookie,因此所有连接都会转到代理队列。如果您愿意,可以查看haproxy源代码中的图表doc/where ing.fig,它解释了如何/在何处做出决定。

所以问题是:

  1. 如果全局连接数超过4000会发生什么情况?他们会死吗?还是Linux中的池?

他们在linux里排队。一旦你压倒了内核的队列,它们就会在kernel.

  • Are中丢弃与服务器连接相关的全局连接,除了你不能让服务器连接的总数大于全局连接这一事实?

不是,全局和服务器连接设置是用来计算全局连接的,它不应该是服务器部分中添加的连接数,再加上一定百分比的池吗?显然,您对连接还有其他限制,但实际上它是您想要发送给代理的数量?

,你说对了。如果您的服务器的响应时间很短,那么将数千个连接排入队列以便一次只为几个连接提供服务是没有错的,因为它可以大大缩短请求处理时间。实际上,现在在千兆局域网上建立连接大约需要5微秒。因此,让haproxy尽可能快地将连接从它的队列分发到具有非常小的maxconn的服务器是很有意义的。我记得有一个游戏站点排队超过30000个并发连接,并且每台服务器有30个队列!这是一台apache服务器,在连接数量较少的情况下,apache的速度要比连接数量较大的情况下快得多。但要做到这一点,您确实需要一个快速的服务器,因为您不想让所有的客户端都排队等待连接插槽,因为服务器正在等待数据库。还有一件非常有效的事情就是专用服务器。如果您的站点有许多静态请求,您可以将静态请求定向到一个服务器(或缓存)池,这样您就不会在服务器(或缓存)上对静态请求进行排队,并且静态请求也不会占用昂贵的连接插槽。希望这能有所帮助,Willy

票数 175
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8750518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档