Partilhar via


MSSQLSERVER_17890

Aplica-se a: SQL Server

Detalhes

Atributo Valor
Nome do produto SQL Server
ID do evento 17890
Origem do Evento MSSQLSERVER
Componente SQLEngine
Nome simbólico SRV_WS_TRIMMED
Texto da mensagem Uma parte significativa da memória do processo do SQL Server foi paginada. Isso pode resultar em uma degradação do desempenho. Duração: %d segundos. Conjunto de trabalho (KB): %I64d, confirmado (KB): %I64d, utilização da memória: %d%%.

Explicação

Você pode encontrar a seguinte mensagem de erro no log de erros do SQL Server ou no log de eventos do aplicativo do Windows.

Uma parte significativa da memória do processo do SQL Server foi paginada. Isso pode resultar em uma degradação do desempenho. Duração: 0 segundos. Conjunto de trabalho (KB): 3383250, confirmado (KB): 9112480, utilização de memória: 37%.

Você também poderá observar uma degradação repentina do desempenho com a execução da consulta e todas as outras operações do SQL Server.

Causa

O SQL Server monitora as várias informações relacionadas a memórias sobre o processo do SQL Server. Nesse caso, ele detectou que o conjunto de trabalho do processo é inferior a 50% da memória do processo confirmada. Como resultado, esse aviso é impresso. As causas normais desse aviso são:

  • O sistema operacional pagina grandes partes da memória confirmada do SQL Server para o arquivo de paginação.
  • Isso pode ser devido a uma demanda repentinamente maior de memória de outros aplicativos ou devido às necessidades do sistema operacional.
  • Isso também pode ocorrer quando alguns drivers de dispositivo solicitam alocações de memória contígua para as necessidades deles.

Ação do usuário

Você pode impedir que o sistema operacional Windows pagine a memória do pool de buffers do processo do SQL Server bloqueando a memória alocada para o pool de buffers na memória física. Você bloqueia a memória atribuindo o direito de usuário Bloquear páginas na memória à conta de usuário usada como a conta de inicialização do serviço SQL Server. Porém, antes de implementar essa solução, examine as seções O que causa a paginação da memória do SQL Server e Considerações importantes antes de atribuir o direito de usuário "Bloquear páginas na memória" a uma instância do SQL Server

Observação

Usando Bloquear Páginas na Memória certifique-se de que a memória gerenciada pelo SQL Server não seja paginada. No entanto, as pilhas de threads, o EXE e quaisquer imagens DLL, memória heap, memória CLR ainda podem ser paginadas pelo sistema operacional.

A partir da Atualização Cumulativa 2 do SQL Server 2008 SP1, as edições Standard e Enterprise do SQL Server podem usar o direito de usuário Bloquear páginas na memória. Para obter mais informações sobre o suporte a páginas bloqueadas, veja KB970070 – Suporte para páginas bloqueadas em sistemas com o SQL Server Standard Edition (64 bits).

Para atribuir o direito de usuário Bloquear páginas na memória, siga estas etapas:

  1. Clique em Iniciar, em Executar, digite gpedit.msc e clique em OK.
  2. Observe que a caixa de diálogo Política de Grupo é exibida.
  3. Expanda Configuração do Computador e Configurações do Windows.
  4. Expanda Configurações de Segurançae então expanda Políticas Locais.
  5. Clique em Atribuição de Direitos de Usuário e clique duas vezes em Bloquear páginas na memória.
  6. Na caixa de diálogo Configuração de Política de Segurança Local, clique em Adicionar Usuário ou Grupo.
  7. Na caixa de diálogo Selecionar Usuários ou Grupos, adicione a conta que tem permissão para executar o arquivo Sqlservr.exe e clique em OK.
  8. Feche a caixa de diálogo Política de Grupo.
  9. Reinicie o serviço SQL Server.

