Operamos uma instância do MS SQL Server 2022 (padrão 16.0.4095.4) no Windows Server 2022 (máquina virtual com 32GB de RAM) e tendo problema com a “Memória Modificada” consumida pelo processo sqlservr.exe.
A configuração de memória do SQL Server é a seguinte:
O consumo geral de memória é assim:
Quando olho o que consome essa memória modificada, vejo que é o SQL Server:
Essa parte "modificada" da memória está em constante crescimento e parece nunca diminuir (ela tem se mantido cada vez mais alta há dias). As estatísticas de desempenho do SQL Server não indicam nenhum problema de desempenho no momento.
Além disso, a saída do DBCC MEMORYSTATUS não me dá nenhuma pista sobre o que poderia ser essa parte de "memória modificada". Pelo que entendi a saída (veja abaixo) o consumo de memória relatado pelo DBCC MEMORYSTATUS se enquadra no limite definido em "Memória máxima do servidor".
Você tem alguma ideia do que poderia causar o tipo de consumo de memória muito acima do valor definido em "Memória máxima do servidor" ou como posso investigar mais detalhadamente?
O problema não ocorre em nenhuma outra instância que temos - a "memória modificada" é uma pequena parte do consumo de memória. A única diferença entre esta e outras instâncias é que há vários grupos básicos de disponibilidade configurados nesta caixa. Não são permitidos quaisquer outros "recursos suspeitos" (sem índices columnstore, sem OLPT na memória ...).
O que tentei só por curiosidade é diminuir o valor de "Memória máxima do servidor". O único efeito foi que a “memória em uso” liberada por isso foi lenta mas seguramente trocada para a “memória modificada” em algum tempo. Estou pensando em aumentar a memória da VM, mas temo que isso resulte apenas em um consumo maior de "memória modificada"...
A memória modificada é essencialmente, sem se aprofundar muito, a memória que foi modificada e deve ser gravada no disco antes de poder ser reutilizada. O SQL Server possui um buffer pool (e vários outros itens de memória interna e externa) cuja função é literalmente ler e gravar dados. O SQL Server armazena dados em cache na memória para essa finalidade. O SQL Server modificará muita memória. Você pode ficar à vontade para usar o rastreamento etw para encontrar alterações na memória, despejar essas páginas e ver o que foi modificado, mas é inútil. Deixa eu te responder, alguém fez uma consulta, precisava de dados ou fez alterações nos dados, a memória foi modificada. A memória máxima do servidor está definida como muito alta para o servidor configurado (com todo o resto em execução) e agora você está vendo os contadores de memória modificados.
Agora que você tem sua resposta, como isso vai ajudar? Por mais que eu afirmei, não vai.
Você tem um problema XY. Você está focado na coisa errada e não desiste dela. É hora de deixar ir, ver a floresta, parar de ir contra o que as pessoas a quem você pediu ajuda estão lhe dizendo.
Existem muitos recursos aqui explicando a memória máxima do servidor, além do link que forneci:
A partir de suas próprias capturas de tela, a memória máxima do servidor está como foi configurada.
A suposição, como afirmei, é que o SQL usará apenas 20 GB, o que está incorreto. Imagens, pilhas de threads, alocação de heap e uma série de outras coisas não se enquadram na memória máxima do servidor, conforme indicado no link que eu havia fornecido anteriormente. Você faz backups? Legal, isso fora também. Vejo que o SQL Agent está em execução, você considerou isso? O SSMS também está em execução, e quanto a isso? Vejo muitos itens de terceiros e toda aquela memória também foi contabilizada? As pilhas de threads, imagens, DLLs de terceiros e sua alocação de heap, etc., foram todas contabilizadas nesses mágicos 32 GB de memória que foram alocados?
Defina a memória máxima do servidor para baixo, remova quaisquer DLLs próprias ou de terceiros (servidores vinculados, etc.) e não execute muitas outras coisas no servidor.
Deixe de lado a questão da memória modificada, por favor, é inútil neste contexto, como afirmei anteriormente.
Apesar de estar desanimado com isso e como não considero a quantidade cada vez maior de "memória modificada" bloqueada pelo sqlsvr.exe como comportamento padrão e saudável, continuei a investigação e finalmente encontrei a causa raiz do problema em nosso ambiente.
Basta recapitular o ambiente e o problema no início:
Quando olhamos para a "memória modificada" não da perspectiva do processo ao qual ela pertence, mas do arquivo, descobrimos que a alocação crescente parecia ser mantida em um arquivo de log de eventos WFCS, conforme mostrado abaixo:
Houve um grande número de eventos de "nível detalhado" gerados em alta cadência, embora ClusterLogLevel tenha sido definido como 3.
Houve eventos como este:
Após várias tentativas, não conseguimos forçar o não registro dos eventos de nível detalhado.
No final, decidimos desabilitar todo o log de FailoverClustering no Log de Eventos do Windows. Desde então o consumo de memória se comporta de forma "normal" com uma quantidade insignificante de "Memória Modificada" consumida como estamos acostumados em outros servidores.
O problema parece estar em algum lugar no WFCS e no número de AGs nos servidores, pois a quantidade de AGs é, em princípio, o único aspecto em que este ambiente (2 servidores) difere de todos os outros ambientes que operamos.