如何為 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
)?
解決方案
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