Otimização de uso de memória Apache


11

O Apache está usando muita memória do meu servidor, causando uma falha. Eu tenho 4 GB de RAM no servidor.

Estou tentando ajustar as configurações do Apache para melhorar seu desempenho, mas sou bastante 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 tem a seguinte redação:

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 está certo? Além disso, quais devem ser os valores para outros parâmetros, como MinSpareServers, MaxSpareServers, MaxRequestsPerChild, StartServers, MinSpareThreads, MaxSpareThreads, ThreadsPerChild, MaxRequestsPerChild?

Alguém poderia me ajudar?

Atualizar

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

Quero dizer, depois de iniciar o servidor, vamos assumir que existem 500 usuários online. O servidor consumirá X RAM. Duas horas depois, com os mesmos 500 usuários on-line, o servidor consumirá 10X RAM.

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


1
ao adicionar atualizações à sua pergunta, edite o original em vez de postar uma resposta. Isso também tem o bônus adicional de colocar a questão no topo da primeira página novamente.
Ben Pilbrow

Respostas:


14

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

Uma maneira de ajustar MaxClientsé observar o uso da memória do sistema e ajustar a configuração conforme necessário. Se o servidor começar a trocar, edite-o para baixo. 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. Iniciar tope pressione Mpara classificar os processos de memória. Você deve 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 aproximado de memória por instância do Apache. Nesse caso, é cerca de 16 MB. Se eu tiver 4 GB de RAM e desejar que 3 GB sejam usados ​​para o Apache, minha configuração de MaxClients será em torno de:

MaxClients = 3000/16 = 188

Portanto, nesse caso, eu poderia começar com um valor de 150-200, mas observaria o uso da memória e, se alguma vez começar a usar o swap, diminuiria o MaxClients de 10 a 20%. Observe também que o valor de 3 GB é apenas um exemplo aleatório. Em servidores executando apenas o Apache, posso usar quase todos os 4 GB. Em outros casos, talvez eu queira apenas 1 ou 2 GB para o Apache, salve o restante para outros aplicativos, o sistema ou o cache.

Editar: Responder a perguntas adicionais

Geralmente, não há valores mágicos do MaxClients ou dos outros parâmetros de configuração do Apache que tornarão seu servidor repentinamente duas vezes mais rápido. Alguns servidores parecerão funcionar perfeitamente, seja MaxClients 10 ou 1000. Há dois casos principais em que a configuração MaxClients é "incorreta":

  • Muito baixo : quando o MaxClients estiver muito baixo, você chegará a uma situação em que todos os clientes Apache estão sendo usados ​​e novas conexões entrarão em uma fila aguardando o próximo cliente ficar disponível. Se você ativar o mod_status do Apache, poderá obter uma visualização em tempo real de quantos clientes estão ocupados em um determinado momento. Esse estado é relativamente fácil de diagnosticar, pois o site fica lento durante períodos de tráfego intenso e todos os clientes podem estar em uso.
  • Muito alto : quando o MaxClients estiver muito alto, você começará a esgotar toda a RAM e começará a usar a troca. Quando isso ocorre, o desempenho do site cai para praticamente zero (considere a diferença de velocidade entre a RAM e o disco). Esse estado pode ser muito mais difícil de observar e diagnosticar, pois um servidor funcionará perfeitamente com um MaxClients alto até que haja um aumento no tráfego. Por exemplo, em um site que recebe alguns acessos por hora, posso definir o MaxClients como 1000, muito mais do que suportável pela RAM, mas nunca vi um problema devido ao Apache precisar apenas usar um ou dois clientes por vez. Só detectarei o problema quando houver um aumento no tráfego, aumentando o número de clientes usados ​​simultaneamente, até que a RAM se esgote e o espaço de troca seja necessário.

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

  • mod_status : habilite isso para poder ver o uso do Apache. Para estatísticas mais avançadas, instale um aplicativo de monitoramento como o Zabbix / Nagios para poder rastrear o uso do servidor e os padrões de tráfego.
  • MaxClients : defina para 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 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 grande valor diferente de zero (por exemplo, 1000) impedirá que seus processos 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 menor, a menos que você os defina com valores muito baixos ou muito altos. O uso dos padrões deve ser bom para a maioria dos sites. Consulte a documentação do módulo Apache Prefork ou Worker para obter uma descrição completa dos parâmetros e que é usada em cada módulo (não há sentido em tentar ajustar um parâmetro que você não usa).
  • Benchmarking : Como você ajusta os parâmetros, eu recomendaria o uso de uma ferramenta de benchmarking como ab (ApacheBench) ou cerco para obter um número quantitativo das capacidades do seu servidor. Confiar apenas na sensação ou algo pior, ver se ela falha ou não, não é um bom método para ajustar os parâmetros de um servidor da web.

O MaxClients foi renomeado para MaxRequestWorkers a partir do Apache 2.4.
Jastram # 22/16
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.