Compartilhar via


Opções de configuração de memória do servidor

Aplica-se a:SQL Server

A utilização de memória para o Mecanismo de Banco de Dados do SQL Server é limitada por um par de configurações min server memory (MB) e max server memory (MB). Ao longo do tempo e em circunstâncias normais, o SQL Server tentará solicitar memória até o limite definido por max server memory (MB).

Observação

Índices columnstore: visão geral e In-Memory os objetos de visão geral e de uso do OLTP têm seus próprios funcionários de memória, o que facilita o monitoramento do uso do pool de buffers. Para obter mais informações, confira sys.dm_os_memory_clerks.

Em versões mais antigas do SQL Server, a utilização de memória era virtualmente ilimitada, indicando ao SQL Server que toda a memória do sistema estava disponível para uso. É recomendável em todas as versões do SQL Server configurar um limite superior para a utilização de memória do SQL Server configurando o max server memory (MB).

  • Desde o SQL Server 2019 (15.x), a Configuração de SQL em servidores Windows fornece uma recomendação para max server memory (MB) para uma instância autônoma do SQL Server com base em uma porcentagem da memória do sistema disponível no momento da instalação.
  • A qualquer momento, você pode reconfigurar os limites de memória (em megabytes) para um processo do SQL Server usado por uma instância do SQL Server por meio das opções de configuração min server memory (MB) e max server memory (MB).

Observação

Este guia se refere à instância do SQL Server no Windows. Para obter informações sobre a configuração de memória no Linux, confira Melhores práticas de desempenho e diretrizes de configuração para o SQL Server no Linux e Configuração memory.memorylimitmb.

Recomendações

As configurações padrão e os valores mínimos permitidos para essas opções são:

Opção Padrão Mínimo permitido Recomendadas
min server memory (MB) 0 0 0
max server memory (MB) 2\.147.483.647 megabytes (MB) 128 MB 75% da memória do sistema disponível não consumida por outros processos, incluindo outras instâncias. Para obter recomendações mais detalhadas, confira memória máxima do servidor.

Com esses limites, o SQL Server pode alterar seus requisitos de memória dinamicamente com base nos recursos do sistema disponíveis. Para obter mais informações, consulte Gerenciamento de memória dinâmica.

  • Definir max server memory (MB) o valor muito alto pode fazer com que uma única instância do SQL Server concorra à memória com outras instâncias do SQL Server hospedadas no mesmo host.
  • No entanto, a configuração max server memory (MB) muito baixa é uma oportunidade de desempenho perdida e pode causar problemas de desempenho e pressão de memória na instância do SQL Server.
  • A configuração max server memory (MB) para o valor mínimo pode até mesmo impedir que o SQL Server seja iniciado. Se você não puder iniciar o SQL Server depois de alterar essa opção, inicie-a usando a opção -f de inicialização e redefina max server memory (MB) para o valor anterior. Para obter mais informações, consulte Opções de inicialização do serviço Mecanismo de Banco de Dados.
  • Não é recomendável definir max server memory (MB) e min server memory (MB) ser o mesmo valor ou próximo dos mesmos valores.

Observação

A opção de memória máxima do servidor limita apenas o tamanho do pool de buffers do SQL Server. A opção de memória máxima do servidor não limita uma área de memória não reservada restante que o SQL Server deixa para alocações de outros componentes, como procedimentos armazenados estendidos, objetos COM, DLLs não compartilhadas e EXEs.

O SQL Server pode usar a memória dinamicamente. No entanto, você pode definir as opções de memória manualmente e restringir a quantidade de memória que o SQL Server pode acessar. Antes de definir a quantidade de memória para o SQL Server, determine a configuração de memória apropriada subtraindo, a partir da memória física total, a memória necessária para o sistema operacional (SO), alocações de memória não controladas pela max server memory (MB) configuração e quaisquer outras instâncias do SQL Server (e outros usos do sistema, se o servidor estiver em casa para outros aplicativos que consomem memória, incluindo outras instâncias do SQL Server). Essa diferença é a quantidade máxima de memória que você pode atribuir à instância SQL Server atual.

A memória pode ser configurada até o limite de espaço do endereço virtual do processo em todas as edições do SQL Server. Para obter mais informações, consulte Limites de memória para as versões do Windows e do Windows Server.

Memória mínima do servidor

