这个问题在 SO 上被删除了,并建议在这里提问,所以这里是:寻求有这方面经验的人的指导。我在 Google Cloud Run 中运行一个 Docker 容器(大小约为 670mb),里面是基于 Flask 的 Python 服务器,它目前由 Dockerfile 中的以下命令运行:
CMD exec gunicorn --bind 0.0.0.0:8080 --workers=1 --threads 8 --timeout 0 "db_app.app:create_app()"
然而,在阅读了有关心跳检查和其他内容之后,我想知道,GCR 的最佳 Gunicorn 设置是什么?
目前,该服务器的生产版本在物理机上运行,每 30 分钟处理约 30-40 个请求。预计增长到约 100-150 个,甚至更多。
我应该在 exec 命令中指定多少个工作程序、线程才能最有效地使用 GCR 的功能?说到一些小东西(就 GCR 设置而言),例如 1 个 CPU、1GB RAM,将来可能会更多,这只是测试阶段,但我希望将成本降至最低。那么我应该如何在那里设置我的 Gunicorn?也许我还应该使用 --preload?指定工作程序连接?
官方示例有 1 个工作线程和 8 个线程,但同时表示要根据核心数量增加工作线程数量,以及那里有多少个核心?我希望一些在 GCR 上拥有此类/类似服务器的人能分享一些有关其设置的知识。
答案1
这里的重点不仅在于 gunicorn,还在于你的 API 的作用、响应时间以及执行所需的内存量。
假设它是一个在 2 位数毫秒内响应的简单 API,并且不需要任何重型库,我认为 1 个工作线程 + 4 个线程应该可以顺利处理您的流量(每 30 分钟 100-150 个请求)。
无论如何,考虑到您的应用程序是线程安全的,我会使用 4 个工作程序来获得额外的能力,以便能够处理一些意外的高流量。