MaxClients no apache. Como saber o tamanho do meu processo?

9

De http://httpd.apache.org/docs/2.2/misc/perf-tuning.html

O maior problema de hardware que afeta o desempenho do servidor web é a RAM. Um servidor da web nunca deve ter que trocar, pois a troca aumenta a latência de cada solicitação além de um ponto que os usuários consideram "rápido o suficiente". Isso faz com que os usuários pressionem parar e recarregar, aumentando ainda mais a carga. Você pode e deve controlar a configuração do MaxClients para que seu servidor não gere tantos filhos que comece a trocar. Este procedimento para fazer isso é simples: determine o tamanho do seu processo Apache médio, examinando sua lista de processos por meio de uma ferramenta como top e divida-o em sua memória total disponível, deixando espaço para outros processos.

A questão principal é que não consigo entender como saber o tamanho, porque, bem, eu tenho o tamanho do httpd no máximo 3888

Mas, se precisarmos determinar o número do MaxClients e eu tiver 4 GB de RAM, recebo: 972, então devo usar como 900 no MaxClients?

Larry
fonte
4
"Eu tenho o tamanho de httpd em não mais que 3888" - acho que falo por todos quando digo "HUH?"
Womble

Respostas:

9

Primeiro, determine o PID de um dos seus processos Apache.

Então você pode fazer algo assim:

cat /proc/PIDHERE/status | grep VmRSS

Isso produzirá o tamanho (atual) do conjunto de residentes desse processo específico, semelhante a:

VmRSS: 304456 kB

Esse valor é o que parece, é o tamanho do processo residente na RAM.

Em seguida, normalize sua unidade de medida ( 4GB * 1024 * 1024 = 4,194,304 KB). Dividir:

4194304 KB / 304456 KB = 13.77 processes

Considere que você provavelmente possui outros processos em execução no seu sistema que também consumirão memória e, idealmente, deseja minimizar a troca, portanto, provavelmente não deseja que seja configurado (usando meus números), você deseja uma quantia menor (a seu critério) )

Esta é uma estimativa grosseira; o tamanho dos processos do Apache pode aumentar com o tempo, dependendo da carga.

loopforever
fonte
1
Embora o RSS não inclua páginas compartilhadas, ele inclui páginas sinalizadas como copiar na gravação - ou seja, há espaço em uma máquina para mais processos do que (soma de rss) / (memória física). Veja também minha resposta em outro lugar - o espaço livre é essencial para um bom desempenho.
symcbean
4

Prever os maxClients a partir de cenários de teste é um ponto de partida - mas para resolver o problema corretamente, você precisa começar a avaliar como seu aplicativo está se comportando com tráfego real.

Supondo que seu apache esteja executando o pré-fork ....

Configure um trabalho cron para contar o número de processos httpd e a saída de 'free'. Observe que, se o servidor da web estiver fornecendo conteúdo de arquivos locais (e em muitos casos, mesmo quando não estiver), a quantidade de memória disponível para cache / buffers terá um grande impacto no desempenho. ou seja, se você chegar ao ponto de trocar, seu desempenho na web provavelmente será horrível!

Depois de obter alguns dados, plote-os em um gráfico e faça uma regressão de mínimos quadrados - extrapole para encontrar o número de clientes nos quais você atinge seu limite de destino para o uso da memória httpd. Um ponto de partida para o destino da memória seria o menor de 80% da memória física / 80% do tamanho do conteúdo.

(observe que se o MinSpareServers está definido com um valor muito alto, os resultados podem não ser precisos)

#!/bin/bash

LOGFILE='/var/log/httpd/memusage'
PIDS = `ps -ef | grep httpd | grep -v grep | wc -l`
MEM = `free | grep 'buffers/cache'`
DAY = `date '%Y-%m-%d %H:%M:%S'`
echo ${DAY} ${PIDS} ${MEM} >>LOGFILE

Em um mundo ideal, você também mede o tempo de resposta da URL no mesmo arquivo de log - mas isso está ficando muito mais complexo.

symcbean
fonte
Para mim, os buffers / cache mudam muito pouco, seja executando 11 clientes ou quando o servidor atinge 86 ou 151 clientes (e o servidor travou). O que você espera ver na sua variável MEM? Eu recebo dois números, então me pergunto se o Ubuntu 12.04 está dando algo diferente do que você esperava.
PeterB
Tente rodar 'grátis' e você verá o que eu espero (2 números). Se for verdade que há pouca variação nesses números com diferentes números de processos, você está executando o servidor baseado em eventos ou a configuração de maxspareservers é tola. Se você publicou uma amostra da saída e das partes relevantes do seu httpd.conf, talvez tenhamos uma imagem melhor?
symcbean 30/03
.... e "acidente"? Que acidente?
symcbean 30/03
Desculpe, consulte pastebin.com/aHZCagVn para obter as configurações httpd.conf e a amostra de saída. Por 'travamento', quero dizer muitos clientes, o servidor fica sem memória e trava. Consulte pastebin.com/fnXzBfQL para obter mais informações.
PeterB
1
@ PeterB, parece mais provável que o MySQLd esteja causando esse problema. Quando o assassino de OOM do kernel mata os piores criminosos primeiro com base no valor de / proc / PID / oom_score_adj. Como evidenciado em sua saída, o mysqld foi o primeiro. Pode ser necessário ajustar as configurações no my.cnf de maneira mais adequada para se ajustar às restrições da sua VM. Como solução temporária /, apenas para verificar se você pode evitar o chute do OOM killer, tente adicionar um arquivo de troca para memória virtual adicional; depois se livre dele depois de identificar seu problema real.
loopforever