Use min server memory (MB) para garantir uma quantidade mínima de memória disponível para o GERENCIADOr de Memória do SQL Server.

  • O SQL Server não alocará imediatamente a quantidade de memória especificada no min server memory (MB) durante a inicialização. No entanto, depois que o uso de memória atingir esse valor devido à carga do cliente, o SQL Server não poderá liberar memória, a menos que o valor seja min server memory (MB) reduzido. Por exemplo, quando várias instâncias do SQL Server são instaladas simultaneamente no mesmo servidor, considere definir o min server memory (MB) parâmetro para reservar memória para uma instância.

  • Definir um valor para min server memory (MB) é essencial em um ambiente virtualizado para garantir que a pressão de memória do host subjacente não tente desalocar memória do pool de buffers em uma máquina virtual do hóspede além do necessário para garantir um desempenho aceitável. O ideal é que instâncias do SQL Server em uma máquina virtual não precisem competir com os processos de desalocação de memória proativos do host virtual.

  • O SQL Server não tem garantia de alocar a quantidade de memória especificada em min server memory (MB). Se a carga no servidor nunca exigir a alocação da quantidade de memória especificada, min server memory (MB)o SQL Server usará menos memória.

Memória máxima do servidor

Use max server memory (MB) para garantir que o sistema operacional e outros aplicativos não experimentem uma pressão de memória prejudicial proveniente do SQL Server.

  • Antes de definir a configuração, monitore o max server memory (MB) consumo geral de memória do servidor que hospeda a instância do SQL Server, durante a operação normal, para determinar a disponibilidade e os requisitos de memória. Para uma configuração inicial ou quando não houve oportunidade de coletar o uso de memória do processo do SQL Server ao longo do tempo, use a seguinte abordagem generalizada de práticas recomendadas para configurar max server memory (MB) para uma única instância:
    • Na memória total do sistema operacional, subtraia o equivalente a possíveis alocações de memória de thread do SQL Server fora do controle de max server memory (MB), que é o tamanho da pilha1 multiplicado pelo máximo de threads de trabalho calculado2.
    • Em seguida, subtraia 25% para outras alocações de memória fora do controle de max server memory (MB), como buffers de backup, DLLs de procedimentos armazenados estendidos, objetos criados usando procedimentos de Automação (chamadas de sp_OA) e alocações de provedores de servidores vinculados. Essa é uma aproximação genérica e sua quilometragem pode variar.
    • O que resta deve ser a max server memory (MB) configuração para uma instalação de instância única.

1 Consulte o Guia de arquitetura de gerenciamento de memória para obter informações sobre os tamanhos de pilha de thread por arquitetura.

2 Para mais informações sobre os threads de trabalho padrão calculados para um determinado número de CPUs com afinidade no host atual, consulte a configuração do servidor: número máximo de threads de trabalho.

Definir opções manualmente

As opções min server memory (MB) do servidor e max server memory (MB) podem ser definidas para abranger um intervalo de valores de memória. Esse método é útil para os administradores de bancos de dados ou de sistemas configurarem uma instância do SQL Server com os requisitos de memória de outros aplicativos ou de outras instâncias do SQL Server executadas no mesmo host.

Usar o Transact-SQL

As min server memory (MB) opções e opções max server memory (MB) são opções avançadas. Ao usar o procedimento armazenado do sistema sp_configure para alterar essas configurações, você poderá alterá-las apenas quando mostrar opções avançadas estiver definido como 1. Essas configurações entram em vigor imediatamente sem a reinicialização do servidor. Para obter mais informações, confira sp_configure.

O exemplo a seguir define a opção max server memory (MB) como 12.288 MB ou 12 GB. Embora sp_configure especifique o nome da opção como max server memory (MB), você pode omitir o (MB).

EXECUTE sp_configure 'show advanced options', 1;
GO

RECONFIGURE;
GO

EXECUTE sp_configure 'max server memory', 12288;
GO

RECONFIGURE;
GO

A consulta a seguir retorna informações sobre os valores configurados atualmente e o valor em uso no momento. Essa consulta retorna resultados independentemente de a opção sp_configure “mostrar opções avançadas” estar habilitada.

SELECT [name],
       [value],
       [value_in_use]
FROM sys.configurations
WHERE [name] = 'max server memory (MB)'
      OR [name] = 'min server memory (MB)';

Use SQL Server Management Studio.

Use min server memory (MB) e max server memory (MB) para reconfigurar a quantidade de memória (em megabytes) gerenciada pelo Memory Manager do SQL Server para uma instância do SQL Server.

  1. No Pesquisador de Objetos, clique com o botão direito do mouse em um servidor e selecione Propriedades.

  2. Selecione a página Memória da janela Propriedades do Servidor. Os valores atuais de Memória mínima do servidor e Memória máxima do servidor são exibidos.

  3. Nas Opções de memória do servidor, insira os números desejados para Memória mínima do servidor e Memória máxima do servidor. Para obter recomendações, confira memória mínima do servidor (MB) e memória máxima do servidor (MB) neste artigo.

A seguinte captura de tela demonstra as três etapas:

Captura de tela das opções de configuração da memória no SSMS.

LPIM (Bloquear páginas na memória)

