Python REST API的最佳gunicorn-worker配置(数量和类)

时间:2016-04-26 13:19:21

标签: python rest concurrency gunicorn gevent

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

API#1:CPU绑定

对此API的请求涉及很少甚至没有IO,但是受CPU限制。尽管如此,操作非常快并且需要很少的记忆,例如简单的数学运算。

API#2:IO绑定

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

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

我反思性地选择了一些gevent级别的工作人员,但是我一直在搜索文档来验证这个决定无济于事。

任何意见都将受到赞赏:)

1 个答案:

答案 0 :(得分:5)

基本上你需要两个不同的东西:并行和异步。

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

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

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

鉴于gunicorn文档建议(2 * nr核心+ 1),我会尝试从这里开始,基本假设它可能会使服务器超载:

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

#for API2
workers = 10
worker_class = gevent

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