Apache sem memória no

1

Eu tenho um VPS com 768 MB de RAM e um processador de 1,13 GHZ. Eu corro um site de namoro php / mysql e o desempenho é excelente e a carga do servidor é geralmente muito baixa.

Às vezes, coloco anúncios no Facebook e, nos horários de pico, consigo de 100 a 150 cliques em poucos segundos. Isso faz com que o servidor fique sem memória:

Não é possível alocar memória: não foi possível criar um processo filho: / opt / suphp / sbin / suphp ....

E todos os usuários recebem uma página de erro 500.

Estou apenas imaginando se isso parece razoável ou não - para mim, 100-150 não parece ser um número que deve fazer com que o apache fique sem memória.

Qualquer conselho / recomendação sobre como diagnosticar o problema é muito apreciado.

    
por Sherif Buzz 10.03.2011 / 22:23

4 respostas

2

A otimização do tamanho da memória geralmente é feita reduzindo (e limitando) esses fatores:

  • contagem de processos do Apache simultâneos (eu recomendaria mudar para prefork MPM, que é mais controlável em ambientes com memória limitada)
  • mudando de mod_php ou php_cgi para fastcgi, o mod_cfgid funciona bem. Reduzindo a contagem de processos php permitidos gerados por FcgidMaxProcesses e removendo longos tempos limite (consulte link )
  • threadiness "do servidor", especialmente reduzindo tempos limites desnecessariamente longos ((des) conecta timeouts, keepalives, ...)

Se a carga estiver ficando muito pesada, você também deve verificar a velocidade de processamento da solicitação (o carregamento mais rápido melhora o tamanho total * da memória necessária para uma solicitação)

  • otimizar o código do seu website (melhorando o código PHP para ser mais rápido e / ou mais eficiente na memória)
  • otimizando a execução do PHP (o xcache pode agilizar as coisas várias vezes)
  • o cache de solicitações inteiras também faz maravilhas, veja mod_cache

Talvez, se a sua web não precisar de muita CPU e você precise de alguns Req / S extremos, experimente um servidor diferente (como nginx ou lighttpd) que se comporta melhor nessas situações.

    
por 10.03.2011 / 22:45
0

O tratamento de tráfego espinhoso é difícil. As alternativas incluem: um servidor HTTP mais leve (lighttpd, nginx, et al); RAM mais física; um balanceador de carga e hosts adicionais, que tem o benefício adicional de maior disponibilidade; descarregar seu código de aplicativo em um sistema separado do servidor HTTP, normalmente por meio do FastCGI; provisionar recursos de computação dinamicamente para atender a carga por meio de um serviço em nuvem como o EC2; ou toneladas de outras ideias que esqueci ou não pensei. Existem alguns ótimos recursos sobre esse material lá fora; O blog High Scalability , por exemplo, cobre muito desse território. Espero que isso ajude!

    
por 11.03.2011 / 00:10
0

O requisito de memória por instância para o Apache é de cerca de 10MB, embora a quantidade exata varie dependendo da sua configuração. Portanto, se você quiser atender 100 conexões simultâneas com o Apache, precisará de pelo menos 1 GB de RAM, além do que for necessário para o sistema, o MySQL e qualquer outra coisa que estiver executando.

Se você quiser interromper as condições de "falta de erro", é possível ajustar o parâmetro de configuração MaxClients do Apache para um nível apropriado. Para obter uma estimativa da memória por instância do Apache, consulte top output e subtraia as colunas RES e SHR de todos os comandos do httpd. Certifique-se de subtrair qualquer memória que o MySQL e o resto do sistema precisem. Note que você pode acabar com um número relativamente baixo para MaxClients nesta máquina (30-50).

As outras respostas deram um bom resumo do que você pode fazer para melhorar quantas solicitações simultâneas você pode manipular. Esteja ciente de que em um sistema tão baixo, pode ser difícil, embora não necessariamente impossível, ajustar-se ao Apache / PHP / MySQL mais lighttpd / nginx / memcached / caching. Quão fácil ou difícil dependerá da sua aplicação e do seu desempenho alvo. Considere a possibilidade de atualizar para um servidor maior ... você encontrará tudo para se adaptar a 2 GB ou 4 GB de maneira muito mais fácil.

    
por 11.03.2011 / 02:20
0

A primeira coisa a fazer é arrumar seu sistema atual. Fora da caixa, o apache geralmente é configurado com muitas extensões das quais você provavelmente não precisa (particularmente o auth e o proxy, também se você usar SSL, mas raramente, considere remover mod_ssl e executar o stunnel). Ative o mod_deflate. Veja todas as outras coisas em execução no seu sistema - desligue (e desative) quaisquer serviços que você não precise.

Em seguida, executar o suphp em uma máquina dedicada via CGI geralmente é uma ideia muito idiota - use mod_php ou fastCGI.

Ao tornar seu sistema mais rápido, você não apenas fornece um serviço melhor para seus clientes, mas reduz o consumo de memória. Então ....

Instale um cache PHP opcode se você ainda não tiver um.

Comece a analisar o desempenho do seu sistema - altere a configuração do httpd para iniciar o registro em% D e veja o produto da frequência do URL e% D para identificar quais URLs estão causando mais problemas.

Reduza o limite no seu log de consulta lenta no MySQL - use este analisador ou similar para analisar os dados (nota que, novamente, você deve priorizar com base no produto de frequência e tempo de execução).

Adicione um prefixo automático para ativar a compactação do buffer de saída gz.

Comece a gravar o número de processos httpd em execução e compare isso com os menos cache / buffers disponíveis de 'free' - cole os dados e faça gráficos para descobrir quantos processos httpd você pode executar de maneira sensata - e então altere seu httpd.conf para impor esse limite. Note que o disco de E / S é fenomenalmente lento - então você precisa de uma boa quantidade de memória disponível para o cache.

Comece por verificar se o seu servidor está fornecendo boas informações de armazenamento em cache com conteúdo - ou se os clientes e os proxies precisam continuar voltando para coisas que não foram alteradas (mod_expires, mod_headers)

Mas às vezes você só precisa de mais hardware. Eu recomendo considerar um segundo servidor em vez de apenas atualizar o que você tem - adicionar o DNS round-robin é trivial - e você obtém o benefício adicional de melhor disponibilidade (uma vez que você tenha resolvido como lidar com a replicação do banco de dados) .

    
por 11.03.2011 / 14:54