Como reduzir o uso de memória em um servidor web Unix

36

Atualmente, estou usando um Joyent Accelerator para hospedar meus webapps e ele está funcionando bem. No entanto, preciso reduzir custos, por isso estou desclassificando meu plano atual e isso impõe alguns novos limites de memória (256M rss, 512M swap). Eu não estava muito longe sobre eles ontem, mas depois de reiniciar o Apache várias vezes hoje, estou agora 411M rss, 721M swap (prstat-Z -s cpu).

A pesquisa no Server Fault oferece-me apenas muitas maneiras e ferramentas específicas para monitorizar o servidor, mas não aconselho como reduzir / otimizar o uso da memória. Eu também vi esta pergunta , mas eu não acho que seja bom para essa situação particular (ou posso dizer genérica?).

O servidor está executando o Solaris em uma CPU compartilhada e estou usando uma pilha Apache + MySQL + PHP.

Estou interessado em saber os passos que podem ser dados para resolver isso e resolver os problemas. No entanto, eu também estou ficando sem tempo para diminuir minha pegada de memória e fazer o downgrade do plano antes que a corrente termine, então qualquer coisa que possa fazer mágica e salvar o dia também é bem-vinda:)

    
por lima 06.06.2009 / 14:27

8 respostas

22

Obrigado a todos por suas respostas! Seguindo suas sugestões, consegui reduzir o uso da minha memória para 195M SWAP e 108M RSS, sem tocar no meu código (definitivamente vou otimizá-lo em breve, mas isso deveria ser uma solução para me tirar rapidamente de problemas).

Veja a lista de coisas que fiz:

Livri-me do curinga usado nas entradas do VirtualHost. Em vez de *: 80 e *: 443, usei o IP real do meu servidor.

Alterado o prefork MPM do Apache. Estes são os valores que acabei usando:

StartServers           1
MinSpareServers        1 
MaxSpareServers        5 
ServerLimit           16
MaxClients            16
MaxRequestsPerChild    0
ListenBacklog        100

Estes números não são mágicos. Eu passei algum tempo tentando valores e combinações diferentes e, em seguida, testando-os contra o uso real do meu servidor e todos deveriam fazer o mesmo em seu ambiente. Para o registro, meu servidor recebe perto de 2M pvs / mês, servindo tanto páginas dinâmicas e ativos em uma taxa regular - nenhum efeito digg. A intenção, novamente, era reduzir o consumo de memória, não melhorar o desempenho ou a HA.

Referência:

Desativado o KeepAlive do Apache. Ao definir KeepAliveTimeout como um valor mais baixo (2 no meu caso) posso esperar menos processos do servidor aguardando conexões com clientes ociosos que podem não solicitar mais conteúdo .

Referência: link

Removemos o módulo não utilizado do MySQL. Eu adicionei skip-innodb ao my.cnf do MySQL. Redução maciça do consumo de memória.


Há também algumas boas sugestões notáveis que não posso fazer pessoalmente:

  • Remova os módulos do PHP que você não precisa. O PHP no meu servidor tem a maioria dos mods já compilados, eu provavelmente vou tentar o meu próprio PHP em outros VPS.
  • Mude para o nginx com o php-fastcgi. Esse é outro bom conselho que tentarei em breve, mas agora não posso arriscar o tempo de inatividade.
por 07.06.2009 / 17:15
6

Eu encontrei este artigo sobre configurações de baixa memória para Apache e MySQL

Para ser muito útil no layout das alterações de configuração necessárias para configurações de pouca memória. Eu os alterei para minha própria situação, mas eles devem fornecer as ferramentas necessárias para encontrar o melhor ajuste para o seu ambiente

    
por 06.06.2009 / 23:34
4

Você precisará limitar quantos processos do servidor apache estão sendo executados e, estando tão próximo do limite quanto você, você não conseguirá lidar com tráfego muito intenso. Ter um servidor da Web que é maximizado sob o uso normal é geralmente uma idéia ruim (tm), como o tráfego da web é bom e baixo para a maior parte até que você seja slashdotted ou digged ou fireball ou o que quer.

Os principais problemas são o número de processos do apache que estão sendo executados em qualquer ponto - assumindo o prefork aqui, já que eu só implementei aplicativos PHP e o PHP não é thread-safe. Eu não tenho experiência em dimensionar o trabalhador MPM. Existem alguns itens que estão na memória compartilhada e alguns itens que estão na memória de cada processo.

