Neste momento me deparo com alguns problemas de desempenho de banco de dados para uma aplicação SaaS. Durante o dia, as estatísticas de espera do RESOURCE_SEMAPHORE disparam de 30 a 60 segundos por 1 ou 2 minutos. Durante esse período, também recebo um ou mais e-mails de alerta de Gravidade 17 de nosso servidor com o aviso "Não há memória de sistema suficiente no pool de recursos 'interno' para executar esta consulta".
Já resolvemos as consultas mais ineficientes que tinham grandes concessões de memória (concessões de 1,5 a 2,5 GB com apenas 5% ou menos de uso). Para identificar essas consultas, usamos sp_BlitzCache de Brent Ozar. Infelizmente, os problemas de desempenho ainda ocorrem após essas alterações.
Lembre-se de que neste momento temos um trabalho de agente que executa DBCC FREEPROCCACHE a cada 5 minutos. Isso torna o problema mais esporádico. Mudar este trabalho para ser executado a cada meia hora parece piorar os problemas. É claro que executar este trabalho tem outras implicações, como compilações mais altas/s e maior utilização da CPU, mas neste momento é uma solução do tipo "melhor dos dois mundos".
Receio que os problemas de pressão de memória sejam resultado do servidor configurado com memória RAM insuficiente. Esta suposição está correta ou esses problemas são criados por outra coisa?
Estatísticas do servidor
- Servidor SQL 2022 (16.0.4085.2)
- 6 processadores lógicos (DOP máximo = 4)
- 16 GB de RAM total, configurado como 14 GB de memória máxima do servidor para SQL Server e 2 GB para sistema operacional
- Um total de 1381 bancos de dados
- Tamanho total do banco de dados: 302 GB
Esse é provavelmente o principal problema que você está enfrentando, mas com 6 núcleos e 1381 bancos de dados você também está enfrentando problemas de CPU, só que os problemas de memória são mais proeminentes no ambiente.
Apenas dizer isso em voz alta pode ajudar a fazer sentido. Digamos que cada banco de dados online exija algum nível básico de configuração do SQL Server, digamos que ocupe 4 MB de memória (este não é o valor real, ele mudará de acordo com várias configurações e versões). Existem 1.381 bancos de dados, portanto, apenas para colocar os bancos de dados online e não fazer nada, você consumirá 5,5 GB de memória para estruturas de controle e alocação. Isso não conta as necessidades de CPU - por exemplo, um encadeamento de recuperação, encadeamentos de GC, encadeamentos CLR, encadeamentos de gravador de log, IOCP, etc., todos em 6 cpus. Isso deixa quantidades mínimas de memória ou CPU para a carga de trabalho, depois de levar em conta o Windows e quaisquer outros serviços carregados no servidor (anti* qualquer porcaria, 50 agentes diferentes, etc.).
Existem essencialmente 230 bancos de dados por CPU e 11 MB por banco de dados. Isso, para mim, é lamentavelmente sobrecarregado como servidor. Não se sabe quanto você precisará, mas com 1.381 bancos de dados (a menos que seja uma situação de hospedagem em que 99% deles ficam ociosos o dia todo, quase todos os dias), eu consideraria CPU de dois dígitos e memória de três dígitos como ponto de partida .