Otimizando a memória do servidor VPS

5

O QUE ESTOU TENTANDO FAZER

Os limites de recursos do servidor às vezes são limitados; para ajudar a evitar o esgotamento da memória, tive que limitar os processos do servidor. Eu estou precisando de um pouco de ajuda especializada para saber se estou no caminho certo e, talvez, detectar quaisquer alterações de configurações óbvias que ajudariam o sistema a rodar mais com mais estabilidade.

HISTÓRICO

Recentemente, minha empresa foi atualizada para um VPS, a partir de hospedagem compartilhada. Basicamente, superamos nossa hospedagem compartilhada e começamos a ter problemas devido ao host que suspende nosso site por causa do uso excessivo de CPU no fim de semana. Os usuários do nosso site tendem a dobrar ou triplicar na sexta-feira e no sábado, toda semana, o que não é inesperado no nosso caso. (Cerca de 5000 visitas [~ 2500 visitantes] por dia durante a semana, cerca de 9500 visitas [~ 4500 visitantes] nos fins de semana.)

Agora que estamos em um VPS, não temos problemas com a CPU. (Na verdade, o painel de controle do CentOS WHM diz que estamos com ".000201% de carga da CPU".) No entanto, estamos tendo problemas de falta de memória, causando falhas.

RESUMO DO PROBLEMA

Nosso site é baseado em WordPress. No entanto, além dos comentários, há muito pouca atividade de "gravação"; a maioria dos usuários simplesmente vê páginas bastante estáticas que criamos.

Quando fizemos o upgrade para um VPS vários meses atrás, em outubro de 2012, o site funcionou bem durante a semana, mas ficou cheio de memória todo fim de semana. Frequentemente, ele falhava repetidamente (5 a 20 vezes durante um período de 24 horas, esporadicamente), geralmente começando na noite de sexta-feira e continuando até a tarde de sábado.

Durante a semana, o servidor foi executado consistentemente com 65-90% de uso de memória e, no final de semana, atingia 100%, causando falhas.

ETAPAS TOMADAS PARA CORRIGIR

Como eu era novo no VPS, comecei com todas as configurações padrão. Mais tarde, comecei a fazer ajustes, seguindo os conselhos que li sobre solucionar problemas de memória aqui neste site e em outros sites.

Eu fiz ajustes no MySQL, PHP e Apache, resumidos abaixo em "Current Configuration". Eu também recompilei o Apache e o PHP para remover módulos indesejados. Eu instalei um plugin de caching melhor para o WordPress (W3T), e adicionei o cache de opcode da APC. Também comecei a usar a compactação gz e movi muitos arquivos estáticos para um subdomínio separado.

Eu escrevi um pequeno script para verificar o status do servidor em um agendamento e reiniciá-lo conforme necessário, e ele também me envia uma transcrição do log de erros do servidor, para ajudar na solução de problemas. (Eu sei, é apenas um band-aid, se é isso. Mas era importante manter o site online, já que ninguém quer ficar sentado e monitorá-lo no fim de semana.)

Recentemente, há mais ou menos uma semana (janeiro de 2013), atualizei a RAM do servidor de 1 GB (2 GB de capacidade de expansão) para 2 GB (3 GB de capacidade de expansão). Isso parece ter corrigido a maior parte do problema, mas ainda assim eu recebo um aviso ocasional (uma vez por semana) que o servidor está pendurado, junto com erros de PHP "não posso aplicar o slot de processo".

CONFIGURAÇÃO ATUAL

É um servidor Apache, rodando o CentOS 6, o Apache 2 (Worker MPM), o PHP 5.3.20 (FastCGI / fcgi) e o MySQL 5.5.28. 2 GB de RAM (3 GB de capacidade de expansão), 24 CPUs.

O MySQL usa atualmente cerca de 618 MB, cerca de 20,1% de RAM. O PHP usa até 89 MB por processo. O Apache usa até 14 MB por processo.

Dia da semana típico top output:

top - 15:31:13 up 89 days,  5:26,  1 user,  load average: 1.54, 1.00, 0.70
Tasks:  49 total,   1 running,  48 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.2%us,  0.1%sy,  0.0%ni, 99.7%id,  0.1%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   3145728k total,  1046444k used,  2099284k free,        0k buffers
Swap:        0k total,        0k used,        0k free,        0k cached

Infelizmente, não tenho um exemplo atual de saída de fim de semana / horário mais movimentado.

Configuração do Apache:

StartServers: 5
MinSpareThreads: 5
MaxSpareServers: 10
ServerLimit: 80
MaxClients: 56
MaxRequestsPerChild: 5000
KeepAlive: Off

Configuração do PHP:

MaxRequestsPerProcess 500
FcgidMaxProcesses 15
FcgidMinProcessesPerClass 0
FcgidMaxProcessesPerClass 8
FcgidIdleTimeout 30
FcgidIdleScanInterval 15
FcgidProcessLifeTime 60
FcgidIOTimeout 300
FcgidMaxRequestLen 268435456

Configuração do MySQL:

[mysqld]
max_user_connections            = 75
net_buffer_length               = 8K
read_buffer_size                = 256K
read_rnd_buffer_size            = 512K
skip-external-locking
sort_buffer_size                = 512K

