威利通过电子邮件给了我答复。我想我会分享它。他的答案是粗体的。
我对我的 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 属性有效。
服务器上的监听块中有全局连接和最大连接。
监听块中还有另一个默认值
就像2000年一样。
我的想法是这样的:全局管理连接总数
haproxy 作为一项服务,将同时进行查询或处理。
正确的。这是每个进程的最大并发连接数。
如果数量
超过这个值,它要么终止连接,要么在某些 linux 中进行池化
插座?
后者,它只是停止接受新连接,并且它们保留在
内核中的套接字队列。确定可排队套接字的数量
通过 (net.core.somaxconn, net.ipv4.tcp_max_syn_backlog 的最小值,以及
监听块的 maxconn)。
我不知道如果这个数字超过 4000 会发生什么。
多余的连接会等待另一个连接完成后再进行处理
公认。然而,只要内核的队列没有饱和,
客户端甚至没有注意到这一点,因为连接已在
TCP级别但不被处理。所以客户只会注意到一些延迟
处理请求。
但在实践中,监听块的 maxconn 更为重要,
因为默认情况下它比全局小。聆听的最大康恩
限制每个侦听器的连接数。一般来说,明智的做法是
将其配置为您想要的服务连接数,
并将全局 maxconn 配置为最大连接数
你让 haproxy 进程处理。当你只有一项服务时,
两者可以设置为相同的值。但当你有很多服务时,
你可以很容易地理解它会产生巨大的差异,因为你不知道
想要一个服务来获取所有连接并防止
其他的工作。
然后将服务器 maxconn 属性设置为 15。首先,我将其设置为
15 因为我的 php-fpm,这是转发到一个单独的服务器上,只有
它可以使用如此多的子进程,所以我确保我正在汇集请求
在这里,而不是在 php-fpm 中。我认为哪个更快。
是的,它不仅应该更快,而且允许 haproxy 找到另一个
尽可能使用可用的服务器,并且它还允许它杀死
如果客户端在连接之前点击“停止”,则请求在队列中
转发到服务器。
但回到主题,我关于这个数字的理论是这个中的每个服务器
块一次只会发送 15 个连接。然后是连接
将等待开放的服务器。如果我打开了cookie,连接就会等待
对于正确的开放服务器。但我不这么认为。
正是这个原理。有一个每个代理队列和一个每个服务器队列
队列。带有持久性cookie的连接进入服务器队列并
其他连接进入代理队列。但是,因为在你的情况下没有
配置 cookie 后,所有连接都会进入代理队列。你可以看
如果需要的话,可以在 haproxy 源中的图表 doc/queuing.fig 中进行解释
如何/在哪里做出决定。
所以问题是:
-
如果全球连接数超过 4000 会发生什么?他们会死吗?或者
Linux 中的池以某种方式?
它们在 Linux 中排队。一旦你压垮了内核的队列,那么它们就会
放入内核中。
-
全局连接是否与服务器连接相关,除了
事实上,服务器连接总数不能大于
全球的?
不,全局和服务器连接设置是独立的。
-
在计算全局连接时,不应该是数量
在服务器部分添加的连接数,加上一定的百分比
汇集?显然你对连接还有其他限制,但是
实际上您想发送多少个给代理?
你做对了。如果你的服务器的响应时间很短,那就没有什么
将数千个连接排队以一次只服务几个连接是错误的,
因为它大大减少了请求处理时间。几乎,
如今在千兆位上建立连接大约需要 5 微秒
局域网。所以让 haproxy 分配连接是很有意义的
尽可能快地从队列到具有非常小的 maxconn 的服务器。
我记得一个游戏网站排队的并发连接数超过 30000
每台服务器的队列为 30 个!这是一个 apache 服务器,并且
apache 在少量连接时比在大量连接时要快得多
数字。但为此你确实需要一个快速的服务器,因为你不需要
想让所有客户端排队等待连接槽,因为
例如,服务器正在等待数据库。
另外一个非常有效的方法是专用服务器。如果您的网站
有很多静态,您可以将静态请求定向到服务器池
(或缓存),这样您就不会在它们上排队静态请求,并且
静态请求不会占用昂贵的连接槽。
希望这有帮助,
威利