我目前使用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容器保持工作,日志中没有应用程序错误,也没有连接问题,但我的员工都没收到请求(所以我从来没有得到我的回应)。似乎我的请求在服务器引擎和我的应用程序之间的某个地方丢失了。有什么办法可以解决这个问题吗?
- UPDATE**:我已经成功地使用自定义locusload profile:
重现了此行为场景如下:
- UPDATE**:我已经成功地使用自定义locusload profile:
1.在前15分钟内增加到50个用户(其中30个用户将以1 rps发送需要GPU的请求,20个用户将以10 rps发送不需要GPU的请求)
1.再工作4小时如图所示,大约30分钟后API停止响应。(输出中仍然没有错误消息/警告)
- 更新2**:是否会由于不正确的Gunicorn设置或bug(如https://github.com/tiangolo/fastapi/issues/596)而导致隐藏的内存泄漏或死锁?
- 更新4**:我已经进入我的容器并执行了
ps
命令。
- 更新4**:我已经进入我的容器并执行了
PID TTY TIME CMD
120 pts/0 00:00:00 bash
134 pts/0 00:00:00 ps
这意味着我的Gunicorn服务器应用程序只是默默地关闭了。而且在应用程序目录中还有一个名为core
的二进制文件,这显然意味着有东西崩溃了
1条答案
按热度按时间hm2xizp91#
是内存不足错误(OOM),泄漏是
elastic apm
中间件造成的,我把它去掉了,泄漏消失了。