Você está no caminho certo. Aqui estão algumas coisas que devem ajudá-lo a descobrir os detalhes restantes.
Você precisa de um monitoramento detalhado do Apache em todas as estatísticas fornecidas por mod_status
- "_" Aguardando conexão
- "S" Iniciando
- Solicitação de leitura "R"
- "W" Enviando resposta
- "K" Manter viva (ler)
- Pesquisa de DNS "D"
- Conexão de fechamento "C"
- "L" Logging
- "G" Terminando com graça
- "I" Limpeza inativa do trabalhador
- "." Abrir slot sem processo atual
A memória é sempre escassa, se você verificar todos os provedores de VMs, basicamente, cobrar o preço da VM com base em tamanho da memória que você recebe. Então, esteja atento quando você gastar isso.
Você pode definir o ServerLimit (precisa de apache stop / start para redefinir) e, em seguida, usar MaxClients (que pode ser ajustado com reinicialização) para definir o valor máximo que seu servidor poderá manipular. Esses valores estão lá para proteger alguém da Internet para esgotar seus recursos de servidores. Se você calculou, você pode ter 13 segmentos; 13 é.
Veja qual é o seu padrão de uso durante algum período de tempo e ajuste os StartServers para um uso médio. Então você começará com algo que está próximo do uso médio; e se o servidor da Web precisar atender a mais solicitações, haverá mais alguns funcionários. O volume desses será controlado pelo valor ceil de MaxClients e
- MinSpareServers
- MaxSpareServers
Assim, você não quer aumentar a quantidade de trabalhadores instantaneamente se o aumento do tráfego for pequeno; você preferiria girar o trabalhador ou dois para evitar o desperdício de memória com vários trabalhadores adicionais que provavelmente não serão usados. É preciso que MaxRequestsPerChild
do processo gerado seja destruído e, em seguida, com base no uso, o Apache decidirá se precisa iniciar um novo para substituir o antigo.
Em relação a MaxRequestsPerChild, você quer evitar 0 aqui; Embora seja uma boa idéia manter as coisas armazenadas na memória para desempenho, você não tem memória de sobra para isso. Ter um número menor, como 1000 ou 2000, é provavelmente uma opção melhor do que o padrão 10000, pois a reciclagem de funcionários após atender a menos solicitações HTTP limitará sua vida útil na qual eles crescem gradualmente em termos de uso de memória. Então, reciclá-los mais cedo ou mais tarde economizará um pouco de memória.
Quanto à contagem de usuários; isso depende ... se os seus usuários estiverem indo muito bem para o servidor da Web durante o dia ou se todos precisarem do servidor da Web ao mesmo tempo. Você precisa monitorar (gráficos e outras coisas) a memória, o apache, o uso da CPU e outros dados de integridade do sistema e examiná-los quando tentar criar uma maneira mais suave de executar as coisas, pois não há receita geral para melhorar as coisas; isso depende muito dos casos de uso e dos padrões de uso.
No uso de memória do Apache, esse é um problema complicado. Cada thread do Apache tem acesso a determinada parte da memória. Esse espaço de endereçamento acessível é uma parte exclusiva desse processo específico, enquanto outras partes do espaço de endereço são compartilhadas com outros segmentos do Apache. Então, quando você quiser calcular o quanto todos usam, você quer ter certeza de que não conta para o mesmo espaço de endereço duas vezes.
Aqui está minha abordagem para calcular a pegada de memória do Apache; você provavelmente precisará alterar a primeira linha para caber o nome do processo do seu Apache porque dependendo da distribuição algum nome do processo Apache 'httpd' algum 'apache2' ou possivelmente algo que eu não consigo pensar agora ...
cmd='httpd'
ps -o size=,rss=,vsz= $(pgrep "$cmd") | awk '
{ size_sum += $1; rss_sum += $2; vsz_sum += $3; processes += 1 }
END {
printf "Size : %.2f (%.2f) MB\n",size_sum/1024,size_sum/1024/processes
printf "RSS : %.2f (%.2f) MB\n",rss_sum/1024,rss_sum/1024/processes
printf "VSZ : %.2f (%.2f) MB\n",vsz_sum/1024,vsz_sum/1024/processes
}'
a saída deve se parecer com
Size : 178.84 (16.26) MB
RSS : 118.08 (10.73) MB
VSZ : 1754.29 (159.48) MB
Isso é de um dos meus servidores da web. O primeiro valor em cada linha é total, o segundo entre parênteses é por processo avg. Para explicar os valores, vou citar ps man page
- Tamanho : quantidade aproximada de espaço de troca que seria necessária se o processo fosse sujar todas as páginas graváveis e depois ser trocado. Este número é muito difícil!
- RSS : tamanho do conjunto de residentes, a memória física não trocada que uma tarefa usou
- VSZ : tamanho da memória virtual do processo
O que isso significa para sua matemática é; os processos podem crescer para VSZ
size, eles estão usando RSS
de RAM, o que você deseja usar em sua equação ao tentar calcular MaxClients / ServerLimit e SIZE
é teoricamente o tamanho que seus processos poderiam tomar se fossem completamente trocados nosso devido a ser ocioso. Algumas fontes no tópico defendem o cálculo da pegada de memória usando o pmap como
ps -ef | grep httpd | grep -v ^root | awk '{ print $2 '} | xargs pmap -d | grep ^mapped: | awk '{ print $4 }' | cut -dK -f1 | awk '{ SUM += $1} END { print SUM/NR }'
Isso deve retornar o mesmo valor que SIZE
que calculamos anteriormente.