AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 337720
Accepted
Martin Karouš
Martin Karouš
Asked: 2024-03-14 17:07:18 +0800 CST2024-03-14 17:07:18 +0800 CST 2024-03-14 17:07:18 +0800 CST

MS SQL Server - Alto consumo de "memória modificada"

  • 772

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:

Configuração de memória do SQL Server

O consumo geral de memória é assim:

Consumo geral de memória

Quando olho o que consome essa memória modificada, vejo que é o SQL Server:

Saída do mapa RAM

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".

Saída DBCC MEMORYSTATUS

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"...

sql-server
  • 2 2 respostas
  • 133 Views

2 respostas

  • Voted
  1. Sean Gallardy
    2024-03-15T23:07:56+08:002024-03-15T23:07:56+08:00

    [...] tendo problema com a "memória modificada" consumida pelo processo sqlservr.exe

    O que eu gostaria de saber/entender é o que exatamente consome essa "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:

    • Alocação de memória do SQL Server e configuração máxima de memória do servidor
    • Por que o SQL Server não está usando a configuração Max Server Memory?
    • A RAM ocupada pela conexão de memória compartilhada conta em relação à memória máxima do servidor?
    • Memória máxima do servidor configurada, mas aumenta mais sua configuração
    • https://learn.microsoft.com/en-us/sql/database-engine/configure-windows/server-memory-server-configuration-options?view=sql-server-ver16

    A partir de suas próprias capturas de tela, a memória máxima do servidor está como foi configurada.

    insira a descrição da imagem aqui insira a descrição da imagem aqui

    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?

    insira a descrição da imagem aqui

    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.

    • 3
  2. Best Answer
    Martin Karouš
    2024-04-19T19:41:46+08:002024-04-19T19:41:46+08:00

    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:

    • 2 servidores Windows 2022 em WFCS com MS SQL 2022 Standard (16.0.4095.4), 32 GB de RAM
    • 20 bancos de dados no total, cada um deles em um Grupo de Disponibilidade Básica.
    • O tamanho total de todos os bancos de dados é de 46 GB.
    • Independentemente da carga de trabalho atual, a quantidade de "memória modificada" bloqueada pelo sqlsvr.exe crescia continuamente e nunca diminuía. Mesmo depois do expediente, quando o servidor está ocioso.
    • O mesmo comportamento encontrado após várias reinicializações da VM.
    • Nenhum de todos os outros SQL Servers que operamos (mais de 100) se comporta assim. Em todos eles a quantidade de “Memória Modificada” consumida é constantemente insignificante (unidades de MBs).
    • A parte "Memória Modificada" foi mostrada no Monitor de Recursos do Windows (ou utilitários como mapa de RAM) como bloqueada pelo processo sqlsrv.exe, mas conforme a saída do DBCC MEMORYSTATUS não consumida por nenhum responsável pela memória.
    • A "memória modificada" estava aumentando às custas da memória livre restante da VM e também das alocações dos funcionários de memória (até atingir o valor de configuração Min Server Memory). Mais cedo ou mais tarde, sempre atingíamos 99% de utilização da memória do servidor e a VM começava a ficar irresponsável.

    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:

    insira a descrição da imagem aqui

    Houve um grande número de eventos de "nível detalhado" gerados em alta cadência, embora ClusterLogLevel tenha sido definido como 3.

    insira a descrição da imagem aqui

    Houve eventos como este:

    insira a descrição da imagem aqui insira a descrição da imagem aqui

    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.

    • 1

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve