Como melhorar a performance do seu servidor Apache

Em um mundo cada dia mais dinâmico, nada pior do que ter que esperar as coisas. Isso tem que ser levado muito em conta quando se trata de sites na Internet, principalmente os que vendem online. Esse é o motivo pelo qual você deve se preocupar, e muito, com a performance do seu site.

De acordo com a Forrester Consulting, em 2006, compradores online esperavam que uma página web carregasse em até 4 segundos e, hoje, esse mesmo cliente espera que essa página carregue em 2 segundos ou menos. A Amazon, pouco tempo atrás, descobriu que aumentou sua receita em 1% a cada 100 milisegundos de ganho em performance, e um estudo comprovou que cada segundo gasto na abertura de uma página pode representar 5% a menos de conversão para a sua loja.

Mas, agora, vamos deixar de conversa e ir ao que nos interessa. O Apache, hoje, é o webserver mais utilizado do mundo, usado por cerca de 60% dos sites, com suporte para todos os sistemas operacionais e centenas de módulos disponíveis. Além disso, é um servidor muito estável e open source.

Quando se trata de Apache, a memória é o recurso mais importante para ele. Mensurar mal a quantidade de memória que será utilizada pode significar usar a swap, ou seja, muitos processos para pouca memória, ou gerar uma lentidão no sistema, que acontece quando se tem poucos processos e muita memória sobrando. Dessa forma, a memória tem que ser muito bem mensurada para não se ter nenhum tipo de problemas.

Outra coisa que pode ajudar muito quando se trata de Apache é o uso de MPM (Multi-processing Modules), que são responsáveis por manipular as requisições concorrentemente e a escolha certa desses módulos pode fazer grande diferença na performance, escalabilidade, consumo de memória e consumo de CPU do seus sistema. Os MPMs mais comuns hoje são:

Worker

Cada request neste módulo é tratado por uma thread diferente, o que o torna ideal para tráfego muito alto, com mais de 3 mil requests simultâneos. Uma vantagem dele em relação ao prefork é o uso de memória menor e a velocidade maior. Porém, ele é menos estável, muito difícil de debuggar, tem problemas ao trabalhar com módulos não thread-safe e, se algum problema acontecer na thread, esse problema pode influenciar no processo pai.

Prefork

Neste módulo, cada request é tratado por um processo separado e, dessa forma, um problema no processo filho não implica no processo pai. É muito tolerante a falhas e, por causa disso, muito estável e pode ser utilizado com módulos não thread-safe. Falando pelo lado do desenvolvedor, ele é ideal para módulos monolíticos (PHP), muito fácil de debuggar e efetua pooling de processos. Mas, como nem tudo são flores, ele utiliza mais memória do que o Worker e criar um processo nele é muito custoso e demorado.

Dessa forma, você deve analisar o seguinte antes de implementar algum deles: Prefork é mais estável. Worker requer menos hardware. Vamos ver agora como configurar cada um deles.

Configurando o Prefork

No arquivo httpd.conf:

<IfModule prefork.c>
 StartServers 10
 MinSpareServers 10
 MaxSpareServers 25
 ServerLimit 350
 MaxClients 350
 MaxRequestsPerChild 5
</IfModule>

StartServers: O número de processos que serão criados quando o Apache for iniciado.
MinSpareServers: Número mínimo de processos que ficarão esperando por requisições.
MaxSpareServers: Número máximo de processos que ficarão esperando por requisições.
MaxClients: Número máximo de requisições atendidas simultâneamente.
ServerLimit: Número mais alto que o MaxClients pode chegar.
MaxRequestsPerChild: Quantas vezes um mesmo processo será reutilizado.

Dicas

Nos valores de StartServers, MaxSpareServers e MinSpareServers, números muito grandes podem consumir memória desnecessária, dependendo do tamanho médio do seu processo. A sugestão é que trabalhe com os seguintes valores:

MinSpareServers entre 10 e 20.
MaxSpareServers entre 20 e 30.
StartServers igual a MinSpareServers.


No caso do valor de ServerLimit, caso o seu MaxClients seja maior do que 256, é obrigatório que você configure maior ou igual a ele. A sugestão é que o ServerLimit seja sempre igual ao MaxClients. Vamos exemplificar isso melhor:

Identifique o tamanho médio dos seus processos apache, vamos usar como exemplo o valor 7800 kb. Identifique o tanto de memória RAM disponível sem o apache rodando(deixe uns 20% sobrando), por exemplo, 2GB(2097152 kb). Dessa forma, 2097152 / 7800 = 268 processos. Isso significa que as suas configurações manipulam 268 conexões simultâneas.

Caso isso não seja suficiente para o seus sistema a sugestão é aumentar a memória e calcular novamente e/ou adicionar uma outra máquina e fazer um load balance.

Configurando o Worker

No arquivo httpd.conf:

<IfModule prefork.c>
 StartServers 10
 MinSpareServers 10
 MaxSpareServers 25
 ServerLimit 350
 MaxClients 350
 MaxRequestsPerChild 5
</IfModule>

Ele tem a mesma abordagem do Prefork!

iMasters

Postar um comentário