我希望我的 HAProxy 负载均衡器能够处理至少 1M 个连接。我需要它来部署压力测试。
我尝试设置:
maxconn 1000000
在我的haproxy.cfg
但 HAProxy 启动失败:
[haproxy.main()] Cannot raise FD limit to 2000029, limit is 1048576.
我在 Ubuntu Linux 20.04 LTS 上的 Docker 容器中运行 HAProxy,这是一个 Amazon AWS Lightsail VPS 实例。
我在网上查看了各种关于如何手动增加open files
限制(ulimit -n
)的问题,并将大量配置复制粘贴到我的主机中。但都不起作用——我无法将此限制增加到高于 1048576 的任何值。
我发现了有关打开文件数量的硬限制主题的以下相关帖子:
这个问题似乎与我的问题几乎相同:
我是从错误的角度来处理这个问题的吗? 还有其他方法可以配置 HAProxy,以便它可以处理一百万个连接(即不增加ulimit -n
)吗?
答案1
解决方案
极限open files
可增加。
... 每个进程的硬限制默认设置为 1048576,但可以使用“fs.nr_open”sysctl 进行更改。 从:HAProxy 管理指南 | 5. 文件描述符限制
我偶然发现了一个有用的资源关于如何增加fs.nr_open
。这是我最终做的事情(在我的主机上):
# 0. ssh into my cloud instance
# 1. change to root
sudo su -
# 2. increase the limit
sysctl -w fs.nr_open=2010000
# 3. save changes and exit
sysctl -p
exit
# 4. now you are back in the user shell; you need to re-log
# from this shell as well for the changes to take effect
exit
请注意,所做的更改在重启后不会保留。如果有人知道如何做到这一点,请告诉我,我会修改我的答案。
我还需要告诉 Docker,在容器中打开超过 1,048,576 个文件是可以的。我使用 Docker Compose 文件来定义我的服务。我只需将以下代码片段添加到我的文件中docker-compose.yml
:
services:
proxy:
image: haproxy
# Begin snippet
ulimits:
nofile:
soft: 2005000
hard: 2005000
# End snippet
# ...
# ...
最后但并非最不重要的一点是,确保主机实例至少有 2GB 的 RAM,否则当您尝试运行代理时,内存会耗尽。如果您真的想用代理处理 100 万个请求,您将需要更多的内存 - 大约 20 到 30 GB - 请随意自行测试。如果您知道如何计算限制,请随意编辑我的答案或在下面发表评论!
关于打开文件数量的理由
如果 100 万个连接需要打开 2,000,029 个文件,那么:
- 将代理容器限制设置为略高于该值:2,000,029 + 4971 = 2,005,000
- 将主机操作系统限制设置为略高于该值:2,005,000 + 5000 = 2,010,000