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.