Você pode reduzir o consumo total de memória deixando de fora os módulos compartilhados dos quais não precisa. Basicamente, o Apache vem configurado a partir da maioria dos hosts para fazer praticamente tudo sob o sol. Se você não está usando o mod_userdir, então comente com a configuração do seu apache. Apenas tome cuidado com o quanto você remove, porque algumas das coisas que você pode precisar ou suas dependências não são intuitivas! Todos os módulos devem ser documentados no site apache.org. A pegada por processo é mais difícil de diminuir; a maioria das configurações do apache atualmente vem com os quatro módulos essenciais compilados. Além desses quatro módulos, a maior parte do uso da memória vem de vazamentos ou RAM do aplicativo que não é coletada com eficiência, e é por isso que você pode definir o número de solicitações manipulado por cada processo baixo.

Você realmente quer manter seu uso de memória na própria RAM e não entrar em swap. Trocar significa E / S. AE / S é lenta e direcionará seu uso da CPU para o topo enquanto os processos são bloqueados enquanto espera que algo seja removido da troca.

    
por 06.06.2009 / 23:15
2

Para o apache, remova os módulos que você não usa, já que eles apenas usam memória adicional. Para o MySQL, remova innodb / bbdb se você não usá-los, e remova os módulos do PHP que você não precisa.

Em seguida, você deve configurar o MaxClients do Apache com base no tamanho de um processo e na quantidade de memória que deseja dar ao Apache. O mesmo vale para conexões máximas no MySQL (eu recomendo o excelente script MySQL Tuning Primer .

Se você tiver controle sobre seu aplicativo PHP, verifique se ele não usa muita memória (por exemplo, em variáveis, especialmente as estáticas).

Se você quiser ir mais longe, você pode substituir o apache + mod_php pela configuração nginx + fcgi, o que provavelmente resultará em mais redução de memória.

Uma última coisa - você realmente não quer trocar em um servidor web. Apenas um pouco, para remover as coisas desnecessárias, mas trocar regularmente em um servidor da web resultará em um site não responsivo.

    
por 06.06.2009 / 16:05
2

Já que você já conheceu seu alvo, aqui estão alguns extras:

Desde que você removeu todos os módulos PHP desnecessários, você poderia fazer o mesmo para o apache. Por padrão (dependendo da instalação) o Apache carrega um monte de módulos extras e a maioria deles não é realmente necessária para o uso normal do dia a dia. Por exemplo, há vários módulos de autenticação que são sempre carregados. deflate normalmente não é necessário, a menos que você esteja tentando limitar seu uso de largura de banda. Autoindex & O status também é questionável.

E outra é que você pode limitar a quantidade de memória disponível para php em php.ini: memory_limit = xxxM

    
por 07.06.2009 / 18:43
0

Uma coisa que pode ajudar no crescimento da memória ao longo do tempo é configurar o httpd keepalive para baixo, mas eu testaria com cuidado caso seu aplicativo precise de processos mais longos.

    
por 06.06.2009 / 21:51
0

The server is running Solaris on a shared CPU, and I'm using a Apache + MySQL + PHP stack.

Eu não tenho experiência com o Solaris, mas a melhor coisa que você pode fazer é não usar o Apache / mod_php.

  • Mude para o nginx com o php-fastcgi.
  • Recompile o php para usar a quantidade mínima de plugins.
  • Livre-se de processos desnecessários como o ntpd (use ntpdate), ftp (use scp) etc ...
por 06.06.2009 / 23:30
0

Você poderia, é claro, limitar o número de processos que o apache pode bifurcar, no entanto isso só funcionaria como um limite sudo-hard em seu uso de memória. De um ponto de vista de nível mais baixo, você pode usar plimit para restringir os recursos disponíveis para um processo. Aplique isso aos processos pai e filho herdados, acredito.

No entanto, do ponto de vista da configuração do servidor da Web, pode-se resumir a como o seu código é realmente executado! Mas tenha em mente pequenas coisas como usar arquivos .htaccess usar mais recursos do que usar arquivos de configuração central do apache (como eles são lidos toda vez que uma solicitação chega, levando a maior sobrecarga), algo que é significação em grandes sites.

    
por 06.06.2009 / 14:51