Eu resolvi compilando o apache (usando o prefork!) + PHP5 no meu VPS. Agora ele começa com 50 processos filhos e consome cerca de 6-700 MB.
Eu acho que isso é o melhor que eu pude fazer: P
Meu plano VPS me dá 1 GB de RAM para 2 GB. Claro que não posso usar 2 GB, nem > 1 GB, todos os dias, por isso estou planejando otimizar o desempenho do meu servidor.
A média de acertos por hora é de cerca de 8'000-10'000. Isso significa aproximadamente 2 conexões por segundo. Os acertos máximos por hora alcançados até agora são de aproximadamente 60.000. Isso significa cerca de 16 conexões por segundo.
Por azar, minha configuração atual do apache usa muita memória (quando não há clientes conectados - geralmente durante a noite - ele usa cerca de 1GB), então tentei personalizar a instalação do apache para atender às minhas necessidades.
Estou usando o Ubuntu, kernel 2.6.18, com apache2-mpm-worker, já que eu li, ele requer menos memória e fcgid (+ PHP). Este é o meu /etc/apache2/apache2.conf:
Timeout 45
KeepAlive on
MaxKeepAliveRequests 100
KeepAliveTimeout 10
<IfModule mpm_worker_module>
StartServer 2
MinSpareThreads 25
MaxSpareThreads 75
MaxClients 100
MaxRequestsPerChild 0
</IfModule>
Esta é a saída do ps aux:
www-data 9547 0.0 0.3 423828 7268 ? Sl 20:09 0:00 /usr/sbin/apache2 -k start
root 17714 0.0 0.1 76496 3712 ? Ss Feb05 0:00 /usr/sbin/apache2 -k start
www-data 17716 0.0 0.0 75560 2048 ? S Feb05 0:00 /usr/sbin/apache2 -k start
www-data 17746 0.0 0.1 76228 2384 ? S Feb05 0:00 /usr/sbin/apache2 -k start
www-data 20126 0.0 0.3 424852 7588 ? Sl 19:24 0:02 /usr/sbin/apache2 -k start
www-data 24260 0.0 0.3 424852 7580 ? Sl 19:42 0:01 /usr/sbin/apache2 -k start
enquanto isso é ps aux para php5:
www-data 7461 2.9 2.2 142172 47048 ? S 19:39 1:39 /usr/lib/cgi-bin/php5
www-data 23845 1.3 1.7 135744 35948 ? S 20:17 0:15 /usr/lib/cgi-bin/php5
www-data 23900 2.0 1.7 136692 36760 ? S 20:17 0:22 /usr/lib/cgi-bin/php5
www-data 27907 2.0 2.0 142272 43432 ? S 20:00 0:43 /usr/lib/cgi-bin/php5
www-data 27909 2.5 1.9 138092 40036 ? S 20:00 0:53 /usr/lib/cgi-bin/php5
www-data 27993 2.4 2.2 142336 47192 ? S 20:01 0:50 /usr/lib/cgi-bin/php5
www-data 27999 1.8 1.4 135932 31100 ? S 20:01 0:38 /usr/lib/cgi-bin/php5
www-data 28230 2.6 1.9 143436 39956 ? S 20:01 0:54 /usr/lib/cgi-bin/php5
www-data 30708 3.1 2.2 142508 46528 ? S 19:44 1:38 /usr/lib/cgi-bin/php5
Como você pode ver, use muita memória. Como posso reduzi-lo para caber apenas 1GB de RAM?
PS: Eu também penso sobre a mudança para o nginx, se o Apache não puder atender às minhas necessidades ...
UPDATE1: Acabei de escrever algumas linhas sobre o fcgid config, já que não o fiz antes:
FcgidMaxRequestsPerProcess 1000
FcgidIdleTimeout 15
FcgidBusyTimeout 30
FcgidMaxProcessesPerClass 5
Reduzir a quantidade de memória usada pelo Apache é bastante simples ... apenas reduza a quantidade de processos aumentando a quantidade de threads.
Reduzir a quantidade de memória usada pelo CGI / PHP, por outro lado, dependerá muito dos seus aplicativos PHP, de como eles são eficientes em termos de memória e também de qual versão do PHP você está usando.
No mínimo, você poderia modificar o seu Apache com o seguinte, que lhe dará 2 processos do Apache com 50 threads por peça e garantirá que os processos do Apache sejam recarregados a cada 10k conexões (não leva em conta as conexões keepalived) para liberar a memória do Apache:
<IfModule mpm_worker_module>
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15
StartServers 2
ServerLimit 2
MinSpareThreads 50
MaxSpareThreads 100
ThreadLimit 100
ThreadsPerChild 50
MaxClients 100
MaxRequestsPerChild 10000
</IfModule>
Então você pode querer olhar para a sua configuração fcgid para garantir que você limita a quantidade de processos php ativos, e garantir que os processos sejam recarregados de forma a liberar memória não utilizada. Isso, no entanto, depende muito do seu aplicativo da web e dos padrões de uso:
FcgidMaxRequestsPerProcess
FcgidIdleTimeout
FcgidBusyTimeout
FcgidMaxProcesses
FcgidMaxProcessesPerClass