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 :)
Respostas:
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:
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
KeepAliveTimeout
um 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-innodb
ao 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:
fonte
Got rid of the wildcard used in VirtualHost entries
isso realmente ajuda de alguma maneira significativa? Fiquei com a impressão de que não faria diferença.Encontrei este artigo sobre configurações de pouca memória para Apache e MySQL
Ser muito útil no layout das alterações de configuração necessárias para configurações de pouca memória. Ajustei-os para a minha própria situação, mas eles deveriam fornecer as ferramentas necessárias para encontrar o melhor ajuste para o seu ambiente
fonte
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.
fonte
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.
fonte
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
fonte
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.
fonte
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.
fonte
Não tenho experiência com Solaris, mas a melhor coisa que você pode fazer é não usar o Apache / mod_php.
fonte