以下是一些背景信息:
我有两个运行相同应用程序的服务器环境。第一个环境是我打算放弃的,它是一个标准的 Google App Engine 环境,它有很多限制。第二个环境是一个使用 Gunicorn 运行我的 Python 应用程序的 Google Kubernetes 集群。
并发
在第一台服务器上,我可以向应用程序发送多个请求,它会同时响应多个请求。我在两种环境中同时对应用程序运行两批请求。在 Google App Engine 上,第一批和第二批请求同时得到响应,并且第一批请求不会阻止第二批请求。
在 Kubernetes 上,服务器仅同时响应 6 个,第一批会阻塞第二批。我读过一些关于如何使用 gevent 或多线程实现 Gunicorn 并发的帖子,它们都说我需要有 CPU 核心,但问题是无论我投入多少 CPU,限制仍然存在。我尝试过从 1VCPU 到 8VCPU 的 Google 节点,但变化不大。
你们能告诉我我可能遗漏了什么吗?也许是 Google 集群节点限制?
Kubernetes 响应瀑布
您可以注意到,第二批是在第一批开始完成后才开始得到响应。
App Engine 响应瀑布
Gunicorn 配置
我已经尝试使用标准类和推荐的设置:2 * 核心 + 1 和 12 个线程。
我也尝试过使用 gevent --worker-connections 2000
。
两者都没什么不同。响应时间非常相似。
我的 kubernetes 文件容器部分:
spec:
nodeSelector:
cloud.google.com/gke-nodepool: default-pool
containers:
- name: python-gunicorn
image: gcr.io/project-name/webapp:1.0
command:
- /env/bin/gunicorn
- --bind
- 0.0.0.0:8000
- main:app
- --chdir
- /deploy/app
#- --error-logfile
#- "-"
- --timeout
- "7200"
- -w
- "3"
- --threads
- "8"
#- -k
#- gevent
#- --worker-connections
#- "2000"
答案1
发布此信息Community Wiki
是为了让社区更好地了解情况。
不幸的是,我没有全部信息来准确重现此场景(应用程序设计、测试执行方式、环境等)。但是,根据 OP 的评论:
事实证明,使用 Kubernetes,多任务处理是在 Pod 级别进行的。您可以运行许多较小的 Pod,而不是使用一个包含许多线程的大 Pod。您可以尝试这种切换。
看起来,OP 在他的GKE
集群中使用了羟脯氨酸与CPU
和集群自动扩缩类似的解决方案App Engine Flex || Kubernetes Engine —?文章。
值得一提的是,许多取决于缩放类型。