DBCC MEMORYSTATUS (Parte I)

Esse comando DBCC MEMORYSTATUS sempre foi muito útil para investigar o consumo de memória no SQL Server. No tempo do SQL 2000, era impossível determinar a distribuição de memória sem o auxílio desse comando não-documentado. A partir do SQL 2005, algumas informações podem ser encontradas em DMV’s.

Esse post mostra como acompanhar a visão do SQL Server em relação ao ambiente externo (Sistema Operacional e outros processos).

O gerenciador de memória (Memory Manager) pode alocar memória virtual através de uma API denominada VirtualAlloc(). Nessa API, o espaço de memória é previamente reservado e depois “comitado”.

 Memory Manager                           KB          
---------------------------------------- ----------- 
VM Reserved                                 67639392 
VM Committed                                  505752 
Locked Pages Allocated                      59652352 
Reserved Memory                                 1024 
Reserved Memory In Use                             0 

No exemplo acima, observamos que o SQL Server reservou um espaço de aproximadamente 67GB (67639392 kb), representado por VM Reserved. A quantidade máxima de memória reservada é de 7TB para a plataforma 64-bits, ou seja, não há grande preocupação. Se o servidor é de 32-bits, então esse limite é de apenas 2GB.

O próximo passo é investigar a quantidade de memória “comitada” (VM Committed). Essa é a quantidade de memória utilizada pelo SQL Server ainda usando a API VirtualAlloc(). Essa memória pode ser paginada para disco (Pagefile) a qualquer momento. O exemplo apresenta 505MB (505752 kb) utilizados pelo SQL Server, valor muito próximo ao que será reportado pelo Task Manager.

Observamos a memória alocada através de Locked Pages e AWE, que corresponde a aproximadamente 59GB (59652352 kb) – Locked Pages Allocated. Essa memória nunca será paginada. Para que o SQL Server tenha permissão para utilizar essa memória, necessita-se do privilégio Locked Pages in Memory.

Por fim, o SQL Server deixa alocado 1MB de memória em caso de emergência (Reserved Memory). Por exemplo, uma situação crítica durante uma operação de ROLLBACK ocorre quando há falta de memória no servidor e nenhuma memória pode ser alocada. Para garantir que as estruturas mínimas sejam registradas no banco de dados, o banco de dados pode utilizar temporariamente Reserved Memory. (Felizmente) Nunca vi essa situação ocorrer.