IHS: Otimizar o Apache Web Server para suportar mais conexões e clientes simultâneas

From Wiki

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