IHS: Otimizar o Apache Web Server para suportar mais conexões e clientes simultâneas
Neste artigo descreve como realizar um tuning no IBM HTTP Server (IHS) / Apache para suportar mais conexões/clientes simultâneas.
O Apache 2.X suporta vários modelos de concorrência plugáveis, denominados Multi-Processing Modules (MPMs), aqui vamos focar no mpm_worker_module.
Dentre as características do mpm_work_module temos:
- Baseado no Apache 2.0;
- O MPM Worker usa múltiplos processos filhos e cada processo filho pode ter múltiplas threads, onde cada thread manipula uma conexão por vez;
- O MPM Worker eh uma ótima opção para servidores com alto trafico, pois tem um menor consumo de memoria (footprint);
Como funciona
A seguir temos uma configuração padrão do MPM Worker, dentro do arquivo httpd.conf
<IfModule worker.c> ThreadLimit 25 ServerLimit 16 StartServers 2 MaxClients 150 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule>
Com essa configuração, ao iniciarmos o Apache, ele vai criar 2 processos filhos (StartServers), e cada processo filho vai iniciar 25 threads (ThreadsPerChild).
Nessa situação vamos suportar 50 conexões/clientes simultâneas.
Inicial ==> StartServers x ThreadsPerChild ==> 2 x 25 = 50
A medida que novos usuários entram no sistema, um novo processo filho sera criado, adicionando mais 25 threads de atendimento. A variável ServerLimit define a quantidade de processos filhos que poderao ser criados:
Maximo ==> ServerLimit x ThreadsPerChild ==> 16 x 25 = 400
Mas como o valor definido na variável MaxClients é 150, o Apache obedece a esse parâmetro e permite a criacao de apenas 6 processos filhos (150/25 threads = 6). Se o valor da variável MaxClients for superior a 400, neste caso o Apache obedece ao valor obtido através da multiplicação das variáveis ServerLimit e ThreadsPerChild.
Nessa situação podemos suportar de [ 50 .. 150 ] conexões/clientes simultâneas.
Configurando para um Apache para Alto Trafego
Por exemplo no meu arquivo httpd.conf dentro do IBM HTTP Server/Apache Server.
<IfModule worker.c> ThreadLimit 50 ServerLimit 180 StartServers 10 MaxClients 4500 MinSpareThreads 25 MaxSpareThreads 4500 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule>
Inicial ==> StartServers x ThreadsPerChild ==> 10 x 25 = 250 Maximo ==> ServerLimit x ThreadsPerChild ==> 180 x 25 = 4500 Maximo ==> MaxClients (4500)
Nessa situação podemos suportar de [ 250 .. 4500 ] conexões/clientes simultâneas.
Se precisar mais conexões
À medida que você se aproxima de uma quantidade superiores a 3000-4000 conexões simultâneas, como boa pratica, adicione mais instâncias do IHS/Apache, usando topologias Horizontal ou Vertical, isto é:
- Vertical: mais instancias na mesma maquina, ou;
- Horizontal: mais maquinas com uma instancia
Exceder esse limite não é recomendado e pode resultar em um comportamento imprevisível.
Alem disso lembre-se de:
- Desabilitar módulos não necessários
- Verifique por outros gargalos (bottlenecks) como firewalls e configuração de rede, e parâmetros de kernel;
- Verifique o output do mod_mpmstats (2.0.42.2 ou +), este output prove diversas informações uteis para debug.
Faca uso de um Proxy Reverso com Cache habilitado.
Proxy reversos vão remover a carga ao servir conteúdo estático como imagens, javascripts e css. Esses servidores também pode tratar clientes lentos e reduzir o keepalive sobre o IHS/Apache. Desabilite o keepalive no Apache, e habilite no Proxy Reverso. Um request só é entregue ao Apache quando, em geral, têm todas as informações no request de modo a permitir-lhe lidar com o request imediatamente.
Quer saber mais IBM HTTP Server Performance Tuning
Ver também
- Definindo a URL padrão no IBM HTTP Server Apache
- Apache:Redirecionando para pagina de Erro
- Apache:Redirecionando de HTTP para HTTPS
- Linux e Unix: Ferramentas de Monitoracao e Performance
- AWSTATS: Configurando o AWSTATS