Otimização do uso de memória do Apache

10

O Apache está usando muito da memória do meu servidor, causando falhas. Eu tenho 4GB de RAM no servidor.

Estou tentando ajustar as configurações do Apache para melhorar seu desempenho, mas sou muito novo nisso.

Eu estava tentando seguir o conselho deste artigo , mas não sei como calcular as coisas e parece que estou piorando.

Meu top parece:

11697 apache    15   0  322m  37m 4048 S  0.0  0.9   0:00.52 httpd
13602 apache    15   0  323m  37m 3944 S  0.0  0.9   0:00.50 httpd
11786 apache    15   0  322m  36m 4052 S  0.0  0.9   0:00.50 httpd
12525 apache    15   0  322m  36m 4040 S  0.0  0.9   0:00.63 httpd
11806 apache    15   0  322m  36m 3952 S  0.0  0.9   0:00.42 httpd
11731 apache    15   0  322m  36m 4036 S  0.0  0.9   0:00.46 httpd
11717 apache    16   0  322m  36m 3956 S  0.0  0.9   0:00.54 httpd
11659 apache    15   0  322m  36m 3980 S  0.0  0.9   0:00.49 httpd

Então, seria

MaxClients = 3000/ (322-37) = 10

Isso é certo? Além disso, quais devem ser os valores para os outros parâmetros, como MinSpareServers, MaxSpareServers, MaxRequestsPerChild, StartServers, MinSpareThreads, MaxSpareThreads, ThreadsPerChild, MaxRequestsPerChild?

Alguém por favor me ajudaria?

Atualizar

Eu tentei o que vocês sugeriram. Funciona, mas só por um tempo. Depois de algum tempo após o servidor ser iniciado, o uso de memória continua aumentando e nunca diminui.

Quero dizer, depois de iniciar o servidor, vamos supor que haja 500 usuários on-line. O servidor consumirá X RAM. 2 horas depois, com os mesmos 500 usuários on-line, o servidor consumirá 10X de RAM.

Existe uma maneira de evitar isso ou terei que continuar assistindo o servidor e reiniciá-lo de tempos em tempos?

    
por Souljacker 01.04.2011 / 05:13

1 resposta

12

O parâmetro principal para ajustar o uso de memória do Apache será MaxClients . Um valor muito baixo e você ficará sem slots disponíveis para atender às solicitações do cliente. Muitos e você vai usar toda a sua memória RAM e começar a usar o espaço de troca que irá matar o desempenho (pode parecer uma falha do servidor).

Uma maneira de sintonizar MaxClients é observar o uso de memória do sistema e ajustar a configuração conforme necessário. Se o servidor começar a trocar, edite-o. Se o servidor tiver memória livre, coloque-o.

Você também pode estimar o valor máximo observando o uso de memória do Apache. Inicie top e pressione M para classificar processos por memória. Você deveria ver algo como:

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
18698 apache    17   0  141m  59m  41m S  0.0  1.6   4:57.46 httpd
18591 apache    17   0  141m  59m  41m S  0.0  1.5   4:54.79 httpd
22917 apache    16   0  141m  57m  39m S  0.0  1.5   4:57.44 httpd
18595 apache    16   0  142m  57m  38m S  0.0  1.5   5:23.43 httpd
18697 apache    16   0  139m  56m  41m S  0.0  1.5   5:09.29 httpd
18735 apache    25   0  141m  56m  38m S  0.0  1.5   5:05.32 httpd

Subtraia as colunas RES e SHR para obter o uso de memória aproximado por instância do Apache. Neste caso, é em torno de 16MB. Se eu tiver 4 GB de RAM e desejar que 3 GB sejam usados para o Apache, minha configuração de MaxClients estará por perto:

MaxClients = 3000/16 = 188