Os aplicativos baseados no Windows podem usar as APIs do AWE (Address Windowing Extensions) do Windows a fim de alocar e mapear a memória física para o espaço de endereço do processo. A política LPIM do Windows determina as contas que podem acessar a API para manter os dados na memória física, impedindo o sistema de paginar os dados para a memória virtual em disco. A memória alocada por meio do AWE é bloqueada até que o aplicativo a libere ou seja encerrado explicitamente. O uso das APIs do AWE para o gerenciamento de memória no SQL Server de 64 bits também é frequentemente chamado de páginas bloqueadas. O bloqueio de páginas na memória pode manter a resposta do servidor quando ocorre paginação de memória no disco. A opção Bloquear páginas na memória ficará habilitada nas instâncias do SQL Server Standard Edition e superior quando a conta com privilégios para executar sqlservr.exe tiver recebido o direito de usuário Bloquear páginas na memória (LPIM) do Windows.

Para desabilitar a opção Bloquear páginas na memória do SQL Server, remova o direito de usuário Bloquear páginas na memória da conta com privilégios para executar a conta de inicialização sqlservr.exe (a conta de inicialização do SQL Server).

O uso do LPIM não afeta o gerenciamento de memória dinâmica do SQL Server, permitindo que ele seja expandido ou reduzido mediante a solicitação de outros administradores de memória. Ao usar o direito de usuário bloquear páginas na memória, é altamente recomendável definir um limite superior para max server memory (MB). Para obter mais informações, confira memória máxima do servidor (MB).

LPIM deve ser usado quando houver sinais de que o processo sqlservr está sendo paginado. Nesse caso, o erro 17890 será relatado no Errorlog, semelhante ao exemplo abaixo:

A significant part of sql server process memory has been paged out. This may result in a performance degradation. Duration: #### seconds. Working set (KB): ####, committed (KB): ####, memory utilization: ##%.

O uso de LPIM com uma configuração max server memory (MB) incorretamente ajustada, que não leva em consideração outros consumidores de memória no sistema, pode causar instabilidade, dependendo da quantidade de memória exigida por outros processos ou dos requisitos de memória do SQL Server fora do escopo de max server memory (MB). Para obter mais informações, confira memória máxima do servidor. Se o privilégio LPIM (Bloquear páginas na memória ) for concedido (em sistemas de 32 bits ou 64 bits), recomendamos que você defina max server memory (MB) como um valor específico, em vez de deixar o padrão de 2.147.483.647 megabytes (MB).

Observação

A partir do SQL Server 2012 (11.x), o sinalizador de rastreamento 845 não é necessário para que o Standard Edition use páginas bloqueadas.

Habilitar Bloquear páginas na memória

Depois de considerar as informações anteriores, para habilitar a opção Bloquear páginas na memória concedendo o privilégio à conta de serviço para a instância do SQL Server, consulte Habilitar a opção Bloquear páginas na memória (Windows).

Para determinar a conta de serviço para a instância do SQL Server, consulte o SQL Server Configuration Manager ou consulte o service_account de sys.dm_server_services. Para obter mais informações, confira sys.dm_server_services.

Exibir o status de Bloquear páginas na memória

Para determinar se o privilégio de Bloquear páginas na memória foi concedido à conta de serviço da instância do SQL Server, use a consulta a seguir. Essa consulta tem suporte no SQL Server 2016 (13.x) SP1 e posterior.

SELECT sql_memory_model_desc FROM sys.dm_os_sys_info;

Os seguintes valores de sql_memory_model_desc indicam o status do LPIM:

  • CONVENTIONAL. O privilégio de Bloquear páginas na memória não foi concedido.
  • LOCK_PAGES. O privilégio de Bloquear páginas na memória foi concedido.
  • LARGE_PAGES. O privilégio de bloqueio de páginas na memória é concedido no modo Enterprise com o flag de rastreamento 834 habilitado. Essa é uma configuração avançada e não recomendada para a maioria dos ambientes. Para obter mais informações e advertências importantes, consulte o sinalizador de rastreamento 834.

Use os seguintes métodos para determinar se a instância do SQL Server está usando páginas bloqueadas:

  • A saída da seguinte consulta Transact-SQL indica valores diferentes de zero para locked_page_allocations_kb:

    SELECT osn.node_id,
           osn.memory_node_id,
           osn.node_state_desc,
           omn.locked_page_allocations_kb
    FROM sys.dm_os_memory_nodes AS omn
         INNER JOIN sys.dm_os_nodes AS osn
             ON (omn.memory_node_id = osn.memory_node_id)
    WHERE osn.node_state_desc <> 'ONLINE DAC';
    
  • O log de erros atual do SQL Server relata a mensagem Using locked pages in the memory manager durante a inicialização do servidor.

  • A seção Gerenciador de Memória da saída DBCC MEMORYSTATUS mostra um valor diferente de zero para o item AWE Allocated.

