带有 gunicorn/uvicorn 的 FastApi 停止响应

问题描述 投票:0回答:1

我目前正在使用 FastApiGunicorn/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负载配置文件重现此行为: 场景如下:

  1. 在最初的 15 分钟内增加到 50 个用户(其中 30 个将以 1 rps 的速度发送需要 GPU 的请求,而 20 个将以 10 rps 的速度发送不需要 GPU 的请求)
  2. 再工作4小时 如图所示,大约 30 分钟后 API 停止响应。 (而且,输出中仍然没有错误消息/警告)

更新 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
的二进制文件,这显然意味着某些东西已经崩溃了

python docker fastapi gunicorn uvicorn
1个回答
0
投票

这是一个内存不足错误(OOM)。泄漏是由

elastic apm
中间件引起的。我把它取下来,泄漏就消失了。

© www.soinside.com 2019 - 2024. All rights reserved.