Eu configurei o gunicorn com 3 trabalhadores e 30 conexões de trabalhador e usando a classe de trabalhador do eventlet. Está configurado atrás do Nginx. Após algumas solicitações, vejo isso nos logs.
[ERROR] gunicorn.error: WORKER TIMEOUT (pid:23475)
None
[INFO] gunicorn.error: Booting worker with pid: 23514
Por que isso está acontecendo? Como posso descobrir o que está errado?
obrigado
Gunicorn==19.3.1
egevent==1.0.1
Respostas:
Tivemos o mesmo problema usando o Django + nginx + gunicorn. A partir da documentação do Gunicorn, configuramos o tempo limite normal que quase não fez diferença.
Após alguns testes, encontramos a solução, o parâmetro a ser configurado é: timeout (E não o tempo limite normal). Funciona como um relógio ..
Então faz:
1) abra o arquivo de configuração do gunicorn
2) defina o TIMEOUT para o que você precisar - o valor está em segundos
fonte
pip install gevent
seguida,worker_class gevent
no seu arquivo de configuração ou-k gevent
na linha de comando.command=/opt/env_vars/run_with_env.sh /path/to/environment_variables /path/to/gunicorn --timeout 200 --workers 3 --bind unix:/path/to/socket server.wsgi:application
No Google Cloud, basta adicionar
--timeout 90
ao ponto de entrada emapp.yaml
fonte
Execute Gunicorn com
--log-level=DEBUG
.Ele deve fornecer um rastreamento da pilha de aplicativos.
fonte
--log-level debug
Poderia ser isso? http://docs.gunicorn.org/en/latest/settings.html#timeout
Outras possibilidades podem ser a sua resposta está demorando muito ou está esperando.
fonte
Você precisa usar uma outra classe de tipo de trabalhador, uma assíncrona como gevent ou tornado. Veja isso para obter mais explicações: Primeira explicação:
O segundo :
fonte
Eu tive um problema muito parecido, também tentei usar o "runserver" para ver se encontrava alguma coisa, mas tudo o que tinha era uma mensagem
Killed
Por isso, pensei que poderia haver um problema de recursos, e fui em frente para dar mais RAM à instância, e funcionou.
fonte
WORKER TIMEOUT
significa que seu aplicativo não pode responder à solicitação em um período de tempo definido. Você pode definir isso usando as configurações de tempo limite do gunicorn . Alguns aplicativos precisam de mais tempo para responder do que outro.Outra coisa que pode afetar isso é escolher o tipo de trabalhador
Quando tive o mesmo problema que o seu (estava tentando implantar meu aplicativo usando o Docker Swarm), tentei aumentar o tempo limite e usar outro tipo de classe de trabalho. Mas tudo falhou.
E, de repente, percebi que estava limitando meu recurso muito baixo para o serviço dentro do meu arquivo de composição. Esta é a coisa que atrasou a aplicação no meu caso
Então, sugiro que você verifique o que está diminuindo a velocidade do seu aplicativo.
fonte
Esse ponto de extremidade está demorando muito?
Talvez você esteja usando o balão sem suporte assíncrono, para que cada solicitação bloqueie a chamada. Para criar suporte assíncrono sem dificultar, adicione o
gevent
trabalhador.Com o gevent, uma nova chamada gerará um novo segmento, e o aplicativo poderá receber mais solicitações
fonte
Eu tenho o mesmo problema no Docker.
No Docker, mantenho o
LightGBM
modelo treinado +Flask
atendendo solicitações. Como servidor HTTP eu useigunicorn 19.9.0
. Quando executo meu código localmente no laptop Mac, tudo funcionou perfeitamente, mas quando executei o aplicativo no Docker, minhas solicitações POST JSON estavam congelando por algum tempo, então ogunicorn
trabalhador falhou com[CRITICAL] WORKER TIMEOUT
exceção.Tentei várias abordagens diferentes, mas a única que resolveu meu problema foi a adição
worker_class=gthread
.Aqui está minha configuração completa:
fonte
Se você estiver usando o GCP, precisará definir trabalhadores por tipo de instância.
Link para as melhores práticas do GCP https://cloud.google.com/appengine/docs/standard/python3/runtime
fonte
timeout é um parâmetro chave para esse problema.
no entanto, não é adequado para mim.
Descobri que não há erro de tempo limite do gunicorn ao definir trabalhadores = 1.
Quando eu olho para o meu código, eu encontrei algum socket connect (socket.send & socket.recv) no init do servidor.
O socket.recv bloqueará meu código e é por isso que ele sempre excede o tempo limite quando trabalhadores> 1
espero dar algumas idéias para as pessoas que têm algum problema comigo
fonte
Isso funcionou para mim:
Se você
eventlet
adicionou:Se você
gevent
adicionou:fonte
Para mim, a solução foi adicionar
--timeout 90
ao meu ponto de entrada, mas não estava funcionando porque eu tinha DOIS pontos de entrada definidos, um no app.yaml e outro no meu Dockerfile. Eu apaguei o ponto de entrada não utilizado e adicionei--timeout 90
no outro.fonte