Várias instâncias do SQL Server

Quando você está executando várias instâncias do Mecanismo de Banco de Dados, há diferentes métodos que você pode usar para gerenciar a memória:

  • Use max server memory (MB) em cada instância para controlar o uso da memória, conforme detalhado anteriormente. Defina configurações máximas para cada instância, tomando cuidado para que a permissão total não seja maior que a memória física total de sua máquina. É recomendável que cada instância de memória seja proporcional à sua carga de trabalho ou tamanho de banco de dados esperado. Esse método tem a vantagem de que, quando novos processos ou instância forem iniciados, a memória livre estará disponível para eles imediatamente. A desvantagem é que se você não estiver executando todas as instâncias, nenhuma das instâncias executadas poderá utilizar a memória livre restante.

  • Use min server memory (MB) em cada instância para controlar o uso da memória, conforme detalhado anteriormente. Defina as configurações mínimas de cada instância, de forma que a soma desses mínimos seja entre 1 a 2 GB menor do que a memória física total de sua máquina. Novamente, você pode definir esses mínimos proporcionalmente à carga esperada para a instância. Esse método tem a vantagem de que, se nem todas as instâncias estiverem sendo executadas ao mesmo tempo, as que estiverem sendo executadas poderão usar a memória livre restante. Esse método também é útil quando há outro processo de uso intensivo da memória no computador, de forma que será assegurado que o SQL Server tenha pelo menos uma quantidade razoável de memória. A desvantagem é que quando uma nova instância (ou qualquer outro processo) for iniciada, pode levar algum tempo para que as instâncias liberem memória, principalmente se for necessário gravar páginas modificadas de volta nos respectivos bancos de dados para fazer isso.

  • Use ambos max server memory (MB) e min server memory (MB) em cada instância para controlar o uso de memória, observando e ajustando a utilização máxima de cada instância e a proteção mínima de memória em uma ampla gama de níveis potenciais de utilização de memória.

  • Não fazer nada (não recomendado). As primeiras instâncias apresentadas com uma carga de trabalho tendem a alocar toda a memória. Instâncias inativas ou instâncias iniciadas posteriormente poderão acabar com apenas uma quantidade mínima de memória disponível. SQL Server não tenta equilibrar o uso de memória em instâncias. No entanto, todas as instâncias responderão aos sinais de Notificação de Memória do Windows para ajustar o tamanho de sua superfície de memória. O Windows não balanceia a memória entre aplicativos com a API de Notificação de Memória. Ele simplesmente fornece um feedback global da disponibilidade da memória no sistema.

É possível alterar essas configurações sem reinicializar as instâncias, para que você possa testar facilmente para encontrar as melhores configurações para seu padrão de uso.

Exemplos

a. Definir a opção de memória máxima do servidor como 4 GB

O exemplo a seguir define a opção max server memory (MB) como 4.096 MB ou 4 GB. Embora sp_configure especifique o nome da opção como max server memory (MB), você pode omitir o (MB).

EXECUTE sp_configure 'show advanced options', 1;
GO

RECONFIGURE;
GO

EXECUTE sp_configure 'max server memory', 4096;
GO

RECONFIGURE;
GO

Isso gerará uma instrução semelhante a Configuration option 'max server memory (MB)' changed from 2147483647 to 4096. Run the RECONFIGURE statement to install.. O novo limite de memória entrará em vigor imediatamente após a execução de RECONFIGURE. Para obter mais informações, confira sp_configure.

B. Determinar a alocação de memória atual

A instrução a seguir retorna informações sobre a memória alocada atualmente.

SELECT physical_memory_in_use_kb / 1024 AS sql_physical_memory_in_use_MB,
       large_page_allocations_kb / 1024 AS sql_large_page_allocations_MB,
       locked_page_allocations_kb / 1024 AS sql_locked_page_allocations_MB,
       virtual_address_space_reserved_kb / 1024 AS sql_VAS_reserved_MB,
       virtual_address_space_committed_kb / 1024 AS sql_VAS_committed_MB,
       virtual_address_space_available_kb / 1024 AS sql_VAS_available_MB,
       page_fault_count AS sql_page_fault_count,
       memory_utilization_percentage AS sql_memory_utilization_percentage,
       process_physical_memory_low AS sql_process_physical_memory_low,
       process_virtual_memory_low AS sql_process_virtual_memory_low
FROM sys.dm_os_process_memory;

C. Exibir o valor de max server memory (MB)

A consulta a seguir retorna informações sobre o valor configurado atualmente e o valor em uso. Essa consulta retorna resultados independentemente de a opção sp_configure “mostrar opções avançadas” estar habilitada.

SELECT [value], [value_in_use]
FROM sys.configurations
WHERE [name] = 'max server memory (MB)';