假设我有两个概念上不同的 REST API,它们是通过类似 Flask 的框架用 Python 开发的或 Falcon我需要通过 Gunicorn 进行部署在具有 4GB RAM 和 2 个 vCPU 的服务器上。
API #1:受 CPU 限制
对该 API 的请求几乎不涉及 IO,而是受 CPU 限制。尽管如此,操作非常快并且需要很少的内存,例如简单的数学运算。
API #2:IO 绑定(bind)
对该 API 的请求涉及一系列 HTTP 请求,例如,对另一个 API 或通过 GET 请求获取页面。因此,大部分“工作”涉及等待其他请求的解决。
我的问题是:最佳 Gunicorn worker 配置(worker 数量和类)应该是什么,以便从部署在上述服务器上的这些 API 中获得最佳性能(最好是在并发性和每秒请求数方面) ?
本能地,我会选择一些 gevent 级 worker ,但我一直在搜索文档以验证上述决定无济于事。
任何输入将不胜感激:)
最佳答案
基本上你需要两个不同的东西:并行和异步。
Gunicorn 处理请求的方式是让每个 worker 处理一个请求。因此,应用程序前面没有“缓冲区”来处理溢出,也没有解决可能的“雷霆万钧”问题的方法 (see here)。
您将需要运行 2 个不同的 gunicorn 实例,每个实例运行一个 API。
理想情况下,您应该对每个 API 的可能负载有一个大概的估计,因为在您的情况下,并行度非常有限(2 个 vcore 并不多),因此,CPU 将成为每个工作人员的瓶颈。
鉴于 gunicorn 文档建议(2* 内核数 + 1),我会尝试从这里开始,基本假设它可能会使服务器过载:
#for API1
workers = 4
worker_class = sync
threads = 2
#for API2
workers = 10
worker_class = gevent
您将不得不根据您的服务器负载、IO 流量和内存可用性来扭曲和调整这些值。您应该使用旨在模拟对两个 API 的一系列同时请求的脚本来测试负载响应(您可以为此使用 grequests)。
关于python - Python REST API 的最佳 gunicorn-worker 配置(数量和类),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36866162/