SQL Server 2008 R2 "Memória Fantasma"?


12

Temos uma máquina dedicada do SQL Server 2008 R2 que está enfrentando alguns problemas estranhos de memória. A máquina possui muitos recursos, incluindo dois processadores quad-core, 16 GB de RAM e Windows Server 2008 R2 Enterprise de 64 bits (é um Dell PowerEdge 2950) .

O estranho problema é que o sistema está relatando 82% da memória em uso, mas o sqlservr.exe está relatando apenas 155mb em uso. A razão pela qual suspeito que o SQL Server é o problema é que, se eu reiniciar o processo sqlservr.exe, o consumo de memória retornará ao normal por um período de tempo.

Alguém tem alguma idéia de como posso começar a rastrear esse problema?

Obrigado Jason


3
Você está usando o usuário Bloquear páginas na memória, certo? Nesse caso, a memória bloqueada não será relatada pelo gerenciador de tarefas. Consulte blogs.technet.com/b/askperf/archive/2008/03/25/… para obter mais informações.
— Mark S. Rasmussen

Temos o direito de usuário Bloquear páginas na memória definido como "Nenhum". Também temos a configuração "Memória máxima do servidor (em MB)" no padrão int.MaxValue - você acha que isso pode causar um problema?
— typefragger

4
A única vez em que me preocuparia é quando meu servidor sql estiver usando MENOS que 82%!
— SqlACID

Respostas:


15

Você não obterá uma imagem verdadeira do uso de memória no Gerenciador de Tarefas se a conta em que o serviço estiver sendo executado tiver o privilégio de páginas bloqueadas na memória (edite: conforme comentário / link de Mark Rasmussen). Para determinar quanta memória está sendo usada, você pode observar:

  • SQLServer: Gerenciador de memória \ Memória total de memória do servidor
  • DMVs

Não me lembro se existe uma DMV ou uma combinação disso que lhe dará a alocação total de memória, mas o seguinte mostrará a maior parte.

SELECT TOP(10) [type] AS [Memory Clerk Type], SUM(single_pages_kb) AS [SPA Mem, Kb] 
FROM sys.dm_os_memory_clerks 
GROUP BY [type]  
ORDER BY SUM(single_pages_kb) DESC OPTION (RECOMPILE);

SELECT DB_NAME(database_id) AS [Database Name],
COUNT(*) * 8/1024.0 AS [Cached Size (MB)]
FROM sys.dm_os_buffer_descriptors
WHERE database_id > 4 -- system databases
AND database_id <> 32767 -- ResourceDB
GROUP BY DB_NAME(database_id)
ORDER BY [Cached Size (MB)] DESC OPTION (RECOMPILE);

O segundo é o mais interessante, geralmente, alocações de buffer pool por banco de dados. É aqui que o compartilhamento do Lions será usado e pode ser útil entender quais dos seus bancos de dados são os maiores consumidores.


Uau, muito obrigado! Este (particularmente o segundo) deixou completamente claro para mim!
— typefragger

8

Há um artigo recente de nosso próprio Brent Ozar que trata desse caso, quando o Gerenciador de Tarefas não mostra corretamente a memória consumida pelo SQLServer e seus serviços adicionais. Você pode encontrá-lo aqui: Guia do Sysadmin para memória do Microsoft SQL Server .

Citação: " Por que o SQLServer.exe não está usando muita memória?

Quando você remota a área de trabalho em um servidor e olha para o Gerenciador de Tarefas, o Uso de Memórias do sqlservr.exe sempre parece maluco. Isso não é culpa do SQL Server. O Gerenciador de tarefas é um mentiroso sujo e imundo. (Eu sei, parece que o cara do SQL está mudando a culpa, mas aceite comigo por um segundo.) Nas caixas de 64 bits, esse número é um pouco mais preciso, mas nas caixas de 32 bits, é completamente fora da base . Para realmente obter uma imagem precisa da quantidade de memória que o SQL Server está usando, você precisa de uma ferramenta como o Process Explorer e identifica todos os processos do SQL Server. No servidor que estou mostrando à direita, há duas instâncias do SQL Server (mostradas por sqlservr.exe), mais as ferramentas de backup do SQL Agent, do SQL Browser e do SQL Server. Não é incomum ver também o SQL Server Analysis Services, o Integration Services e o Reporting Services também em execução no mesmo servidor - os quais consomem memória.

Então, quanta memória o SQL está usando? Eu vou facilitar as coisas para você. O SQL Server está usando toda a memória. Período."

Portanto, recomendo que você tente a consulta de Mark e use uma ferramenta melhor para o relatório de memória. Ou apenas confie no Perfmon para relatar memória, não no Gerenciador de tarefas.


-2

A quantidade de memória usada pelo SQL, conforme mostrado no gerenciador de tarefas, será principalmente a configuração de memória máxima. É assim que a configuração mínima / máxima funciona:

Quando o SQL server é iniciado, ele começa a levar a memória até a configuração de min-memory. À medida que suas necessidades SQL aumentam, o SQL começará a usar mais memória até a configuração de memória máxima. A memória permanece nesse ponto (máximo) mesmo quando o uso do SQL diminui. Isso dá a impressão de que o SQL executa grandes tarefas e consome muita memória. Na realidade, essa memória é reservada pelo SQL.

Quando houver pressão de memória não SQL no servidor, o SQL liberará a memória até o ponto de configuração da memória mínima. É assim que as configurações de memória são usadas. Você pode usar os scripts de Mark para ver como o SQL está usando essa memória.


1
Mín / Máx governa as alocações de buffer pool, nada mais. Esta é a primeira linha na descrição das Opções de memória do servidor no BOL. As configurações não têm absolutamente nenhuma relação com a exibida no gerenciador de tarefas. A descrição de Brent do taskmgr como "um mentiroso sujo e imundo" resume a situação e qualquer outra que eu tenha lido.
— Mark-Storey-Smith

@ MarkStorey-Smith, por favor, leia o conteúdo mais abaixo no link em seu próprio comentário, isso apenas explica meu ponto de vista. O gerenciador de tarefas mostra o uso dos recursos do sistema. O buffer pool não é um recurso do sistema. Estou explicando o que significa o uso de memória pelo SQL mostrado no gerenciador de tarefas. Você está afirmando o óbvio ao mencionar o buffer pool, mas isso ainda não prova que estou errado.
— precisa

Não tenho certeza da melhor maneira de colocar isso ... "A quantidade de memória usada pelo SQL, conforme mostrado no gerenciador de tarefas, será principalmente a configuração de memória máxima. É assim que a configuração de mínimo / máximo funciona" .. não, não é 't.
— Mark-Storey-Smith

'É assim que as configurações mín. / Máx. Funcionam:' Há dois pontos no final, o que significa que a explicação segue, não que ela afirme a frase anterior. :)
— StanleyJohns

1
Eu estou com Mark. Leia o blog Slava Oks : ele fazia parte da equipe da MS que escreveu o gerenciador de memória. Vá para o cabeçalho "buffer pool". Cito "Lembre-se de que o SQL Server possui duas configurações de memória que você pode controlar usando sp_conifigure. Elas são memória máxima e mínima do servidor. Não sei se você sabe, mas essas duas configurações realmente controlam o tamanho do buffer pool. Elas não controlam de maneira geral. quantidade de memória física consumida pelo SQL Server "
— gbn 22/10/11
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.