Valores ideais para as diretivas ServerLimit, MaxClients, MaxRequestsPerChild

29

Estou executando um site intenso de tráfego com bastante conteúdo dinâmico, principalmente gerado pelo usuário.

O servidor é dedicado e possui um total de 4 processadores Intel Xeon CPU X3210 a 2.13GHz. Eu preciso conhecer os valores ideais para as diretivas do apache ServerLimit e MaxClients, considerando que o servidor possui 4 GB de RAM e o banco de dados MySQL é executado em um servidor separado. O painel é o DirectAdmin with CentOS.

Abaixo estão minhas diretrizes atuais, mas durante os horários de pico com mais de 5 mil usuários, um atraso importante é percebido - e não é culpa do MySQL, porque as páginas parecem ser geradas rapidamente (eu implementei um contador de tempo de geração de páginas), mas há um longo atraso na conexão até que a página comece a responder e seja enviada ao navegador.

<IfModule prefork.c>
    StartServers     800
    MinSpareServers   20
    MaxSpareServers   60
    ServerLimit      900
    MaxClients       900
    MaxRequestsPerChild  2000
</IfModule>
Timeout 90
KeepAlive On
KeepAliveTimeout 5

Devo mencionar que, ao monitorar o servidor usando o comando top, o uso da CPU nunca ultrapassa 20% a 30% no horário de pico. O servidor MySQL também tem um uso de 30 a 50% na época e estou trabalhando constantemente na correção de consultas lentas, mas esse é um problema diferente. Sei que não é um gargalo de banco de dados porque as páginas estáticas também demoram muito para serem carregadas nos horários de pico.

Quaisquer dicas para otimizar esses valores serão muito apreciadas, obrigado.

andreszs
fonte

Respostas:

24

Seu MaxClients está muito alto. Qual é o tamanho atual do seu processo apache? Multiplique x 900. Isso é maior que 4 GB? Nesse caso, a máquina provavelmente está entrando em swap. Normalmente começo com MaxClients = 2x vCPUs na caixa (grep -c processor / proc / cpuinfo). Que nesse caso seria de cerca de 8. Em seguida, verifique se o tamanho do processo MaxClients x apache não ultrapassa 4 GB.

Você pode configurar seus MaxClients a partir daí, dependendo do tipo de conexão que seus clientes possuem. (Os usuários dial-up precisam ser enganados, etc.) Mas certifique-se de nunca entrar em uma situação de troca.

Em seguida, defina seus servidores Min, Max e Start como MaxClients. Não há necessidade real de diferir em um ambiente de servidor dedicado.

Em seguida, faça alguns testes com ab (como notas de ganso).

vagão
fonte
Por alguma razão, parece que determinei o tamanho do processo incorretamente ... agora vejo no comando superior que os processos apache de RESIDENT SIZE variam de 10 a 15MB. Li em algum lugar que, como as bibliotecas compartilhadas estão incluídas nesse número, o tamanho "real" é metade desse tamanho. Considerando isso, devo calcular que posso acomodar 570 processos de 7 MB de tamanho cada um, você acha que isso está correto?
andreszs
Sugiro que você use 15 MB para os cálculos e comece a verificar as métricas: # processo http versus uso de memória. Isto lhe dará uma idéia melhor para o número de MaxClients
hdanniel
1
Baixei-o para 400 e, mesmo antes da hora de ponta, o resultado teve o efeito oposto ao desejado: qualquer valor menor que o original cria tempos limite e longos atrasos. Na verdade, agora aumentei para 1500 clientes e o uso de memória agora é de 3 GB, enquanto o uso médio da CPU é de 8%. Claro que agora há mais carga no servidor SQL e terei que trabalhar nisso.
andreszs 26/08/09
Aqui está o meu comando htop agora, processo 1500 apache e quase 100 processos do sistema. Isso com 75% de uso de RAM. a.imagehost.org/0011/htop.png Você deve reconsiderar sua fórmula? ;)
andreszs
1
É por isso que você precisa fazer testes em seu próprio ambiente. Temos aceleradores http na frente do nosso apache, para que eles não alimentem os usuários móveis. Seu aplicativo também parece ser muito leve. Se você moveu a carga para o seu banco de dados, isso indica que mais desses processos apache estão realmente servindo dados versus aguardando uma conexão mysql. O que me leva a perguntar quantas conexões você está permitindo ao seu banco de dados? Esse número excede seus MaxClients? Você tem 5.000 conexões simultâneas? Se assim for, você pode querer olhar para algo como perlbal na frente.
Toppledwagon 26/08/09
5

