Eu tenho uma caixa Ubuntu 10.04 rodando várias dezenas de sites Python Django usando mod_wsgi (modo embutido; o modo mais rápido , se configurado corretamente). O desempenho é altamente flutuante. Às vezes rápido, às vezes vários segundos de atraso. Os gráficos de fumaça estão em todo lugar.
Recentemente, também adicionei um proxy nginx para o conteúdo estático, na esperança de que isso curaria o desempenho altamente flutuante. Mas, embora tenha reduzido o número de solicitações que o Apache precisa processar significativamente, isso não ajudou com o problema principal.
Quando você clica em sites enquanto executa o htop, pode ser visto que às vezes os pedidos são quase instantâneos, enquanto às vezes isso faz com que o Apache consuma 100% da CPU por alguns segundos. Eu realmente não entendo de onde vem essa flutuação.
Eu configurei o mpm_worker para o Apache assim:
StartServers 1
MinSpareThreads 50
MaxSpareThreads 50
ThreadLimit 64
ThreadsPerChild 50
MaxClients 50
ServerLimit 1
MaxRequestsPerChild 0
MaxMemFree 2048
1 servidor com 50 threads, com um máximo de 50 clientes. Munin e apache2ctl -t
mostram uma presença consistente de trabalhadores; eles não são destruídos e criados o tempo todo. No entanto, ele se comporta como tal.
Isso me diz que, quando um sub intérprete é criado, ele deve permanecer na memória, ainda parece que os sites precisam recarregar o tempo todo.
Eu também tenho uma caixa nginx + gunicorn, que funciona muito bem. Eu realmente gostaria de saber porque o Apache é tão aleatório.
Esta é uma configuração do host virtual:
<VirtualHost *:81>
ServerAdmin [email protected]
ServerName example.com
DocumentRoot /srv/http/site/bla
Alias /static/ /srv/http/site/static
Alias /media/ /srv/http/site/media
WSGIScriptAlias / /srv/http/site/passenger_wsgi.py
<Directory />
AllowOverride None
</Directory>
<Directory /srv/http/site>
Options -Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
- Ubuntu 10.04
- Apache 2.2.14
- mod_wsgi 2.8
- nginx 0.7.65
Edit: Eu coloquei algum código no arquivo settings.py de um site que grava a data em um arquivo tmp sempre que ele é carregado. Agora posso ver que o site não é recarregado aleatoriamente o tempo todo, portanto, o Apache deve mantê-lo na memória. Então, isso é bom, exceto que isso não me aproxima de uma resposta ...
Editar: acabei de encontrar um erro que também pode estar relacionado a isso:
File "/usr/lib/python2.6/subprocess.py", line 633, in __init__
errread, errwrite)
File "/usr/lib/python2.6/subprocess.py", line 1049, in _execute_child
self.pid = os.fork()
OSError: [Errno 12] Cannot allocate memory
O servidor tem 600 de 2000 MB livres, o que deve ser suficiente. Existe um limite que é definido no Apache ou WSGI em algum lugar?