DBCC FREEPROCCACHE nem DBCC FREESYSTEMCACHE ('Planos SQL') fazem nada para liberar memória CACHESTORE_SQLCP


13

O CACHESTORE_SQLCP Sql Plans ocupa> 38 GB depois de alguns dias.

Já estamos executando a opção "otimizar para cargas de trabalho ad hoc" ativada. (O Entity Framework e os relatórios personalizados criam muitos ad hocs!)

SQL Server 2016 SE 3.00.2164.0.v1 no AWS RDS com espelhamento multi-AZ

Quando eu corro:

DBCC FREESYSTEMCACHE('SQL Plans');

ou

DBCC FREEPROCCACHE

ou

DBCC FREESYSTEMCACHE ('SQL Plans') WITH MARK_IN_USE_FOR_REMOVAL

ou

DBCC FREESYSTEMCACHE ('ALL') WITH MARK_IN_USE_FOR_REMOVAL;

Não parece esclarecer:

SELECT TOP 1 type, name, pages_kb FROM sys.dm_os_memory_clerks ORDER BY pages_kb  desc

type                name        pages_kb
CACHESTORE_SQLCP    SQL Plans   38321048

Eu estava executando com o Query Store ativado, mas o desativei para ver se isso estava interferindo em alguma coisa, não parecia ajudar, mas o deixei de fora.

O que é realmente estranho também é

SELECT COUNT(*) FROM sys.dm_exec_cached_plans

é 1-3 ou mais (parece mostrar apenas as consultas em execução no momento), embora toda essa memória esteja reservada, mesmo antes de eu tentar limpar alguma coisa. o que estou perdendo?

CACHESTORE_SQLCP está ocupando mais de 60% de toda a memória disponível, o que é uma preocupação, porque há esperas de memória acontecendo ocasionalmente. Além disso, tivemos que interromper um DBCC CHECKDB de rotina no fim de semana que durava 4 horas porque a memória insuficiente estava acumulando esperas (ela foi concluída instantaneamente sem erros com PHYSICAL_ONLY ativado).

Existe alguma maneira de recuperar essa memória (além de reinicializações noturnas !?)?

Gráfico de consumo de memória Gráfico de consumo de memória

Atualização de comentários / respostas

Quando eu corro

SELECT * FROM sys.fn_my_permissions(NULL,NULL)

eu recebo

entity_name subentity_name  permission_name
server      CONNECT SQL
server      CREATE ANY DATABASE
server      ALTER ANY LOGIN
server      ALTER ANY LINKED SERVER
server      ALTER ANY CONNECTION
server      ALTER TRACE
server      VIEW ANY DATABASE
server      VIEW ANY DEFINITION
server      VIEW SERVER STATE
server      ALTER SERVER STATE
server      CREATE SERVER ROLE
server      ALTER ANY SERVER ROLE

O que inclui a ALTER SERVER STATEpermissão necessária .

A saída de DBCC FREEPROCCACHEé

Execução do DBCC concluída. Se o DBCC imprimiu mensagens de erro, entre em contato com o administrador do sistema.

Qual é a mensagem padrão. Outras funções DBCC às quais o RDS não oferece suporte fornecem mensagens de erro sobre permissões.

(Um dia depois e depois de executá-lo novamente, o SQL Plans ainda está com 38.321.280 kb)

Atualização de comentários / respostas

SELECT pool_id, name, cache_memory_kb, compile_memory_kb FROM sys.dm_resource_governor_resource_pools

saídas:

pool_id name    cache_memory_kb  compile_memory_kb
1   internal    38368408         1168080

DBCC FREEPROCCACHE ('internal') não faz nada diferente

Atualizar

O log de erros do SQL registra o seguinte sempre:

2017-10-19 14:26:47.22 spid85 SQL Server has encountered 1 occurrence(s) of cachestore flush for the 'Object Plans' cachestore (part of plan cache) due to 'DBCC FREEPROCCACHE' or 'DBCC FREESYSTEMCACHE' operations.

2017-10-19 14:26:47.22 spid85 SQL Server has encountered 1 occurrence(s) of cachestore flush for the 'SQL Plans' cachestore (part of plan cache) due to 'DBCC FREEPROCCACHE' or 'DBCC FREESYSTEMCACHE' operations.

2017-10-19 14:26:47.22 spid85 SQL Server has encountered 1 occurrence(s) of cachestore flush for the 'Bound Trees' cachestore (part of plan cache) due to 'DBCC FREEPROCCACHE' or 'DBCC FREESYSTEMCACHE' operations.

Atualizar

Há uma atualização de versão do mecanismo no RDS de 13.00.2164.0.v1 para 13.00.4422.0.v1 disponível. Embora esteja definido para atualização de versão secundária automática, ele não parece nos manter atualizados com as últimas. Será reiniciado e instalado no final de semana para ver se isso ajuda.

Respostas:


5

Atualizei para 13.00.4422.0.v1 (SQL Server 2016 SP1) e reiniciei.

Até agora, eu sou capaz de limpar a memória do Plano SQL usando o DBCC FREESYSTEMCACHE('SQL Plans');comando!

O tempo dirá para ver se ele usa a memória um pouco mais sábia agora, mas pelo menos agora eu tenho uma maneira de redefini-la se ela ficar muito inchada novamente.


