Apache2 mod_wsgi python 2.6 Django muito lento

3

Eu tentei cerca de 1000x coisas, mas não consigo entender por que um site simples de django está lento usando o apache 2.2.14 / wsgi latest / django 1.3. Eu confirmei que o problema não é nosso banco de dados ativando o log de consultas lentas do mysql. Revisei as definições de configuração do daemon wsgi cerca de 100 vezes, mas ainda não entendi porque o runserver é atualmente mais rápido que o apache!

Aqui está a minha configuração do Apache, deixe-me saber se há outros itens que seriam úteis!

WSGIDaemonProcess xxx display-name=xxx group=www-data user=www-data processes=25 threads=1
<VirtualHost *:80>
    ServerName www.xxx.com
    ServerAlias xxx.com
    ServerAlias localhost
    ServerAdmin [email protected]

    RewriteEngine Off
        RewriteCond %{HTTP_HOST} ^xxx\.com$ [NC]
        RewriteRule ^(.*)$ http://www.xxx.com$1 [R=301,L]
        RewriteCond %{REQUEST_URI} ^/login/$
        RewriteRule /login https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
        RewriteCond %{REQUEST_URI} ^/signup/
        RewriteRule /signup https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

    ErrorLog /var/log/apache2/xxx-error.log
    LogLevel debug
    CustomLog /var/log/apache2/xxx-access.log combined

    WSGIProcessGroup %{GLOBAL}
    WSGIApplicationGroup %{GLOBAL}
    WSGIScriptAlias / /srv/xxx.com/mod_wsgi/dispatch.wsgi

Alias /static /srv/xxx.com/src/xxx/static
<Directory "/srv/xxx.com/src/xxx/static">
    Order deny,allow
    Allow from all
</Directory>
</VirtualHost>

grátis:

             total       used       free     shared    buffers     cached
Mem:           496        489          6          0          1         17
-/+ buffers/cache:        471         25
Swap:         1023         50        973

top:

top - 21:30:52 up  2:06,  1 user,  load average: 0.07, 0.10, 0.12
Tasks: 101 total,   2 running,  99 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.2%us,  1.2%sy,  0.0%ni, 95.4%id,  2.2%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    508272k total,   467788k used,    40484k free,     1448k buffers
Swap:  1048572k total,    59576k used,   988996k free,    22708k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                             
 5009 www-data  20   0  179m  41m 5024 R   20  8.3   0:02.59 apache2                                                              
 2521 elastic   20   0  710m  70m 4052 S    1 14.2   0:54.32 java                                                                 
 5013 root      20   0 19272 1252  932 R    0  0.2   0:00.05 top                                                                  
    1 root      20   0 23628 1108  784 S    0  0.2   0:00.18 init                                                                 
    2 root      20   0     0    0    0 S    0  0.0   0:00.00 kthreadd   

Aqui estão as configurações de mpm_prefork_module:

<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>
    
por Jonathan S. Fisher 08.02.2012 / 21:48

1 resposta

4

Você tem:

WSGIDaemonProcess xxx display-name=xxx group=www-data user=www-data processes=25 threads=1

mas depois tem:

WSGIProcessGroup %{GLOBAL}

, o que significa que você não está delegando o aplicativo WSGI para ser executado nesse grupo de processos do daemon.

Em outras palavras, você está executando seu aplicativo WSGI no modo incorporado e a diretiva WSGIDaemonProcess é redundante.

Se você também estiver usando o MPM prefork do Apache, provavelmente estará sofrendo possíveis problemas de velocidade devido ao uso do Apache em até 150 processos de thread único em sua configuração padrão.

A lentidão é provavelmente devida ao carregamento lento de sua aplicação WSGI, se ela for grande, quando uma requisição chegar.

À medida que mais solicitações chegam, o Apache precisa continuar criando novos processos para atender à demanda crescente. Se as solicitações caírem, o Apache começará a descartar processos. Se outro aumento nas solicitações chegar, ele precisará começar a gerar novos processos novamente e carregar seu aplicativo novamente.

Agora este é um cenário extremo, e o quanto você pode ser atingido depende de como as configurações do Apache MPM são definidas, quais não são exibidas e como é o seu perfil de tráfego.

No pior dos casos, você pode até mesmo ter sobrescrito a diretiva MaxRequestsPerChild e instruído o Apache a interromper o processo após um único ou pequeno número de solicitações e, portanto, você pode estar forçando recargas de seu aplicativo o tempo todo.

Para algumas leituras sobre problemas relacionados a esse tipo de problema, leia:

link

Então é assim que as coisas podem dar errado com base na configuração baseada no Apache.

Ignorando a configuração errada do modo daemon, você tem a possibilidade de ser um problema de aplicativo. Para isso, sugiro tentar uma ferramenta de monitoramento de desempenho. Minha sugestão tendenciosa é a New Relic. Mesmo que você não queira pagar por essa ferramenta, ela fornece duas semanas de teste para todos os recursos, o que pode ser suficiente para você decidir onde está o gargalo.

Para um exemplo do que a New Relic pode fazer pelo Python, veja:

link

    
por 08.02.2012 / 23:34