Cache de Dados

<Continuando o artigo Monitorando a memoria do SQL Server>

Antes de entender como o SQL Server gerencia seus recursos, vamos discutir uma questão relacionada ao papel da memória no servidor:

Qual a principal função da memória em um servidor de banco de dados?

Resp: A memória é usada para fazer cache de dados.

Essa área de cache é denominada Data Cache ou Buffer Pool.

 

Buffer Pool

Esse é um dos componentes chaves para compreender como monitorar a memória do servidor. É o Buffer Pool que define quanto de memória será utilizada pelo SQL Server. O objetivo dele é usar o máximo de memória possível sem afetar a performance do Sistema Operacional. Em outras palavras, há um balanceamento de memória entre o SQL Server e o Sistema Operacional.

Exemplo: Se eu tivesse um servidor com 64GB de memória RAM, esperaria que quase sua totalidade fosse utilizada para fazer cache de dados.

SQL Server tem um único objetivo: utilizar o máximo de memória disponível no servidor, desde que o Sistema Operacional esteja tranquilo.

Exemplo: No SQL Server 2000 rodando com Windows 2000, o gerenciamento de memória era feito da seguinte forma: SQL Server alocava toda a memória RAM e deixava o Sistema Operacional com exatamente 4MB (WOW! A primeira vez que li isso, quase cai da cadeira). Caso algum aplicativo precisasse de memória, começaria alocando parte dos 4MB, baixando a quantidade de memória livre para 3MB, 2MB,…. Durante esse mesmo período, o SQL Server detectava a diminuiçào de memória e devolveria parte da memória para o Windows. O objetivo era manter exatamente 4MB de memória livre.

A partir do Windows 2003, houve uma mudança na forma da quantidade de memória usada. SQL Server 2000/2005/2008 recebem notificações do próprio Sistema Operacional sobre o status da memória livre. Isso significa que o SQL Server aloca o máximo de memória para o Buffer Pool até o momento que chega uma notificação falando que a “memória do Sistema Operacional está baixa”.

(Nota: Essa notificação fica registrada na DMV sys.dm_os_ring_buffer disponível a partir do SQL 2005)

Outra coisa interessante aqui: quando falamos de aumento no uso de memória, estamos falando sobre o tamanho do Buffer Pool. A forma mais fácil de acompanhar esse crescimento é através da ferramenta Performance Monitor, através do contador:

  • SQL Server Buffer manager: Total Pages

image

Outra forma de acompanhar o tamanho do Buffer Pool é através da DMV sys.dm_os_sys_info e do comando DBCC MEMORYSTATUS.

 SELECT bpool_committed FROM sys.dm_os_sys_info

image

O comando DBCC MEMORYSTATUS está disponível desde o SQL 2000.

 DBCC MEMORYSTATUS

image

Foram 3 formas diferentes de obter o tamanho de 15520 páginas para o Buffer Pool. Considerando que cada página tem 8kb, então o meu SQL Server está usando aproximadamente 121MB para cache de dados (Data Cache).

No próximo post, comentarei sobre o evento de crescimento e diminuição do Buffer Pool, e como que eles estão relacionados com o contador chamado de Target Pages.