1
Ainda eu não iria sugerir a SQLCP frequentemente clara e ir em frente e descobrir a causa raiz
shanky

O Entity Framework e um recurso de relatório personalizado que permite que quase qualquer usuário execute quase qualquer consulta, de certa forma, cria muitas consultas ad-hoc. Se houvesse uma maneira de purificá-las ou até mesmo dizer a elas para nunca serem armazenadas em cache, isso pode ajudar. Até agora, o cache do plano ficou em torno de 5,8 GB desde a instalação do SP1.
Professional Sounding Name

Você ativou Optimize for Ad-Hoc Workload. Em comparação com a 38G, se estiver usando 5 GI, acredito que isso não seria motivo de preocupação, considerando a carga de trabalho
shanky

Sim, a opção Otimizar para carga de trabalho ad-hoc está definida (como diz acima na pergunta)
Professional Sounding Name

1
Vimos esse mesmo problema em 13.0.4001.0. Teve que devolver o SQL para limpar o cache de proc. Nada estava sendo compilado, mas o cache do proc estava 'travado' e não era limpo, independentemente do que tentássemos. Não vejo isso acontecer novamente desde o retorno do SQL, mas pergunto-me se há algum tipo de vazamento ou erro de memória.
GoodwinSQL 25/10

3

Exigências

Para executar DBCC FREEPROCCACHEou DBCC FREESYSTEMCACHEsua conta requer a permissão ALTER SERVER STATE.

Referências

Governador de Recursos

O AWS RDS permite configurações do administrador de recursos? Se sim, então a sintaxe é:

DBCC FREEPROCCACHE ('<pool_name>'). 

Descubra se você tem piscinas com:

SELECT * FROM sys.dm_resource_governor_resource_pools

Verificando permissões

Execute o seguinte comando para determinar se você possui essas permissões:

SELECT * FROM sys.fn_my_permissions(NULL,NULL)

Limitações / Restrições

Existem algumas restrições nas permissões concedidas aos administradores das instâncias do AWS RDS, conforme documentado no artigo Microsoft SQL Server no Amazon RDS no capítulo Segurança do Microsoft SQL Server

Aqui está uma visão geral:

As seguintes funções no nível do servidor não estão disponíveis no momento no Amazon RDS:

  • bulkadmin
  • dbcreator
  • diskadmin
  • securityadmin
  • serveradmin
  • sysadmin

As seguintes permissões no nível do servidor não estão disponíveis nas instâncias do SQL Server DB:

  • OPERAÇÕES A GRANEL DO ADMINISTRADOR
  • ALTERAR QUALQUER CREDENCIAL
  • ALTERAR QUALQUER NOTIFICAÇÃO DE EVENTO
  • ALTERAR QUALQUER SESSÃO DE EVENTOS
  • ALTERAR QUALQUER AUDITORIA DO SERVIDOR
  • ALTERAR RECURSOS
  • ALTER SETTINGS (Você pode usar as APIs do grupo de parâmetros DB para modificar parâmetros. Para obter mais informações, consulte Trabalhando com grupos de parâmetros DB.
  • SERVIDOR AUTENTICADO
  • CONTROL_SERVER
  • CRIAR NOTIFICAÇÃO DE EVENTOS DDL
  • CRIAR ENDPOINT
  • CRIAR NOTIFICAÇÃO DE EVENTOS DE TRATAMENTO
  • MONTAGEM DE ACESSO EXTERNO
  • SHUTDOWN (Você pode usar a opção de reinicialização do RDS)
  • MONTAGEM INSEGURA
  • ALTERAR QUALQUER GRUPO DE DISPONIBILIDADE (somente SQL Server 2012)
  • CRIAR QUALQUER GRUPO DE DISPONIBILIDADE (somente SQL Server 2012)

Essas restrições / limitações podem ter sido alteradas desde que o documento foi publicado.

Outros recursos

Brent Ozar escreveu um artigo " SQL Server RDS ", onde observou que ...

Muitos comandos DBCC não funcionam de todo - DBCC DBINFOe DBCC LOGINFOforam explicitamente negados. No entanto, descobri que podia correr DBCC FREEPROCCACHEquantas vezes quisesse.

Lembre-se de que essas limitações podem mudar com o tempo - novos recursos são adicionados regularmente.

Suporte da Amazon

Se sua conta tiver as permissões necessárias e você não conseguir liberar o cache, poderá abrir um tíquete de suporte com a Amazon.


Pergunta atualizada com mais detalhes com base nisso. Obrigado pela sua resposta cuidadosa e detalhada. Eu corro através de problemas de permissões com outras coisas no RDS, mas isso deve ser suportado. Entrarei em contato com o suporte da Amazon hoje mais tarde, se não houver muita atividade aqui. Parecia mais um problema do SQL Server do que um problema de RDS, e eu não sei o quão especializado ou específico o suporte deles será comparado a essa excelente comunidade!
Professional Sounding Name

1
Agradeço seu feedback. Eu acho que você pode querer abrir um ticket com a Amazon ou a Microsoft, visto que nada parece funcionar. E, novamente, pode ser um bug ou um recurso (limitação devido a ....).
John aka hot2use
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.