Criei um produto SaaS. Estou usando PHP 8.3 com um banco de dados MySQL 8.0. Localmente isso é muito rápido! Nenhuma estrutura etc. é usada. A produção é executada no Azure. Tenho a seguinte configuração no Azure:
Base de dados
Azure Database for MySQL flexible server
- Burstable, B1s, 1 vCores, 1 GiB RAM, 20 GiB storage
- MySQL version 8
O custo ronda os 20 euros/mês.
Serviço de aplicativo
Azure Web App
Basic B1, 100 ACU/vCPU, 1 vCPU, 1.75 memory (GB), 10 GB storage
OS: Linux
O custo ronda os 10 euros/mês
o problema que estou enfrentando é que inicialmente quando um usuário aleatório acessa meu site e executa uma ação onde uma consulta ao banco de dados é necessária. O banco de dados é MUITO lento no início. Pode levar de 3 a 10 segundos! Após esse 'aquecimento', cada novo usuário que acessa o site não sofre atrasos e as consultas ao banco de dados são muito rápidas. Digamos que se passem de 30 a 60 minutos e não haja atividade no site e um novo usuário acesse o site, está muito lento novamente. Isso NÃO é algo que eu quero. O que devo fazer para remover esse 'aquecimento'?
Dir-se-ia que uma base de dados de ~20 euros/mês teria um desempenho melhor. Eu tive bancos de dados MySQL mais baratos e com melhor desempenho.
Notas:
- O aplicativo da Web está definido como 'Sempre ativado'
- Meu banco de dados é MUITO pequeno e perfeitamente otimizado, aproximadamente 5 tabelas, aproximadamente 100 registros
- Meu 'innodb_buffer_pool_dump_at_shutdown' está definido como ON
- Meu 'innodb_buffer_pool_load_at_startup' está definido como ON
- Meu 'innodb_buffer_pool_size' tem 134217728 bytes (~128 MB)
- O serviço MySql e App é executado em uma vnet
- MySql e serviço de aplicativo usam SSL
- Tudo o que tenho está na mesma região (Europa Ocidental), tal como o meu público
Quantos dados? Se for muito maior que 128 MB, o buffer_pool_size precisa ser aumentado.
Mas... Com apenas 1GB de RAM na instância da nuvem, aumentar o buffer_pool levaria à troca, o que seria péssimo para o desempenho.
Seria prático para você acessar sua página web sempre que o banco de dados fosse reiniciado? Isso pode preparar o cache (buffer_pool) no seu horário, e não no horário do usuário.
Talvez seja necessário optar por uma instância de 2 GB de RAM. Vou dar uma olhada nas coisas que você posta para Wilson; talvez eu possa fazer uma sugestão diferente.
Enquanto isso, aqui está outra ferramenta de depuração: SlowLog
Gerrit,
Na sua seção my.ini [mysqld], adicione uma linha
para envolver a instância.
Você pode ser obrigado a
Deixe-nos saber se isso elimina sua 'lentidão no início', por favor.
Desculpe pela minha resposta tardia. Mudei de "B1s expansível para D2ds de uso geral" para testes nos últimos dias. O problema que eu estava enfrentando é uma característica de um banco de dados expansível, eu acho. O banco de dados de uso geral D2ds não tem esse problema. Um banco de dados expansível não funcionará no meu contexto de negócios, então estou mudando para um banco de dados reservado de uso geral.