Com que rapidez o SQL Server libera RAM quando o sistema operacional sinaliza uma condição de pouca memória?

5

Nos Manuais Online do SQL Server 2008 R2:

Server Memory Options

When SQL Server is using memory dynamically, it queries the system periodically to determine the amount of free physical memory. SQL Server uses the memory notification API QueryMemoryResourceNotification to determine when the buffer pool may allocate memory and release memory.

Nos Manuais Online do SQL Server 2005/2008:

Server Memory Options

When SQL Server is using memory dynamically, it queries the system periodically to determine the amount of free physical memory. Under Microsoft Windows 2000, SQL Server grows or shrinks the buffer cache to keep free physical memory between 4 MB and 10 MB depending on server activity. Maintaining this free memory prevents Windows 2000 from paging. If there is less memory free, SQL Server releases memory to Windows 2000.

Under Windows Server 2003, SQL Server uses the memory notification API QueryMemoryResourceNotification to determine when the buffer pool may allocate memory and release memory.

Eu entendo que o SQL Server gerencia seu próprio uso de memória. Se o servidor ficar com pouca memória livre, o SQL Server libera alguma memória (morrendo de fome). Esse é o comportamento padrão, ideal e preferencial. Mas eu vi muitas situações em que o SQL Server não está liberando memória quando há outros aplicativos famintos (isto é, sofrendo de grandes quantidades de falhas de paginação).

Então eu descobri que pode levar dias para o SQL Server liberar memória:

Professional Microsoft SQL Server 2008 Administration, Memory Usage

enter image description here

SQL Server is one of the best behaved server applications available. When the operating system triggers the low memory notification event, SQL will release memory for other application to use, actually starving itself of memory if another memory-greedy application is running on the machine. The good news is that SQL will only release a small amount of memory at a time, so it may take hours, and even days, before SQL will start to suffer. Unfortunately, if the other application desperately needs more memory, it can take hours before SQL frees up enough memory for the other application to run without excessive paging.

Isso soa certo? SQL Server é um aplicativo de servidor bem comportado que irá paralisar um servidor por dias? Existe uma opção (além de definir um limite superior no uso de memória do SQL Server) para acelerar a taxa na qual o SQL libera a memória?

    
por Ian Boyd 14.03.2012 / 21:02

2 respostas

2

Primeiro, entenda como funciona a memória do Windows (consulte Como sei se meu servidor Windows está trocando? ).

Agora que sabemos que a paginação não é tão ruim, o SQL Server não libera a memória com rapidez suficiente para outros aplicativos no Windows que tenham grandes picos de memória satisfeitos no que consideramos uma quantidade razoável de tempo.

Não vai demorar "dias", levaria dias para SQL sofrer; não o outro aplicativo. É o outro aplicativo que levará horas para obter páginas livres suficientes na memória para executar em uma taxa aceitável (presumindo uma solicitação de página de memória grande).

Em geral, se outros aplicativos precisarem existir em uma máquina com o SQL Server, a melhor prática é definir os limites de memória do SQL se o outro aplicativo tiver variações na demanda de memória.

Eu adoro a citação sobre o SQL Server ser "bem-comportado" . É, de fato, bem comportado; leva apenas uma eternidade (relativamente falando) para fazê-lo.

    
por 14.03.2012 / 22:41
0

Existem dois tipos de memória em uso pelo SQL Server que podem ser liberados:

  • páginas de dados (buffer pool)
  • caches

Enquanto a situação de pouca memória estiver sendo sinalizada, ambas serão eliminadas agressivamente.

Os caches estão descritos em Perguntas e respostas : Clock Hands - para que servem?
O mecanismo buffer pool é descrito em Gerenciamento de buffer

  • Caches podem ser cortados desde que não estejam em uso.
  • As páginas limpas do conjunto de buffers podem ser cortadas imediatamente (as páginas sujas precisam ser liberadas primeiro no disco)

Em resumo, o SQL Server pode liberar toda a memória que pode ser liberada imediatamente (páginas limpas, caches liberados) em questão de segundos. Páginas sujas podem ser liberadas assim que o IO flush for concluído. Eu não tenho ideia de onde a ideia de "leva dias" veio de ...

    
por 18.03.2012 / 01:57