Eu notei esse erro ocasionalmente no log de erros do SQL:
spid20s,Unknown,AppDomain 79 (master.sys[runtime].78) está marcado para descarregamento devido à pressão da memória.
Estou usando o SQL Server 2016, SP1 CU5 (estou pressionando por patches, mas a empresa é resistente).
Tudo o que li aponta para pressão de memória não específica para CLR. Existem sugestões sobre como alterar a MemToLeave
configuração nos parâmetros de inicialização. Esse ainda é o caso das versões mais recentes do SQL Server ou existem outras recomendações?
A arquitetura de memória foi alterada no SQL Server 2012, de modo que havia pouca necessidade de se preocupar mais com a
MemToLeave
configuração, especialmente se estiver usando o SQL Server de 64 bits. E, começando com o SQL Server 2016 (que você está usando), o SQL Server está disponível apenas em 64 bits (consulte a "Observação" na parte superior da página " Novidades no Mecanismo de Banco de Dados - SQL Server 2016 "). Então, não, não se preocupeMemToLeave
.Correto, os erros de "Pressão de memória" não são específicos do SQLCLR. Esses erros não estão dizendo a causa da pressão da memória, mas sim o que está sendo afetado pela pressão da memória (o que duvido que haja alguma maneira possível de realmente ter uma visão da causa de qualquer maneira - quero dizer, se houver 10 processos ocupando memória, qual combinação é realmente a causa? não é necessariamente o que está ocupando o maior pedaço, pois isso pode ser totalmente válido). A pressão da memória também afeta outras áreas que podem não aparecer no log de erros, como liberar o cache do plano e/ou o conjunto de buffers (ou seja, páginas de dados carregadas na memória).
Existem vários recursos internos que usam SQLCLR, sendo uma lista parcial a seguinte:
FORMAT
PARSE
TRY_PARSE
AT TIME ZONE
(a partir do SQL Server 2016)COMPRESS
(mas nãoUNCOMPRESS
; começando no SQL Server 2016)Um ou mais desses (ou talvez um que não listei acima) é o que está sendo afetado em seu sistema. Existem duas pistas, ambas na
(master.sys[runtime].78)
parte dessa informação, que nos dizem isso:master
(supondo que você nunca carregaria assemblies personalizados emmaster
;-))sendo o "proprietário" (ou seja,
AUTHORIZATION
) da assembléiasys
(não podemos atribuir a propriedade das assembléias a nenhumsys
ouINFORMATION_SCHEMA
porque nenhum desses principais tem umSID
). Se você quiser ver o proprietário de cada assembly, execute o seguinte:O que você pode fazer é:
Pode olhar para isso: https://learn.microsoft.com/en-us/sql/relational-databases/memory-management-architecture-guide . Especialmente a consulta sobre o que está alocado no momento. Ele lhe dará um lugar para se concentrar no diagnóstico.
Eu tive esse problema antes, e acabou sendo chamadas repetidas para um procedimento CLR que nunca se fechava quando era concluído.