Executando verificação de segurança...
2

Quedas constantes no servidor

Fala galera, tenho um servidor na digital que possui apenas 1 cpu com 1gb de ram.

Tenho uma aplicação simples (construida em Laravel 9, PHP 8.1), onde faz algumas consultas básicas no banco (MYSQL).

Fazendo um teste de carga, o servidor aguenta 10 usuários simultaneos fazendo 5 requisições http a páginas distintas (nenhuma consulta lenta). Se eu colocar 11 usuários, acaba batendo 100% da cpu e mata os serviços do apache e do mysql, fazendo a aplicação não funcionar mais até restartar os serviços. Já tentei remover tudo da página deixando apenas uma string, e mesmo assim continua caindo.

Criei um arquivo teste.php apenas com uma string, e fiz diversas requisiçoes (150 usuarios+) e ficava normal (obviamente nao fazia nenhuma conexao ao banco).

Utilizo o APM New Relic pra algumas metricas, mas mesmo assim não encontrei o erro (alem de mostrar o pico de uso da cpu em 100%). Porem, acredito que o servidor deveria aguentar mais que 10 usuarios, sabendo que é uma aplicação simples.

Alguem teria um norte do que mais posso tentar fazer?
Agradeço!

Carregando publicação patrocinada...
2

sobre o laravel

consegue compartilhar essas consultas que está fazendo dentro do Laravel? da uma ideia tb do tamanho das de linhas nas tabelas por favor.

sobre o new relic, está usando o apm junto com o php agent ou ta só puxando logs?

ainda sobre apm, se cadastra no inspector e poe pra rodar, por lá vc consegue consultar cada requisição no seu site e ver uma linha do tempo com td o que esta rolando (tempo de consultas sql, renderizacao de templates, params de entrada, logs gerados) sem alterar nada de codigo: https://app.inspector.dev/register?referrer=64c5249bc9094

se precisar da para adicionar segmentos na mão tb para registrar eventos específicos ( como uma chamada de uma api externa por exemplo)

(o link é de indicação, cadastrando por ai vc ganha +50k eventos e eu tb, win-win)

1

Considero uma aplicação em Laravel EXTREMAMENTE pesada, com 1 CPU e 1Gb de ram tem que cuidar muito o que cada processo está rodando. Antes de encrontrarmos a solução devemos responder as perguntas abaixo:

  • Qual é o numero máximo de conexões que são criadas no DB?
  • Qual o número de processos máximos que o apache pode criar?
  • Como você está fazendo esse teste de carga (Gatling, k6)? E qual o script você está usando?
  • Quanto de RAM está sendo usado na sua aplicação no momento que trava? está com SWAP ativo?
1

Qual é o numero máximo de conexões que são criadas no DB?
Segundo o phpMyAdmin são 17 conexões

Qual o número de processos máximos que o apache pode criar?
Se estiver falando dos workers, foi setado pra 500

Como você está fazendo esse teste de carga (Gatling, k6)?
Estou utilizando JMeter, basicamente cerca de 15 requisições HTTP na home durante 10 segundos

Quanto de RAM está sendo usado na sua aplicação no momento que trava? está com SWAP ativo?
Bate uns 60-70% de ram com swap ativo

1

500 processos do apache, cada processo consome cerca de 3 a 5MB de RAM. Caso todos os processos estejam abertos ao mesmo tempo você precisará de 1.5GB (na melhor das hipóteses) só pra manter esses processos abertos (sem rodar nenhum código).

Para 1 GB de ram vc deve limitar muito isso, o servidor não pode receber tanta requisição, 10 a 15 simultâneas no máximo. Toda a carga restante deve ficar enfileirada em um proxy como o Nginx (ou um apache dedicado)