我目前正在使用 FastApi 和 Gunicorn/Uvicorn 作为我的服务器引擎。
我正在为 Gunicorn 使用以下配置:
TIMEOUT 0
GRACEFUL_TIMEOUT 120
KEEP_ALIVE 5
WORKERS 10
Uvicorn所有默认设置,在docker容器中随便启动:
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
一切都装在码头集装箱里。
问题如下:
一段时间后(1 天到 1 周之间,取决于负载)我的应用程序停止响应(即使是简单的
curl http://0.0.0.0:8000
命令也永远挂起)。 Docker 容器继续工作,日志中没有应用程序错误,也没有连接问题,但我的工作人员都没有收到请求(所以我永远不会收到回复)。似乎我的请求在服务器引擎和我的应用程序之间丢失了。任何想法如何解决它?
更新:我已经设法用自定义locust负载配置文件重现此行为: 场景如下:
更新 2: 由于不正确的Gunicorn设置或错误(例如https://github.com/tiangolo/fastapi/issues/596),是否会存在任何隐藏的内存泄漏或死锁?
更新 4: 我已经进入我的容器并执行了
ps
命令。它显示:
PID TTY TIME CMD
120 pts/0 00:00:00 bash
134 pts/0 00:00:00 ps
这意味着我的 Gunicorn 服务器应用程序只是默默地关闭了。并且在应用程序目录中还有一个名为
core
的二进制文件,这显然意味着某些东西已经崩溃了
这是一个内存不足错误(OOM)。泄漏是由
elastic apm
中间件引起的。我把它取下来,泄漏就消失了。