Lock Pages in Memory


Quando um processo aloca memória, as chamadas são convertidas em comandos VirtualAllocEx() para o gerenciador de memória do Windows. Toda essa memória é denominada memória virtual, que pode ser alocada em Page file ou RAM. Além disso, o Sistema Operacional tem a liberdade de paginada a qualquer instante e de forma transparente ao processo.

Quando a memória virtual está presente em RAM, então dizemos que essa memória faz parte do Working Set do processo. Já discuti um pouco sobre esse assunto nos posts Shared Memory e Working Set. Do ponto de vista do SQL Server, queremos sempre que essa memória virtual utilize RAM ao invés de Pagefile.

Existem mecanismos do Windows que garantem 100% que a memória alocada seja memória RAM. Esses são:

  • VirtualLock
  • AWE
  • Large Pages

Qualquer uma dessas API pode ser usada pelo processo para garantir que a memória fique em RAM.

Do ponto de vista do Windows, alocar memória RAM é um risco de segurança: um processo mal-educado pode alocar toda a memória da máquina e deixar o Sistema Operacional instável.

Aqui entra o conceito de Lock Pages in Memory. O administrador pode decidir qual usuário/processo tem privilégio para alocar diretamente memória RAM, sem necessitar de Page File.

 

SQL Server e Lock Pages in Memory

SQL Server tira proveito do privilégio “Lock Pages in Memory” tanto na plataforma 32 ou 64 bits. Para configurá-lo, basta entrar no Local Security Policy (Run… secpol.msc), expandir a pasta "User Rights Assignments” e adicionar a conta de serviço do SQL Server ao privilégio “Lock Pages in Memory”.

 

image

Após adicionar esse privilégio, basta fazer um restart do serviço SQL e tudo já está configurado! A partir de agora, o SQL Server utiliza as API de AWE e Large Pages – o código do SQL, não faz uso do VirtualLock.

Específico do 64-bits: Após dar o privilégio de “Lock Pages in memory”, o SQL Server passa a alocar memória usando o mecanismo de AWE. Ao contrário do 32-bits, não é necessário usar o sp_configure para habilitar o AWE.

 

Vantagem

A vantagem imediata é que a memória alocada ficará 100% em RAM e não haverá problema de paginação em disco. Uma outra vantagem é que a memória AWE e Large Page não necessitam de Page File, uma vez que elas nunca serão paginadas.

 

Desvantagem

A memória alocada através da API de AWE e Large Pages não conta no Working Set do processo. Por isso, o Task Manager é incapaz de mostrar a quantidade correta de memória usada pelo SQL Server. O jeito é, portanto, usar o Performance Monitor para determinar a memória usada pelo SQL.

Veja o post Working Set.

 

Referências

Slava descreve como SQL Server tira proveito do privilégio Lock Pages in memory em seu blog.

Slava Oks -  Using Lock Pages In memory on 64 bit platform
http://blogs.msdn.com/b/slavao/archive/2005/08/31/458545.aspx

 

Windows apresenta funcionalidades de Address Windowing Extension (AWE) usado para ultrapassar a barreira de 3GB imposta pela plataforma 32-bits, mas que ainda está disponível em 64-bits.

MSDN – AllocateUserPhysicalPages API
http://msdn.microsoft.com/en-us/library/aa366528(v=VS.85).aspx

MSDN – Address Windowing Extension (AWE)
http://msdn.microsoft.com/en-us/library/aa366527(VS.85).aspx

 

A utilização de Large Page permite utilizar blocos maiores de memória RAM ao invés de páginas de 4kb. Isso diminui o overhead de mapeamento de memória e custo em Page Table Entries. Para utilizar essa funcionalidade, basta chamar a API VirtualAllocEX com o parâmetro MEM_LARGE_PAGES.

MSDN – Large Page Support
http://msdn.microsoft.com/en-us/library/aa366720(VS.85).aspx

MSDN – VirtualAllocEx API
http://msdn.microsoft.com/en-us/library/aa366890(VS.85).aspx

 

Apesar de não ser utilizada pelo SQL Server, o VirtualLock garante que a memória virtual não seja paginada.

MSDN – VirtualLock API
http://msdn.microsoft.com/en-us/library/aa366895(VS.85).aspx


Comments (2)

  1. Felipe disse:

    Fabricio,

    Algumas dúvidas simples, para o processo do SQL Server utilizar o recurso de Lock pages in memory é preciso habilitar o AWE sempre? ou posso habilitar o Lock Pages in memory sem habilitar o AWE?

    Se por exemplo o servidor tem apenas 4GB de memória RAM, habilitando o AWE e o Lock pages in memory terá efeito, ou apenas quando a memória começar a alocar acima de 4GB ?

    Obrigado.

  2. Oi Felipe!

    Lock Pages é um privilégio do Windows dado a conta de serviço do SQL Server. Veja a figura do Local Security Policy (nesse mesmo blog post), que é onde se determina quem tem privilégio ou não. Isso tudo é um pré-requisito para a possível utilização (ou não) do AWE.

    Agora, falando sobre AWE, este será utilizado somente em servidores com mais de 4GB.

    Abraços, Fabricio

Skip to main content