FastAPI:一些请求由于 10 秒超时而失败

FastAPI: Some requests are failing due to 10s timeout

我们已经在使用 FastAPI 的生产中部署了模型预测服务,不幸的是,一些请求由于 10 秒超时而失败。在并发请求方面,我们通常每秒只加载大约 2/3 请求,所以我认为这不会对 FastAPI 造成太大压力。我们尝试做的第一件事是将 FastAPI 框架与模型本身隔离开来,当我们执行一些跟踪时,我们注意到很多时间(6 秒)花在了这个片段上:starlette.exceptions:ExceptionMiddleware.__call__.

我们使用的 gunicorn 配置似乎也没有帮助:

"""gunicorn server configuration."""
import os
​
threads = 2
workers = 4
timeout = 60
keepalive = 1800
graceful_timeout = 1800
bind = f":{os.environ.get('PORT', '80')}"
worker_class = "uvicorn.workers.UvicornWorker"

非常希望能就上述部分的含义以及在不太繁重的负载下导致某些请求超时问题的原因提供一些指导。

guidance on what the above segment implies

here 你有官方的 gunicorn 配置文件,里面有很多解释。

由于您使用 gunicorn 来管理 uvicorn worker,将超时强制设置为 60 秒对于 lnog 运行 任务应该可以正常工作(您应该考虑使用异步任务队列或作业队列,例如 celery)

但是什么返回你的路线? 首先是查看 api

抛出的错误

starlette.exceptions:ExceptionMiddleware.call

由于您扩展了列表,您可以看到花费最多时间(如预期)的并不快api 也不是 starlette,而是您在 app.api.routes.predictions.

中运行

so I wouldn't think that would be too much strain on FastAPI

它不会太快api因为它不涉及您的请求处理。请记住,fastapi“只是”一个框架,因此当您的函数需要时间时,那是您的 function/development 出了问题。

这里可能是导致长时间运行任务的其中一个或多个:

  • 同步路由
  • 阻塞 I/O 函数或在你的路由函数中处理
  • 需要很多时间(可能太多)的预测算法
  • 糟糕的工作人员class 配置适合您的治疗类型

当你经常做 AI 或 nlp 的东西时,如果花费大量的处理时间,关于在 api 中集成这些模型,你使用像 celery 这样的任务队列。如果您的 api 没有问题并且您的路线没有返回错误,只是需要花费很多时间,您应该看看实现任务队列的。