Depois de atribuir o direito de usuário Bloquear páginas na memória e reiniciar o serviço SQL Server, o sistema operacional Windows não paginará mais a memória do pool de buffers no processo do SQL Server. No entanto, o sistema operacional Windows ainda pode paginar a memória do pool não buffer dentro do processo do SQL Server.

Você pode validar se o direito de usuário é usado pela instância do SQL Server certificando-se de que a seguinte mensagem seja gravada no Log de Erros do SQL Server na inicialização: "Usando páginas bloqueadas para o pool de buffers"

Essa mensagem só se aplica ao SQL Server. Para obter mais informações sobre essa mensagem no ERRORLOG, visite o seguinte: Preciso atribuir as páginas de bloqueio para o privilégio de memória no sistema local

Quando o sistema operacional Windows transferir a memória do pool sem buffer para o arquivo de paginação, você ainda poderá enfrentar problemas de desempenho. No entanto, as mensagens de erro mencionadas na seção "Explicação" não são registradas no log de erros do SQL Server.

O que causa a paginação da memória do SQL Server

Há três categorias amplas de problemas que podem causar isso:

  • Problemas relacionados ao aplicativo: todos os aplicativos juntos esgotaram a memória física disponível e o sistema operacional deve liberar alguma memória para novas solicitações de recursos do aplicativo. Normalmente, a abordagem aqui é encontrar quais aplicativos estão esgotando a memória e tomar as medidas necessárias para balancear a memória entre eles sem causar o esgotamento de RAM.
  • Problemas de driver de dispositivo: os drivers de dispositivo podem causar a paginação do conjunto de trabalho de todos os processos se o driver chamar uma função de alocação de memória incorretamente.
  • Problemas do sistema operacional

Abaixo, você poderá encontrar informações sobre cada uma dessas categorias

  • Problemas relacionados ao aplicativo: os aplicativos juntos podem consumir toda a RAM do sistema. Se forem feitas novas solicitações de memória, o sistema operacional tentará atender a elas e, se não houver memória livre, ele removerá o conjunto de trabalho de aplicativos em execução para atender às solicitações de memória. Nesses casos, você poderá observar uma queda significativa no conjunto de trabalho, para a maioria, se não todos os aplicativos. Para observar isso, colete o seguinte contador do Monitor de Desempenho de todos os aplicativos no sistema:

    • Objeto de desempenho: Processo
    • Contador: Conjunto de Trabalho

    Além disso, monitore o contador a seguir para correlacionar a quantidade de memória física disponível no sistema.

    • Objeto de desempenho: Memória
    • Contador: Memória disponível (MB)

    O comportamento típico que você poderá observar é a redução da Memória disponível para próximo a 0 MB e uma queda repentina dos contadores do Conjunto de Trabalho para a maioria dos processos (todos) no sistema. Se você observar esse comportamento, poderá precisar tomar medidas para reduzir o uso de memória no sistema, o que inclui, por exemplo, a redução da Memória Máxima do Servidor para o SQL Server.

    Os aplicativos também poderão usar o cache do sistema em excesso e poderão causar um grande crescimento do cache do sistema. Para responder ao crescimento do cache do sistema, o sistema pagina o conjunto de trabalho do processo do SQL Server ou de outros aplicativos. Se você tiver esse problema, use algumas funções de gerenciamento de memória no aplicativo. Essas funções controlam o espaço de cache do sistema que as operações de E/S de arquivo podem usar no aplicativo. Por exemplo, você pode usar as funções SetSystemFileCacheSize e GetSystemFileCacheSize para controlar o espaço de cache do sistema que as operações de E/S de arquivo podem usar.

    Você pode usar o objeto Desempenho de memória para ver os valores de vários contadores nesse objeto a fim de determinar se o conjunto de trabalho do cache do sistema usa muita memória. Por exemplo, você pode ver os contadores Bytes de Cache e Bytes Residentes de Cache do Sistema. Para obter mais informações sobre esse tópico, confira:

    Baixe e implante o "Serviço de Cache Dinâmico do Microsoft Windows" para controlar a memória consumida pelo cache do sistema.

  • Problemas de driver de dispositivo: se um driver de dispositivo usar a MmAllocateContiguousMemory função e se ele definir o valor do parâmetro HighestAcceptableAddress como menos de 4 gigabytes (GB), o sistema operacional Windows poderá paginar o conjunto de trabalho dos processos no sistema, incluindo o processo do SQL Server. Para resolver esse problema, entre em contato com o fornecedor do driver de dispositivo para obter atualizações de driver.

    Quando um driver de dispositivo tenta alocar a memória, o sistema operacional Windows pode transferir o conjunto de trabalho de outros aplicativos para um arquivo de paginação. Esse hotfix do Windows permite que você use o rastreamento de eventos para localizar o driver de dispositivo que está causando o problema. Para obter mais informações sobre o driver específico que está causando o comportamento de remoção do conjunto de trabalho, confira Como identificar os drivers que alocam a memória contígua.

  • Problemas do sistema operacional: para resolver os problemas conhecidos que fazem com que o sistema operacional Windows pagine o conjunto de trabalho do processo do SQL Server, aplique os hotfixes descritos nos seguintes artigos da Base de Dados de Conhecimento Microsoft.

    Observação

    Os hotfixes são cumulativos. Uma versão mais recente de um hotfix contém as versões anteriores dele.

