Sei que essa pergunta é um pouco longa, mas optei por descrever cada aspecto que observei do meu lado.
Estou usando um servidor Linux, o sistema operacional usado é o Ubuntu 14.04, todas as configurações restantes estão definidas abaixo. Este servidor Web é usado para atender aplicativos construídos em PHP, o banco de dados é hospedado em RDS. Em média, nos horários de pico, há quase 200 solicitações simultâneas no servidor, o que resulta em 100% de utilização da memória. Devido a isso, o aplicativo fica muito lento ou às vezes responde com erros. Então, segui alguns passos para resolver isso, listados abaixo, e tentei ajustar o Apache e restringi-lo para situações estranhas.
SO
NOME="Ubuntu" VERSÃO="14.04.5 LTS
Configuração do servidor
CPU: 8 núcleos
RAM: 15 GB
Provedor de hardware: AWS
Tipo de instância: c4.2xlarge
Parâmetros Apache.Conf (2.4)
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
HostnameLookups Off
LogLevel warning
AllowOverride all (para a raiz do documento do aplicativo)
MPM USADO: pré-garfo
MPM_PREFORK.CONF
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 256
MaxConnectionsPerChild 200
Mods_Enabled
access_compat.load autoindex.load mime.load setenvif.load alias.conf deflate.conf mpm_prefork.conf socache_shmcb.load alias.load deflate.load mpm_prefork.load ssl.conf authn_core.load dir.conf negociação.conf ssl.load authn_file. carregar dir.carregar negociação.carregar status.conf authz_core.load env.carregar php5.conf status.carregar authz_host.carregar filtro.carregar php5.carregar authz_user.carregar cabeçalhos.carregar reescrever.carregar autoindex.conf mime.conf setenvif.conf
Tamanho médio do processo Apache
Comando usado:
sudo ps -ylC apache2 | awk '{x += $8;y += 1} END {print "Apache Memory Usage (MB): "x/1024; print "Average Process Size (MB): "x/((y-1)*1024)}' <br/>
Uso de memória Apache (MB): 7.227,66
Tamanho médio do processo (MB): 314,246
Cálculo de MaxRequestWorkers
X = RAM dedicada que desejo alocar para o Apache (13 GB): 13312 MB
Y = Tamanho médio do processo que estou monitorando nos últimos 15 dias no servidor: 314.246
MaxRequestWorkers = X/Y = 40 aproximadamente
MPM USADO: pré-garfo
MPM_PREFORK.CONF modificado
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 40
MaxConnectionsPerChild 8
Agora, quando o Apache for iniciado, ele iniciará 5 processos startservers e cada processo startserver iniciará 8 conexões filhas, portanto, no total, 40 conexões simultâneas podem ser feitas ao servidor. MaxRequestWorkers são limitados a 40, o que não ultrapassará 40 solicitações simultâneas, o que evitará em caso de DOS, DDOS ou protegerá o servidor de travamento ocupando no máximo 13 GB de RAM, deixando 2 GB de RAM livres para o servidor.
Também não estou claro sobre o parâmetro MaxConnectionsPerChild. Corrija-me se estiver usando errado.
Parâmetros PHP.INI (php5)
ANTIGO
output_buffering = 4096
max_execution_time = 60
memory_limit = -1
log_errors = On
NOVO
output_buffering = 4096
max_execution_time = 60
memory_limit = 64M
log_errors = On
QUESTÕES QUE AINDA SÃO ENFRENTADAS POR MIM
Depois de alterar o mpm_prefork_conf, a utilização da memória caiu, mas o servidor responde com erro 503 para muitos clientes devido ao parâmetro MaxRequestWorkers. Tentei descobrir por que cada processo do Apache está usando 315 MB de RAM, pesquisei no Google por cerca de 2 dias e não consegui encontrar o caminho certo para solucionar esse problema. Então finalmente postei isso aqui. Eu tenho duas opções agora.
Para otimizar o limite médio do processo do Apache e aumentar o limite MaxRequestWorkers.
Aumentar a RAM e atender clientes com o mesmo tamanho médio de processo, o que acho que não seria uma escolha acertada.
Por favor, guie-me com as sugestões certas de como posso identificar e reduzir o tamanho médio do processo do Apache com php. Por favor, apenas respostas genuínas.
Responder1
Eu não acho que você possa ficar muito melhor do que isso, eu escolheria usar php-fpm, então o carregamento de conteúdo não dinâmico será muito mais rápido e consumirá menos memória, descobri issoguia (digitalocean.com), que dá boas recomendações. Uma coisa que você pode verificar é alterar os tempos de manutenção de atividade no Apache, vejaaqui
Responder2
Isso é bastante memória por processo Apache. E o Ubuntu 14.0.4 foi EOL em 2019.
A coisa gritante na configuração que você postou é esta:
KeepAliveTimeout 5
Mude para 1. Você descobrirá que pelo menos metade dos seus processos ativos não estão fazendo nada, aguardando o tempo limite de manutenção de atividade.
Comece a analisar seu tráfego - certifique-se de que todo o seu conteúdo estático possa ser armazenado em cache.
Vá até a configuração do seu apache - certifique-se de não estar carregando módulos que não está usando.
Certifique-se de definir um horário padrão para PHP e de que seus scripts não estejam desativando o relatório de erros. Verifique seus logs de erros e limpe os erros. Tente ajustar seu listenBacklog no Apache.
MaxConnectionsPerChild 8
Por que? Isso émuitobaixo. O Apache é geralmente muito estável. Você deve ser capaz de aumentar para 100 para reduzir o número de vezes que o Apache precisa fazer fork e, assim, aumentar a capacidade. Se a alteração deste valor tiver impacto nas taxas de erro do aplicativo, verifique se você não possui conexões de banco de dados persistentes mal codificadas. Se isso afetar o uso da memória, certifique-se de que seus patches estejam atualizados.