适用于Python REST API的最优gunicorn-worker配置(数量和类别)

som*_*141 6 python rest concurrency gevent gunicorn

可以说我有两个概念上不同的REST API,它们是通过FlaskFalcon之类的框架在Python中开发的,我需要通过Gunicorn在具有4GB RAM和2个vCPU的服务器上进行部署。

API#1:CPU限制

对该API的请求几乎不涉及任何IO,而是受CPU限制。但是,这些运算非常快并且需要很少的存储空间,例如简单的数学运算。

API#2:IO绑定

对该API的请求涉及一系列HTTP请求,例如,对另一个API的请求或通过GET请求获取页面。因此,大部分“工作”都涉及等待其他请求解决。

我的问题是:最佳的Gunicorn工作程序配置(工作程序编号和类)是什么,以便从上述服务器上部署的这些API中获得最佳性能(最好是在并发和每秒请求方面)?

反身我会选择一些gevent级的工人,但是我一直在寻找文档来验​​证上述决定,但无济于事。

任何输入将不胜感激:)

les*_*uge 5

基本上,您需要两件事:并行性和异步。

Gunicorn处理请求的方式是允许每个工作人员处理一个请求。因此,在应用程序前面没有“缓冲区”来处理溢出,并且也没有解决可能的“打雷”问题的解决方案(请参阅此处)。

您将需要运行2个不同的gunicorn实例,每个实例都运行API之一。

理想情况下,应该对每个API的可能负载进行大致估算,因为在这种情况下,并行性非常有限(实际上2个vcore并不多),因此,CPU将成为每个工作人员的瓶颈。

给定gunicorn文档建议(内核数为2 * nr + 1),我将尝试从这里开始,并假设它可能会使服务器超载:

#for API1
workers = 4
worker_class = sync
threads = 2

#for API2
workers = 10
worker_class = gevent
Run Code Online (Sandbox Code Playgroud)

您将不得不根据服务器负载,IO流量和内存可用性来扭曲和调整这些值。您应该使用旨在模拟对两个API同时发出的一系列请求的脚本来测试负载响应(您可以为此使用grequests)。