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


36

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

A pesquisa na falha do servidor fornece apenas várias maneiras e ferramentas específicas para monitorar o servidor, mas nenhum conselho sobre como reduzir / otimizar seu uso de memória. Também vi essa pergunta , mas não acho que seja boa para essa situação específica (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 as etapas que podemos tomar para solucionar esse problema e resolver os problemas. No entanto, também estou ficando sem tempo para diminuir minha pegada de memória e fazer o downgrade do plano antes que a corrente termine, para que qualquer coisa que possa fazer mágica e salvar o dia seja bem-vinda também :)


1
Eu só queria comentar que, apesar de eu mesmo ter aprendido essas configurações ao pesquisar no Google, acabou alterando as configurações em um arquivo, mas um arquivo de configuração diferente que foi carregado mais tarde substituiu silenciosamente minhas configurações! Depois que descobri isso, definir as configurações do MPM pré-fork e algumas outras coisas funcionou maravilhosamente para manter a contagem de processos e o uso de memória sob controle, alternando ao mínimo. Espero que esta informação ajude outras pessoas, especialmente aquelas que executam o Gentoo em seus servidores.
28509 Pistos

Respostas:


23

Obrigado a todos por suas respostas! Seguindo suas sugestões, fui capaz de reduzir o uso de memória para 195M SWAP e 108M RSS, sem tocar no meu código (eu definitivamente o otimizarei em breve, mas isso deveria ser uma solução para me livrar rapidamente dos problemas).

Aqui está a lista de coisas que eu fiz:

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

Alterado o MPM pré-fork 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ão são de forma alguma números mágicos. Passei algum tempo tentando diferentes valores e combinações e testando-os contra o uso real do meu servidor, e todos deveriam fazer o mesmo em seu ambiente. Para o registro, meu servidor recebe cerca de 2 milhões de pvs / mês, atendendo páginas e ativos dinâmicos a uma taxa regular - sem efeito digg. A intenção, novamente, era reduzir a pegada de memória, não melhorar o desempenho ou a HA.

Referência:

Diminuído o KeepAlive do Apache. Ao definir KeepAliveTimeoutum valor mais baixo (2 no meu caso), posso esperar menos processos do servidor apenas aguardando conexões com clientes inativos que podem não solicitar mais conteúdo.

Referência: http://httpd.apache.org/docs/2.0/mod/core.html#keepalivetimeout

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


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

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

Estou executando o nginx e o php-fastcgi (LEMP) e estou enfrentando problemas de memória semelhantes ... em um servidor de 256 MB, acho que o php-fastcgi funciona bem com PHP_FCGI_CHILDREN = 5 e PHP_FCGI_MAX_REQUESTS = 333 ... esses valores são um bom começo ponto!
precisa saber é

Got rid of the wildcard used in VirtualHost entriesisso realmente ajuda de alguma maneira significativa? Fiquei com a impressão de que não faria diferença.
Mahn

@Mahn - ele não ajuda com a memória, mas melhora o uso da CPU, que é uma coisa boa em um ambiente de pouca memória
jsnfwlr

"Alterne para o nginx com php-fastcgi" --- Uma opção menos drástica e eficaz se você deseja manter o Apache2 seria: Apache2 + mod_proxy_fcgi + mod_mpm_event. mpm_event é semelhante ao nginx. Use isso para conectar-se ao php-fpm. Veja dracony.org/stop-using-php-fpm-to-argue-using-nginx-vs-apache
James Johnston


4

Você precisará limitar quantos processos do servidor apache estão em execução e, estando tão perto do limite quanto você, não poderá lidar com muito tráfego de pico. Ter um servidor da Web maximizado em uso normal geralmente é uma Bad Idea (tm), pois o tráfego na Web é agradável e baixo na maioria das vezes até que você seja pontilhado, escavado ou com bola de fogo ou qualquer outra coisa.

Os principais problemas são o número de processos apache que estão sendo executados a qualquer momento - assumindo o prefork aqui, já que eu implantei apenas aplicativos PHP e o PHP não é seguro para threads. Não tenho experiência em dimensionar o trabalhador MPM. Existem alguns itens que estão na memória compartilhada e alguns que estão na memória de cada processo.

Você pode reduzir o espaço total de memória, deixando de fora os módulos compartilhados que você não precisa. Basicamente, o Apache é configurado na maioria dos hosts para fazer praticamente tudo sob o sol. Se você não estiver usando o mod_userdir, comente-o na sua configuração do 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; Atualmente, a maioria das configurações do apache atualmente vem apenas 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 da RAM do aplicativo que não é coletada com lixo de maneira eficaz, e é por isso que você pode definir o número de solicitações tratado por cada processo baixo.

Você realmente deseja manter o uso da memória na própria RAM e não trocar. Trocar significa E / S. A E / S é lenta e direciona o uso da CPU através do telhado, à medida que os processos são bloqueados enquanto aguarda que alguma coisa seja trocada.


1
Obrigado pelo conselho Karl! Existe uma maneira de impedir que o servidor use o Swap? Porque, depois de reduzir o uso da memória, não tenho mais memória RAM, mas ainda está mostrando que a memória SWAP foi usada.
Lima

@fandelost Realmente não importa que o swap esteja sendo usado, é quando as coisas estão sendo paginadas dentro e fora do swap que são ruins. Seu sistema operacional pode estar trocando instruções ou dados de processos que não estão sendo executados com muita frequência quando há tempo para fazê-lo, porque pensa (e geralmente está certo) que essas instruções e dados são melhores por lá.
Patrick James McDougle

2

Para o apache, remova os módulos que você não usa, pois eles usam apenas memória adicional. Para o MySQL, remova o innodb / bbdb se você não os usar e remova os módulos PHP que você não precisa.

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

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

Se você quiser ir além, 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 deseja trocar em um servidor web. Só um pouco, para remover as coisas desnecessárias, mas trocar regularmente em um servidor da Web resultará em um site não responsivo.


Obrigado pelo seu conselho, estou tentando o tuning-primer.sh, mas recebo o seguinte erro: "erro de sintaxe na linha 94:` cnf_socket = $ 'inesperado ". Alguma ideia?
Lima

Pode estar relacionado ao shell. Como esse script provavelmente está relacionado ao Linux, tente alterar a primeira linha para apontar para bash, em vez de / bin / sh. Eu espero que você pode obter o bash instalado no Solaris, mas eu não posso ajudar com isso ...
yhager

2

Como você já atingiu seu objetivo, eis alguns extras:

Desde que você removeu todos os módulos php desnecessários, você pode fazer o mesmo no apache. Por padrão (dependendo da instalação), o apache carrega vários módulos extras e a maioria deles não é realmente necessária para o uso normal do dia a dia. Por exemplo, existem vários módulos de autenticação sempre carregados. normalmente não é necessário desinflar, a menos que você esteja tentando limitar o uso da largura de banda. O índice automático e o status também são questionáveis.

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


0

Obviamente, você pode limitar o número de processos que o apache pode bifurcar, mas isso só funcionaria como um limite sudo-rígido para o uso da memória. Do ponto de vista de nível inferior, você pode usar o 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 lembre-se de que pequenas coisas como usar arquivos .htaccess usam mais recursos do que usar arquivos de configuração do apache central (pois são lidos toda vez que uma solicitação é recebida, resultando em maior sobrecarga), algo que é significante em sites grandes.


0

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


0

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

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

  • Mude para nginx com php-fastcgi.
  • Recompile o php para usar a quantidade mínima de plugins.
  • Livre-se de processos desnecessários como ntpd (use ntpdate), ftp (use scp) etc ...
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.