# MyISAM #
key_buffer_size                 = 32M
myisam_sort_buffer_size         = 16M
#myisam_recover                 = FORCE,BACKUP

# SAFETY #
max_allowed_packet              = 8M
#max_connect_errors             = 1000000

# CACHES AND LIMITS #
tmp_table_size                  = 104M
max_heap_table_size             = 104M
join_buffer_size                = 208K
#query_cache_type               = 0
query_cache_size                = 32M
max_connections                 = 150
thread_cache_size               = 4
#open_files_limit               = 65535
table_cache                     = 512
#table_definition_cache         = 1024
table_open_cache                = 2048
wait_timeout                    = 300

# INNODB #
#innodb_flush_method            = O_DIRECT
#innodb_log_files_in_group      = 2
#innodb_log_file_size           = 64M
#innodb_flush_log_at_trx_commit = 1
#innodb_file_per_table          = 1
innodb_buffer_pool_size         = 416M

# This setting ensures that aio limits are not exceeded
# (default is 65536, each instance of mysql takes 2661 with this enabled)
innodb_use_native_aio           = 0

# LOGGING #
log-slow-queries
log-queries-not-using-indexes

Qualquer ajuda / sugestão seria muito apreciada. O endereço do site é 3abn.org.

    
por Michael 15.01.2013 / 22:57

3 respostas

3

Você já está executando o PHP com FastCGI, então não tenho certeza do que mais você pode fazer para diminuir isso. Você está numa encruzilhada aqui ..

Algumas opções:

  • Ajuste tudo para o menor conjunto de dados possível. Substitua o Apache pelo nginx (se puder), ajuste o MySQL para que ele não armazene mais dados do que o necessário e assim por diante
  • Jogue mais RAM na caixa
  • Separe suas camadas em VMs dedicadas. Um servidor de banco de dados, um servidor de aplicativos e um front-end. Isso facilitará muito a escala.

Edit: Você está dizendo que você instalou muita coisa de cache. Cache = coma mais RAM para que o próximo pedido (s) seja mais rápido. Se você está com pouca memória RAM, o cache pode não ser a melhor coisa do mundo.

    
por 15.01.2013 / 23:09
3

Minha recomendação número um: SAIR DO VPS .

Já ouvi falar bastante sobre problemas relacionados à memória (e OOM-Killer) em sistemas VPS que eu sou da opinião que o típico provedor de hospedagem VPS não está fornecendo uma solução Production Grade - é não é um "servidor privado virtual", é "paravirtualização em cima de um sistema operacional existente com limitação de recursos mal projetada que consequentemente se comporta de maneira diferente de uma máquina real". (Você parece estar sendo mordido pela diferença mais comum: um "VPS" não tem espaço de troca, então quando você mastigar até mesmo um byte a mais de RAM do que foi alocado pelo seu provedor, as coisas desmoronam.)

Se você não puder ou não quiser hospedar seu próprio hardware em um datacenter de qualidade, considere um serviço em nuvem que aparece como um servidor "normal" com swap e similares (o Amazon EC2 é uma dessas opções). Essas soluções têm preços em algum ponto entre as soluções "VPS" e o hardware dedicado, mas oferecem uma experiência operacional muito mais próxima do "hardware real" e permitem que você evite situações como agora.

Observe que, em qualquer caso, você ainda precisa dimensionar seu sistema adequadamente - seu VPS / Cloud Solution / Hardware dedicado deve ter RAM suficiente para lidar com o pico de carga sem a troca.
A vantagem das soluções Cloud (qualidade) ou Hardware Dedicado é que você tem mais controle sobre o que acontece quando você alcança o ponto de troca ( desabilitando o OOM-killer e deixando malloc() falhar , por exemplo).

    
por 15.01.2013 / 23:31
2

A partir das informações que você publicou:

Seu VPS parece estar rodando sob OpenVZ ou Parallels Virtuozzo. Se o provedor de hospedagem fizer um overcast (muito), seu servidor nunca poderá usar o terceiro gig de memória.

Pior, seu VPS pode explodir por um pequeno período, mas o assassino da OOM começaria a matar processos. O killer da OOM pode ser ajustado (do lado do provedor de hospedagem) para tentar evitar que os processos mais importantes sejam eliminados (digamos ssh, bind, apache, mysql - usando prioridades), mas como os outros clientes no mesmo nó podem ser executados a mesma configuração típica, não é ajuda.

Obtenha o 3G garantido e o burst desativado.

Se as páginas da Web forem realmente estáticas e pequenas, você poderá usar um proxy reverso de armazenamento em cache. Sim, o cache usa memória. Mas o cache também impede a geração de processos PHP, que tendem a ser muito exigentes.

(você precisa fazer algumas contas e / ou tentar ... Esta não é uma solução absoluta)

Desative o APC ou execute o PHP-FPM.

Com o Fcgi, cada processo PHP possui seu próprio cache de opcode do APC. Use o FPM para todos os processos do PHP para compartilhar um cache comum. Ou desative o APC. Você não parece precisar de qualquer maneira (um cache opcode é muito mais eficiente para reduzir o uso da CPU do que o uso de memória;))

    
por 16.01.2013 / 00:35