起因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了
解決
- 修改 Supervisor 配置(最關(guān)鍵)
由于你的 Gunicorn 是由 Supervisor 啟動的,Supervisor 自身的限制決定了子進程的上限。
編輯你的 Supervisor 配置文件(通常在 /etc/supervisor/supervisord.conf )
vi /etc/supervisor/supervisord.conf
加入
[supervisord]
minfds=65535 ; 確保主進程支持高句柄數(shù)

image.png
- 修改 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