2012-01-05 103 views
69

我有一个关于我的HAProxy的配置问题:MAXCONN 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. 当确定全局连接时,不应该是服务器部分中累计的连接数量加上一定比例的池化?显然你对连接有其他限制,但是真的有多少你想要发送给代理?

在此先感谢您。

回答

118

威利通过电子邮件给我一个答案。我想我会分享它。他的回答大胆。

我有一个关于我的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,在监听块中。

而且还有另外一个在听块,默认为东西 像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. 当搞清楚全球连接,应该不会是在服务器部分加起来 连接的数量,加上 统筹一定比例?显然你对连接有其他约束,但是 真的是你想要发送给代理的数量是多少?

    你说得对。如果你的服务器的响应时间很短,没有什么 排队成千上万的连接错误,因为它大大减少了请求处理时间,因此一次只能处理几个连接, 。实际上,现在建立连接的 在一个千兆位的局域网上需要大约5微秒。因此,让haproxy尽可能快地将连接 从其队列中分配到具有非常小的maxconn的服务器是非常有意义的。 我记得一个游戏网站排队超过30000并发连接 和运行队列30每服务器!这是一个apache服务器,并且 apache用少量连接比用大号 号码快得多。但是对于这个你真的需要一个快速的服务器,因为你不想让所有的客户端排队等待连接插槽,因为 服务器正在等待数据库。 还有一些工作得很好的东西是专用服务器。如果您的站点 有许多静态,您可以将静态请求定向到服务器池 (或缓存),以便您不会在它们上排队静态请求,并且静态请求不会占用昂贵的连接插槽。 希望这会有所帮助, 威利

+4

感谢张贴此。 – Tarantula 2012-06-29 03:13:07

+8

我有一个代理约200个后端的haproxy。一旦后端以约300k连续/秒的DDOS编码,所有其他后端就会死亡。在后端服务器上的值为maxconn 2048(在ddos下),我们的haproxy运行良好。谢谢你,你救了我一个晚上:) – hungnv 2012-12-29 13:22:06

+2

威利==神... – cherouvim 2017-11-02 13:50:15