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

  ThreadLimit         25 ServerLimit        16 StartServers       2 MaxClients         150 MinSpareThreads    25 MaxSpareThreads    75 ThreadsPerChild    25 MaxRequestsPerChild 0 

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.

  ThreadLimit         50 ServerLimit       180 StartServers       10 MaxClients       4500 MinSpareThreads    25 MaxSpareThreads  4500 ThreadsPerChild    25 MaxRequestsPerChild 0 

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


 * Mais Artigos sobre Apache HTTP Server