Apache / wsgi “O script expirou antes de retornar cabeçalhos”

7

Eu tenho um aplicativo Django personalizado que está ficando sem resposta a cada 5.000 solicitações. Nos logs do apache, vejo o seguinte:

Apr 13 11:45:07 www3 apache2[27590]: **successful view render here**
...
Apr 13 11:47:11 www3 apache2[24032]: [error] server is within MinSpareThreads of MaxClients, consider raising the MaxClients setting
Apr 13 11:47:43 www3 apache2[24032]: [error] server reached MaxClients setting, consider raising the MaxClients setting
...
Apr 13 11:50:34 www3 apache2[27617]: [error] [client 10.177.0.204] Script timed out before returning headers: django.wsgi
(repeated 100 times, exactly)

Acredito que estou executando o WSGI 2.6 (/usr/lib/apache2/modules/mod_wsgi.so-2.6) com a seguinte configuração:

configuração do apache

WSGIDaemonProcess site-1 user=django group=django threads=50
WSGIProcessGroup site-1
WSGIScriptAlias / /somepath/django.wsgi

/somepath/django.wsgi

import os, sys
sys.path.append('/home/django')
os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'    
import django.core.handlers.wsgi    
application = django.core.handlers.wsgi.WSGIHandler()

Quando isso acontece, eu posso matar o processo wsgi e o servidor irá se recuperar.

>ps aux|grep django # process is running as user "django"
django   27590  5.3 17.4 908024 178760 ?       Sl   Apr12  76:09 /usr/sbin/apache2 -k start
>kill -9 27590

Isso me leva a acreditar que o problema é um problema conhecido :

deadlock-timeout=sss (2.0+)

Defines the maximum number of seconds allowed to pass before the daemon process is shutdown and restarted after a potential deadlock on the Python GIL has been detected. The default is 300 seconds. This option exists to combat the problem of a daemon process freezing as the result of a rouge Python C extension module which doesn't properly release the Python GIL when entering into a blocking or long running operation.

No entanto, não sei por que essa condição não está sendo compensada automaticamente. Eu vejo que o tempo limite do script ocorre exatamente 5 minutos após a última renderização bem-sucedida da página, portanto, o tempo limite do deadlock está sendo acionado. Mas isso não mata o processo.

Editar: mais informações

  • apache versão 2.2, usando o worker MPM
  • versão do wsgi 2.8
  • SELinux NÃO instalado l
  • pacote xml sendo usado com pouca frequência
  • Ubuntu 10.04
por Chase Seibert 13.04.2011 / 18:53

1 resposta

0

Você pode tentar adicionar um limite de solicitações após o qual os processos daemon são reciclados (antes que um processo externo o faça). Isso é feito adicionando o parâmetro maximum-requests de WSGIDaemonProcess .

Consulte o link

Como alternativa, você pode investigar quantos processos seu usuário 'django' pode ter. Você pode verificar isso abrindo um shell como esse usuário su - django -s /bin/bash e verificando a saída de ulimit -a .

    
por 03.10.2014 / 14:07

Tags