Linux

如何為 Linux 主機上的 Docker 容器內執行的超過 500,000 個連接設置 HAProxy?

  • November 7, 2021

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

解決方案

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

引用自:https://serverfault.com/questions/1082781