Você precisa obter o tamanho médio do seu processo apache. Com esse número e o tamanho total da sua RAM, você pode calcular a diretiva MaxClients. Lembre-se do seguinte: "Um servidor da web nunca deve ser trocado" ( Apache Performance Tuning )

O monitoramento com top ou htop está ok, mas você precisa de uma visão melhor de todas as estatísticas de seus servidores (CPU, RAM, E / S de disco, solicitações apache, consultas lentas do mysql, etc ...) com alguma ferramenta de monitoramento como gânglios ou munin para encontre possíveis gargalos.

hdanniel
fonte
No momento, só tenho os comandos top e htop e não consigo entender todas as informações. Esta é a atividade ontem no horário de pico, parece que não há troca; diga-me se estou errado: Tarefas: 1043 total, 2 em execução, 1041 em suspensão, 0 interrompido, 0 CPU (s) zumbi: 13,8% nos, 1,8% sy, 0,0% ni, 82,1% id, 0,8% wa, oi 0,0%, 1,5% Si, 0,0% st Mem: total de 4138360k, 3961276k usado, 177084k livre, 75016k buffers de swap: total de 2031608k, 1484k usado, 2030124k livre, 1836600k em cache
andreszs
Sim, seu servidor não está trocando. Prefiro métricas da vida real, mas se você quiser, pode usar uma ferramenta estressante como ab ou httperf para verificar quanto seu servidor pode suportar. Para os testes, cuide do MaxClients e comece com um número baixo (com base na suposição de 15 MB).
hdanniel
4

Eu recomendo brincar com a ferramenta de benchmark (ab) do apache. Você pode brincar com os valores para correspondê-los ao seu fluxo de tráfego e ver que tipo de respostas você está obtendo até o tempo médio de carregamento e similares. Nesse ponto, você pode brincar com as configurações de que está falando para tentar otimizá-las. Você deve conseguir com ab controlar o desempenho otimista de cada ajuste no desempenho.

Realmente não seria prudente falar sobre suas configurações, mas você também precisa levar em consideração sua memória RAM, porque parece que você está consumindo muita memória RAM com essas configurações. Embora isso seja apenas especulação sem dados. O htop fornece uma boa leitura visual de seus recursos.

Além disso, sua média de carga pode dizer muito. Duvido que seu uso seja muito superior à quantidade total de núcleos entre 20 e 30% da CPU, mas é outro indicador de quão duro o servidor está realmente trabalhando.

Ganso
fonte
O problema é que eu não tenho experiência suficiente em administração de servidores, então comece a brincar com ajustes e monitore os resultados. Eu nunca usei a ferramenta ab para ser honesto. A alteração dos valores também requer a reinicialização do HTTDP, o que causa inconvenientes aos meus usuários, portanto, prefiro evitar isso. Imagine que você está enviando uma mensagem para outro usuário e depois de clicar em "Enviar", você terá um problema de conexão com o servidor. Sobre o uso da CPU, veja as informações do meu comentário anterior: ele não excede 15% no horário de pico. Eu acho isso aceitável, considerando que eu tinha 6.000 usuários on-line ontem.
andreszs
Bem, eu definitivamente não gostaria que você fizesse isso em um ambiente de produção. Eu recomendo fazer isso no menor tempo de tráfego se outro servidor (com hardware muito semelhante, se não idêntico) testar. ab é bastante fácil de usar, mas eu definitivamente acho que esse vagão deu uma boa instrução sobre o cálculo de seus MaxClients. Depois de parar de usar o espaço de troca, você verá uma melhoria definitiva. verifique httpd.apache.org/docs/2.0/programs/ab.html e cyberciti.biz/tips/... para AB
ganso