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

标签 python rest concurrency gunicorn gevent

假设我有两个概念上不同的 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/

相关文章:

python - 读取文本文件时删除标点符号[python]

rest - 可以在 CF10 中使用 REST 代替 URL Rewrite 吗?

java - 在客户端处理 REST 异常

scala - 如果另一个任务失败,如何组合两个并行任务以取消一个任务?

java - 什么会使单个任务执行器停止处理任务?

python - 在 Python 中,有没有办法检测使用不正确的变量名?像 VB 的 "Option Explicit"这样的东西?

python - 如何从朴素贝叶斯分类器中的概率密度函数计算概率?

python - 迭代函数列表时首先不是没有响应

json - 具有方法 PATCH/UPDATE 和资源 ID 的 REST API

concurrency - 为什么这个程序在我的系统上终止而不是在 Playground 上?