如何为 Linux 主机上的 Docker 容器内运行的超过 500,000 个连接设置 HAProxy?

如何为 Linux 主机上的 Docker 容器内运行的超过 500,000 个连接设置 HAProxy?

我希望我的 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

相关内容