【问题标题】:Difference between global maxconn and server maxconn haproxy全局 maxconn 和服务器 maxconn haproxy 的区别
【发布时间】:2012-02-03 18:00:50
【问题描述】:

我对我的 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. 在计算全局连接时,不应该是在服务器部分加起来的连接数,加上一定百分比的池吗?显然,您对连接还有其他限制,但实际上是您想要发送给代理的数量?

提前谢谢你。

【问题讨论】:

    标签: haproxy


    【解决方案1】:

    威利通过电子邮件给我答复了。我以为我会分享它。他的回答是粗体的。

    我对我的 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。

    在监听块中还有另一个默认为某事 像 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 找到另一个 尽可能可用的服务器,并且它还允许它杀死 如果客户端在连接之前点击“停止”,则在队列中请求 转发到服务器。

    但回到主题,我对这个数字的理论是每个服务器在这个 block 一次只会发送 15 个连接。然后是连接 将等待打开的服务器。如果我打开了 cookie,连接将等待 对于正确的开放服务器。但我没有。

    这正是原理。有一个每个代理队列和一个每个服务器 队列。带有持久性 cookie 的连接进入服务器队列并 其他连接进入代理队列。但是,因为在你的情况下没有 cookie 已配置,所有连接都进入代理队列。你可以看 如果需要,可以在 haproxy 源中的图表 doc/queuing.fig 中解释 如何/在何处做出决定。

    所以问题是:

    1. 如果全局连接数超过 4000 会怎样?他们会死吗?要么 以某种方式在 Linux 中池?

      他们在 linux 中排队。一旦你压倒了内核的队列,那么它们就是 放入内核中。

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

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

    3. 在计算全局连接时,不应该是 在服务器部分添加的连接数,加上一定的百分比 汇集?显然你对连接有其他限制,但是 真的是您要发送给代理的数量吗?

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

    【讨论】:

    • 我有一个 haproxy 代理大约 200 个其他后端。一旦一个后端以大约 300k conneitons/second 被 DDOS 攻击,所有其他后端都会死掉。在后端服务器(在 ddos​​ 下)上使用 maxconn 2048 值,我们的 haproxy 运行良好。非常感谢,你救了我一晚:)
    猜你喜欢
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 2017-01-19
    • 2015-03-05
    • 1970-01-01
    相关资源
    最近更新 更多