Python REST API 的最佳 gunicorn-worker 配置(数量和 class)
Optimal gunicorn-worker configuration (number and class) for Python REST APIs
假设我有两个概念上不同的 REST API 在 Python 中通过类似 Flask or Falcon which I need to deploy through Gunicorn 的框架在具有 4GB RAM 和 2 vCPU 的服务器上开发s.
API #1: CPU-绑定
对此 API 的请求几乎不涉及 IO,而是 CPU 绑定。尽管如此,操作非常快并且需要很少的内存,例如简单的数学运算。
API #2:IO 绑定
对这个 API 的请求涉及一系列 HTTP 请求,例如对另一个 API 的请求或通过 GET 请求获取页面。因此,大多数 'work' 涉及等待其他请求的解决。
我的问题是:最佳的 Gunicorn worker 配置(worker 数量和 classes)应该是什么才能获得最佳性能(最好是在并发性和每秒请求数方面)这些 API 部署在上述服务器上?
本能地我会选择一些 gevent-class 工作人员,但我一直在搜索文档以验证上述决定无济于事。
如有任何意见,我们将不胜感激:)
基本上你需要两个不同的东西:并行和异步。
Gunicorn 处理请求的方式是让每个 worker 处理一个请求。因此,应用程序前面没有 "buffer" 来处理溢出,也没有解决可能的 "thundering herd" 问题 (see here).
您将需要 运行 2 个不同的 gunicorn 实例,每个 运行ning API 之一。
理想情况下,您应该对每个 API 的可能负载有一个大概的估计,因为在您的情况下,并行性非常有限(2 个 vcores 实际上并不多),因此,CPU将成为每个工人的瓶颈。
鉴于 gunicorn 文档建议(2* 内核数 + 1)我会尝试从这里开始,基本假设它可能会使服务器过载:
#for API1
workers = 4
worker_class = sync
threads = 2
#for API2
workers = 10
worker_class = gevent
您将不得不根据您的服务器负载、IO 流量和内存可用性来扭曲和调整这些值。您应该使用旨在模拟对 API 的一系列同时请求的脚本来测试负载响应(您可以为此使用 grequests)。
假设我有两个概念上不同的 REST API 在 Python 中通过类似 Flask or Falcon which I need to deploy through Gunicorn 的框架在具有 4GB RAM 和 2 vCPU 的服务器上开发s.
API #1: CPU-绑定
对此 API 的请求几乎不涉及 IO,而是 CPU 绑定。尽管如此,操作非常快并且需要很少的内存,例如简单的数学运算。
API #2:IO 绑定
对这个 API 的请求涉及一系列 HTTP 请求,例如对另一个 API 的请求或通过 GET 请求获取页面。因此,大多数 'work' 涉及等待其他请求的解决。
我的问题是:最佳的 Gunicorn worker 配置(worker 数量和 classes)应该是什么才能获得最佳性能(最好是在并发性和每秒请求数方面)这些 API 部署在上述服务器上?
本能地我会选择一些 gevent-class 工作人员,但我一直在搜索文档以验证上述决定无济于事。
如有任何意见,我们将不胜感激:)
基本上你需要两个不同的东西:并行和异步。
Gunicorn 处理请求的方式是让每个 worker 处理一个请求。因此,应用程序前面没有 "buffer" 来处理溢出,也没有解决可能的 "thundering herd" 问题 (see here).
您将需要 运行 2 个不同的 gunicorn 实例,每个 运行ning API 之一。
理想情况下,您应该对每个 API 的可能负载有一个大概的估计,因为在您的情况下,并行性非常有限(2 个 vcores 实际上并不多),因此,CPU将成为每个工人的瓶颈。
鉴于 gunicorn 文档建议(2* 内核数 + 1)我会尝试从这里开始,基本假设它可能会使服务器过载:
#for API1
workers = 4
worker_class = sync
threads = 2
#for API2
workers = 10
worker_class = gevent
您将不得不根据您的服务器负载、IO 流量和内存可用性来扭曲和调整这些值。您应该使用旨在模拟对 API 的一系列同时请求的脚本来测试负载响应(您可以为此使用 grequests)。