Considerações importantes antes de atribuir o direito de usuário "Bloquear páginas na memória"

Você deve fazer considerações adicionais antes de atribuir o direito de usuário Bloquear páginas na memória. Se você atribuir esse direito de usuário em sistemas que estão configurados incorretamente, o sistema poderá ficar instável ou experimentar uma diminuição de desempenho no sistema inteiro. Além disso, a ID de evento 333 poderá ser registrada no log de eventos.

Se você entrar em contato com o CSS (Serviço de Atendimento ao Cliente) da Microsoft para esses problemas, os engenheiros de CSS poderão solicitar que você revogue esse direito de usuário para a conta de usuário usada como a conta de inicialização do serviço SQL Server. Essa etapa pode ser necessária para coletar dados de desempenho importantes que os engenheiros de CSS podem usar para a configuração necessária das várias opções do SQL Server e de outros aplicativos em execução no sistema. Depois que os engenheiros de CSS coletarem os dados de desempenho, você poderá atribuir o direito de usuário Bloquear páginas na memória à conta de inicialização do serviço SQL Server.

Antes de atribuir o direito de usuário Bloquear páginas na memória, capture um log do Monitor de Desempenho para determinar os requisitos de memória de vários aplicativos e serviços instalados no sistema. Esses aplicativos também incluem o SQL Server. Para determinar os requisitos de memória, colete as seguintes informações de linha de base:

  • Verifique se você definiu as opções max server memory e min server memory corretamente. Essas opções refletem apenas o requisito de memória do pool de buffers do processo do SQL Server. Essas opções não incluem a memória alocada para outros componentes no processo do SQL Server. Os componentes incluem o seguinte:

    • Os threads de trabalho do SQL Server
    • Várias DLLs e componentes que o processo do SQL Server carrega no espaço de endereço do processo do SQL Server
    • As operações de backup e restauração
  • As DLLs e os componentes incluem vários provedores OLE DB, procedimentos armazenados estendidos, objetos COM da Microsoft usados para o procedimento armazenado sp_OACreate, servidores vinculados e SQL Server CLR. A memória alocada para esses componentes se enquadra na região do pool de não buffers do espaço de endereço do processo do SQL Server. Para determinar idealmente a quantidade máxima de memória que todo o processo do SQL Server pode usar, você deve subtrair a memória alocada para componentes que não usam o pool de buffers da memória total que você deseja que o processo do SQL Server use. Em seguida, você poderá usar o valor restante para definir a opção max server memory. Antes de definir a opção max server memory e a opção min server memory, você deve examinar cuidadosamente o tópico "Definindo as opções de memória manualmente" nos Manuais Online do SQL Server.

  • Determine o requisito de memória de outros aplicativos e dos componentes do sistema operacional Windows. Os aplicativos podem incluir outros componentes do SQL Server, por exemplo, SQL Server Agent, SQL Server Replication Agents, SQL Server Reporting Services, SQL Server Analysis Services, SQL Server Integration Services e SQL Server Full Text Search. Os aplicativos que executam operações de backup e de cópia de arquivos podem usar muitas memórias. Considere as operações como cópia em massa e o Agente de Instantâneo que geram E/S de arquivo. Você precisará considerar o requisito de memória de todos esses aplicativos ao determinar o valor das opções max server memory e min server memory. Use os contadores Bytes Particulares e Conjunto de Trabalho no objeto de Processo de cada processo para determinar o requisito de memória de um processo específico.

  • Por padrão, o direito de usuário Bloquear páginas na memória já foi atribuído à conta interna Sistema Local. Para obter mais informações, visite o seguinte site da Microsoft: Preciso atribuir o privilégio Bloquear páginas na memória para o sistema local?

  • Se você usar uma conta de usuário do Windows globalmente para todos os processos do SQL Server em um domínio, determine os direitos de usuário atribuídos usando uma configuração de Diretiva de Grupo. Um processo do SQL Server de 32 bits pode usar essa conta como a conta de inicialização. No entanto, essa conta exige o direito de usuário Bloquear páginas na memória para habilitar o recurso AWE (Address Windowing Extensions). Para obter mais informações, consulte o tópico "Fornecendo a quantidade máxima de memória para o SQL Server" nos Manuais Online do SQL Server.

  • Antes de configurar a opção max server memory e a opção min server memory para várias instâncias do SQL Server, considere os requisitos de memória do pool não buffer para cada instância do SQL Server. Em seguida, configure essas opções para cada instância do SQL Server.

