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