云 运行 与 Gunicorn 最佳实践
Cloud Run with Gunicorn Best-Practise
我目前正在开发一项服务,该服务应该在云中提供 HTTP 端点 运行,但我没有太多经验。我目前使用的是flask+gunicorn,也可以调用服务。我现在的主要问题是针对多个同时请求进行优化。当前,Cloud 运行 中的服务分配了 4GB 内存和 1 CPU。当它被调用一次时,直接启动的实例会消耗 3.7GB 内存和 CPU 的大约 40-50%(我使用神经网络来嵌入我的数据)。目前,我的设置非常基础:
- 内存:4096M
- CPU: 1
- 最小实例数:0
- 最大实例数:1
- 并发数:80
- 工人:1 (Gunicorn)
- 线程:1 (Gunicorn)
- 超时:0(Gunicorn,由 Google 推荐)
如果我将工人数量增加到两个,我需要将内存增加到 8GB。如果我这样做,我的服务应该能够在一个实例上同时处理两个请求,如果分配了这个 1 CPU,那么它有一个以上的核心。但是,如果有第三个请求,会发生什么?我想,Cloud 运行 将启动第二个实例。新实例是否也获得 1 CPU 和 8GB 内存,如果没有,对我来说最佳做法是什么?
最佳实践之一是让 Cloud 运行 自动扩展,而不是尝试优化每个实例。使用 1 个 worker 是限制内存占用和减少冷启动的好主意。
我建议使用线程,通常将其设置为 8 或 16 以利用并发参数。
如果您将这些值设置得太低,Cloud 运行 内部负载均衡器会将请求路由到实例,认为它能够提供服务,但如果 Gunicorn 无法访问新请求,您会有问题。
使用 CPU 和内存的正确参数调整您的服务,还要调整线程和并发性以找到正确的参数。 Hey 是一个有用的工具,可以强调您的服务并观察扩展时发生的情况。
我目前正在开发一项服务,该服务应该在云中提供 HTTP 端点 运行,但我没有太多经验。我目前使用的是flask+gunicorn,也可以调用服务。我现在的主要问题是针对多个同时请求进行优化。当前,Cloud 运行 中的服务分配了 4GB 内存和 1 CPU。当它被调用一次时,直接启动的实例会消耗 3.7GB 内存和 CPU 的大约 40-50%(我使用神经网络来嵌入我的数据)。目前,我的设置非常基础:
- 内存:4096M
- CPU: 1
- 最小实例数:0
- 最大实例数:1
- 并发数:80
- 工人:1 (Gunicorn)
- 线程:1 (Gunicorn)
- 超时:0(Gunicorn,由 Google 推荐)
如果我将工人数量增加到两个,我需要将内存增加到 8GB。如果我这样做,我的服务应该能够在一个实例上同时处理两个请求,如果分配了这个 1 CPU,那么它有一个以上的核心。但是,如果有第三个请求,会发生什么?我想,Cloud 运行 将启动第二个实例。新实例是否也获得 1 CPU 和 8GB 内存,如果没有,对我来说最佳做法是什么?
最佳实践之一是让 Cloud 运行 自动扩展,而不是尝试优化每个实例。使用 1 个 worker 是限制内存占用和减少冷启动的好主意。
我建议使用线程,通常将其设置为 8 或 16 以利用并发参数。
如果您将这些值设置得太低,Cloud 运行 内部负载均衡器会将请求路由到实例,认为它能够提供服务,但如果 Gunicorn 无法访问新请求,您会有问题。
使用 CPU 和内存的正确参数调整您的服务,还要调整线程和并发性以找到正确的参数。 Hey 是一个有用的工具,可以强调您的服务并观察扩展时发生的情况。