
Para lhe dar algum contexto:
Tenho dois ambientes de servidor executando o mesmo aplicativo. O primeiro, que pretendo abandonar, é um ambiente padrão do Google App Engine que possui muitas limitações. O segundo é um cluster Google Kubernetes executando meu aplicativo Python com Gunicorn.
Simultaneidade
No primeiro servidor posso enviar várias solicitações ao aplicativo e ele responderá muitas simultaneamente. Executo dois lotes de solicitações simultâneas no aplicativo em ambos os ambientes. No Google App Engine o primeiro lote e o segundo foram respondidos simultaneamente e o primeiro não bloqueou o segundo.
No Kubernetes, o servidor responde apenas 6 simultaneamente, e o primeiro lote bloqueia o segundo. Eu li alguns posts sobre como conseguir simultaneidade Gunicorn com gevent ou threading múltiplo, e todos eles dizem que preciso ter núcleos de CPU, mas o problema é que não importa quanta CPU eu coloque nele, a limitação continua. Eu tentei nós do Google de 1VCPU a 8VCPU e isso não muda muito.
Vocês podem me dar alguma idéia sobre o que possivelmente estou perdendo? Talvez limitação de nós do Google Cluster?
Cascata de resposta do Kubernetes
Como você pode perceber, o segundo lote só começou a ser respondido depois que o primeiro começou a terminar.
Cascata de resposta do App Engine
Configuração Gunicórnio
Eu tentei tanto com a classe padrão com a configuração recomendada: 2 * núcleos + 1 para e 12 threads.
Eu também tentei gevent com --worker-connections 2000
.
Nenhum deles fez diferença. Os tempos de resposta foram muito semelhantes.
Minha seção do contêiner de arquivos 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"
Responder1
Postando isso Community Wiki
para melhor visibilidade para a comunidade.
Infelizmente não tenho todas as informações para reproduzir exatamente esse cenário (design da aplicação, como os testes foram executados, ambiente, etc). No entanto, com base no comentário do OP:
Acontece que com o Kubernetes, a multitarefa está no nível do pod. Em vez de ter um pod grande com muitos threads, você pode ter muitos pods menores em execução. Você poderia experimentar esse switch.
Parece que o OP em seu GKE
cluster usouHPAcom CPU
eEscalonamento automático de clustersolução semelhante que foi descrita emApp Engine Flex || Motor Kubernetes – ?artigo.
Uma coisa importante que vale a pena mencionar é que muitos dependem detipos de escala.