Então, neste caso, eu poderia começar com um valor de 150-200, mas observaria o uso de memória e se algum dia ele começasse a usar o swap, eu diminuiria os MaxClients de 10 a 20%. Observe também que o valor de 3 GB é apenas um exemplo aleatório. Nos servidores que só executam o Apache, eu posso usar quase todos os 4GB. Em outros casos, eu posso querer apenas 1 ou 2GB para o Apache salvar o restante para outros aplicativos, o sistema ou o cache.

Editar: Responder a perguntas adicionais

Geralmente não há valores mágicos de MaxClients ou outros parâmetros de configuração do Apache que farão seu servidor repentinamente duas vezes mais rápido. Alguns servidores parecerão rodar muito bem se MaxClients for 10 ou 1000. Existem dois casos principais em que a configuração MaxClients é "ruim":

  • Muito baixo : Quando o MaxClients está muito baixo, você alcançará uma situação na qual todos os clientes Apache estão sendo usados e novas conexões entrarão em uma fila, aguardando a disponibilização do próximo cliente. Se você habilitar o mod_status do Apache, poderá obter uma visualização em tempo real de quantos clientes estão ocupados em qualquer ponto do tempo. Esse estado é relativamente fácil de diagnosticar, pois o site ficará lento durante períodos de alto tráfego e todos os clientes poderão estar em observação.
  • Muito alto : Quando o MaxClients está muito alto, você terá que esgotar toda a RAM e começar a usar o swap. Quando isso ocorre, o desempenho do seu site cairá para essencialmente zero (considere a diferença de velocidade entre RAM e disco). Esse estado pode ser muito mais difícil de observar e diagnosticar, pois um servidor funcionará bem com um alto MaxClients até que ele apresente um aumento no tráfego. Por exemplo, em um site que recebe alguns acessos por hora, posso definir MaxClients para 1000, muito mais do que suportável pela RAM, mas nunca vi um problema devido ao Apache precisar usar apenas um ou dois clientes de cada vez. Eu localizarei o problema somente quando obtiver um aumento no tráfego, aumentando o número de clientes usados simultaneamente, até que a RAM esteja esgotada e o espaço de troca seja necessário.

Embora eu não saiba os detalhes do seu servidor, aplicativo ou tráfego, posso sugerir os seguintes valores de configuração como ponto de partida. Experimente-os, monitore a carga e o uso do servidor e altere as configurações conforme necessário.

  • mod_status : Habilite isso para que você possa ver o uso do Apache. Para estatísticas mais avançadas, instale um aplicativo de monitoramento como o Zabbix / Nagios, para que você possa rastrear o uso do servidor e os padrões de tráfego.
  • MaxClients : defina como um valor de 100-200. Gostaria de começar com um valor mais baixo se não tiver certeza e monitorar o uso de memória / CPU / Apache. Este será o principal parâmetro para ajustar.
  • MaxRequestsPerChild : especifica quando um cliente / filho do Apache será reiniciado. Não há valor errado (embora valores muito pequenos possam ser ineficientes) e isso dependerá do conteúdo da sua veiculação. Para conteúdo dinâmico, um valor grande diferente de zero (digamos 1000) impedirá que os processos do httpd se tornem muito grandes.
  • Outros parâmetros : Embora eu não tenha feito um benchmarking completo dos parâmetros restantes, eles devem ter um efeito relativamente pequeno, a menos que você os defina como valores muito baixos ou muito altos. Usando os padrões deve ser bom para a maioria dos sites. Veja o Prefork do Apache ou Worker documentação do módulo para uma descrição completa dos parâmetros e que é usada em cada módulo (não faz sentido tentar ajustar um parâmetro que você não usa).
  • Benchmarking : À medida que você ajusta os parâmetros, recomendo usar uma ferramenta de benchmarking como ab (ApacheBench) ou cerco para obter um número quantitativo nas capacidades do seu servidor. Confiar apenas na sensação ou pior, ver se ele trava ou não, não é um bom método para ajustar os parâmetros de um servidor web.
por 01.04.2011 / 05:29