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

From Wiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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