提升單進程最大支持連接數(shù)

起因flask-socket.io+gevent 突然在flask-log日志里出現(xiàn)大量,并且晚上高峰期直接崩了

OSError: [Errno 24] Too many open files
2026-02-26T13:49:26Z <PyWSGIServer at 0x73f3f2864350 fileno=3 address=127.0.0.1:8002> failed with OSError

估計是在線連接數(shù)超負荷了。

為什么會發(fā)生這個錯誤?

在 Linux/Unix 系統(tǒng)中,“一切皆文件”,這包括網(wǎng)絡(luò)連接(Sockets)。由于 Flask-SocketIO 需要與客戶端保持長連接(WebSocket 或長輪詢),每一個連接到你服務(wù)器的客戶端都會占用一個“文件描述符(File Descriptor)”。

Linux 系統(tǒng)默認通常會限制每個進程最多只能打開 1024 個文件描述符。當你的并發(fā)連接數(shù)(加上你的應(yīng)用打開的數(shù)據(jù)庫連接、日志文件、API 請求等)超過這個限制時,Gevent 在嘗試接收(_accept)新的客戶端連接時,就會因為無法分配新的文件描述符而直接崩潰并拋出這個錯誤。

系統(tǒng)默認限制太低:Ubuntu 默認通常是 1024,在高并發(fā)場景下瞬間就會打滿。

首先查看項目gunicorn的pid

#查看項目的pid
ps aux | grep momo_api_venv
image.png

查看該進程的實時限制:

cat /proc/<PID>/limits | grep "Max open files"
image.png

查看實際占用情況

lsof -p <PID> | wc -l (查看該進程開了多少個句柄)
lsof -p <PID> (查看這些句柄具體是什么)
占用900多個了,高峰期肯定過1000了

解決

  1. 修改 Supervisor 配置(最關(guān)鍵)
    由于你的 Gunicorn 是由 Supervisor 啟動的,Supervisor 自身的限制決定了子進程的上限。

編輯你的 Supervisor 配置文件(通常在 /etc/supervisor/supervisord.conf )

vi /etc/supervisor/supervisord.conf

加入

[supervisord]
minfds=65535  ; 確保主進程支持高句柄數(shù)
image.png
  1. 修改 Systemd 服務(wù)限制
sudo EDITOR=vi systemctl edit supervisor

寫入內(nèi)容

[Service]
LimitNOFILE=65535

輸入 :wq 保存并退出。

#重新加載生效
sudo systemctl daemon-reload
sudo systemctl restart supervisor
image.png

用前面的方法,看下最大openfiles是否修改成功


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容