Uvicorn 工人如何工作?一台超薄机器需要多少工人?

Dor*_*orZ 5 python worker asgi fastapi uvicorn

我部署的应用程序是K8s下的FastAPI with Uvicorn。在尝试了解如何对应用程序进行 Docker 化时,我明白我想在没有 Gunicorn 的情况下实现 Uvicorn,并添加一个根据应用​​程序收到的请求负载进行扩展/缩减的系统。我做了很多负载测试,发现默认情况下有 1 个 Uvicorn 工作人员,我可以获得 3.5 RPS,而将工作人员更改为 8 个时,我可以轻松获得 22 RPS(没有检查更多,因为这对我来说效果很好) 。

现在,我对资源的期望是,我必须提供的 CPU 限制为 8(我假设每个工作人员在一个进程和线程上工作),但我只看到内存使用量增加,但大麦在CPU中。也许是因为应用程序不使用那么多的 CPU,但它确实有可能使用超过 1 个 CPU?到目前为止,它没有使用超过一个CPU。

Uvicorn 工人如何工作?我应该如何计算该应用程序需要多少工作人员?我没有找到任何有用的信息。

再说一次,我的目标是保持一台 1 个 cpu 的超薄机器,并具有自动缩放系统。 LOCUST 20 RPS 截图

Grafana CPU 使用情况截图

小智 8

当使用 uvicorn 并应用--workers大于 1 的参数时,uvicorn 将使用 内部生成子进程multiprocessing

您必须记住 uvicorn 是异步的,HTTP 服务器通常受到网络延迟而不是计算的瓶颈。因此,您的工作负载可能不是特别受 CPU 限制,而是受 IO 限制。

如果不了解服务器对每个请求所完成的工作类型的更多信息,确定需要多少工作人员的最佳方法是通过经验实验。换句话说,只是测试它,直到达到极限。

尽管 FastAPI 文档确实包含一些针对您的用例的指导:

如果您有一个具有 Kubernetes、Docker Swarm Mode、Nomad 或其他类似复杂系统的机器集群来管理多台机器上的分布式容器,那么您可能希望在集群级别处理复制,而不是使用进程管理器(如 Gunicorn)与工人)在每个容器中

像 Kubernetes 这样的分布式容器管理系统之一通常具有某种集成的方式来处理容器的复制,同时仍然支持传入请求的负载平衡。全部在集群级别。

在这些情况下,您可能希望按照上面的说明从头开始构建 Docker 映像,安装依赖项并运行单个 Uvicorn 进程,而不是运行 Gunicorn 和 Uvicorn Workers 之类的东西。- FastAPI 文档

强调我的。