Como posso otimizar o Apache para usar 1GB de RAM no meu site?

2

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
    
por Markon 06.02.2011 / 18:49

2 respostas

0

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

    
por 09.02.2011 / 15:31
3

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
    
por 06.02.2011 / 19:57