bounty还有4天到期。回答此问题可获得+400声望奖励。Nathan Osman希望引起更多关注这个问题。
我部署的应用程序是K8s下Uvicorn的FastAPI。在试图理解我想如何Dockerize应用程序时,我明白了我想在没有Gunicorn的情况下实现Uvicorn,并通过应用程序获得的请求负载添加一个向上/向下扩展的系统。我做了很多负载测试,发现默认1个Uvicorn工人我得到3.5 RPS,而将工人改为8个我可以轻松得到22 RPS(没有检查更多,因为它对我来说是伟大的结果)。
现在我所期望的关于资源的是,我将不得不提供的CPU将限制为8(我假设每个工人都在一个进程和线程上工作),但我只看到内存使用量增加,但CPU中的大麦。也许这是因为应用程序不使用那么多的CPU,但它确实有可能使用超过1个CPU?到目前为止,它还没有使用超过一个CPU。
Uvicorn工人如何工作?我应该如何计算应用程序需要多少工人?我没有找到任何有用的信息。
再次,我的目标是保持一个超薄的机器1 cpu,与自动缩放系统。
1条答案
按热度按时间li9yvcax1#
当使用uvicorn并应用大于1的
--workers
参数时,uvicorn将在内部使用multiprocessing
生成子进程。您必须记住,uvicorn是异步的,HTTP服务器通常受到网络延迟而不是计算的瓶颈。因此,您的工作负载可能不是特别受CPU限制,而是受IO限制。
在不了解服务器在每个请求上所做的工作类型的情况下,确定需要多少工作者的最佳方法是通过经验实验。换句话说,只是测试它,直到你达到极限。
尽管FastAPI文档确实包含了一些针对您的用例的指导:
如果你有一个机器集群,使用Kubernetes,Docker Swarm Mode,Nomad或其他类似的复杂系统来管理多台机器上的分布式容器,那么你可能希望在集群级别处理复制,而不是在每个容器中使用进程管理器(如Gunicorn和worker)。
像Kubernetes这样的分布式容器管理系统通常有一些集成的方式来处理容器的复制,同时仍然支持传入请求的负载平衡。都在集群级别。
在这些情况下,您可能希望从头开始构建Docker镜像,安装依赖项,并运行单个Uvicorn进程,而不是使用Uvicorn worker运行Gunicorn之类的东西。- FastAPI文档
强调我的。