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.