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

typefragger
fonte
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.

Mark Storey-Smith
fonte
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.

Marian
fonte
-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.

StanleyJohns
fonte
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