O ideal é que você colete essas informações de linha de base durante cargas de pico. Portanto, você pode determinar os requisitos de memória para vários aplicativos e componentes para dar suporte à carga de pico. Os requisitos de memória variam de um sistema para outro, dependendo das atividades e dos aplicativos em execução no sistema. Consulte as informações fornecidas na exibição de gerenciamento dinâmico sys.dm_os_process_memory para entender se o sistema está enfrentando condições de memória insuficiente. Para obter mais informações, confira sys.dm_os_process_memory (Transact-SQL).

Aprimoramentos adicionados ao Windows Server 2008 e versão R2

O Windows Server 2008 e o Windows Server 2008 R2 aprimoram o mecanismo de alocação de memória contígua. Esse aprimoramento permite que o Windows Server 2008 e o Windows Server 2008 R2 reduza, até certa medida, os efeitos da transferência do conjunto de trabalho de aplicativos para um arquivo de paginação quando novas solicitações de memória são recebidas.

Veja abaixo uma explicação dos aprimoramentos no white paper da Microsoft "Avanços no gerenciamento de memória no Windows":

No Windows Server 2008, a alocação de memória contígua fisicamente é muito aprimorada. As solicitações de alocação memória contígua apresentam muito mais probabilidade de serem bem sucedidas, porque o gerenciador de memória agora substitui dinamicamente as páginas, normalmente, sem remover o conjunto de trabalho nem executar operações de E/S. Além disso, muitos outros tipos de páginas, como pilhas de kernel e páginas de metadados do sistema de arquivos, entre outros, agora são candidatos para substituição. Como resultado, mais memória contígua fica em disponibilidade geral a qualquer momento especificado. Além disso, o custo de obtenção dessas alocações foi bastante reduzido.

Para obter mais informações, confira Problemas de remoção do conjunto de trabalho no SQL Server.

Os produtos de terceiros mencionados neste artigo são produzidos por empresas independentes da Microsoft. A Microsoft não oferece nenhuma garantia, implícita ou não, do desempenho ou da confiabilidade desses produtos.