J'ai remarqué cette erreur de temps en temps dans le journal des erreurs SQL:
spid20s, Unknown, AppDomain 79 (master.sys [runtime] .78) est marqué pour déchargement en raison de la pression de la mémoire.
J'utilise SQL Server 2016, SP1 CU5 (je pousse pour le patch mais l'entreprise est résistante).
Tout ce que j'ai lu indique une pression mémoire non spécifique au CLR. Il existe des suggestions concernant la modification du paramètre MemToLeave
dans les paramètres de démarrage. Est-ce toujours le cas pour les nouvelles versions de SQL Server ou existe-t-il d'autres recommandations?
L'architecture de la mémoire a été modifiée dans SQL Server 2012, de sorte qu'il n'était plus nécessaire de s'inquiéter du paramètre MemToLeave
, en particulier si vous utilisez SQL Server 64 bits. Et, à partir de SQL Server 2016 (que vous utilisez), SQL Server n'est disponible qu'en 64 bits (voir la "Remarque" en haut de la " Quoi de neuf dans le moteur de base de données - SQL Server 2016 = "page). Donc, non, ne vous inquiétez pas pour MemToLeave
.
Correct, les erreurs de "pression de mémoire" ne sont pas spécifiques à SQLCLR. Ces erreurs ne vous disent pas la cause de la pression de la mémoire, mais plutôt ce qui est affecté par la pression de la mémoire (dont je doute qu'il existe un moyen possible d'avoir vraiment un aperçu de la cause de toute façon - je veux dire, s'il y a 10 processus prendre de la mémoire, quelle combinaison est vraiment la cause - ce n'est pas nécessairement ce qui prend le plus gros morceau car cela pourrait être entièrement valide). La pression de la mémoire affecte également d'autres zones qui peuvent ne pas apparaître dans le journal des erreurs, telles que le vidage du cache de plan et/ou du pool de tampons (c'est-à-dire les pages de données chargées en mémoire).
Il existe plusieurs fonctionnalités intégrées qui utilisent SQLCLR, une liste partielle étant la suivante:
FORMAT
PARSE
TRY_PARSE
AT TIME ZONE
(à partir de SQL Server 2016)COMPRESS
(mais pas UNCOMPRESS
; à partir de SQL Server 2016)Un ou plusieurs de ceux (ou peut-être celui que je n'ai pas énuméré ci-dessus) est ce qui est affecté dans votre système. Il y a deux indices, à la fois dans le (master.sys[runtime].78)
une partie de cette info, qui nous dit ceci:
master
(en supposant que vous ne chargez jamais, jamais d'assemblys personnalisés dans master
;-))le "propriétaire" (c'est-à-dire AUTHORIZATION
) de l'assembly étant sys
(nous ne pouvons pas attribuer la propriété des assemblys à sys
ou INFORMATION_SCHEMA
car aucun de ces principaux n'a un SID
). Si vous souhaitez voir le propriétaire de chaque assembly, procédez comme suit:
SELECT asm.[name] AS [Assembly],
USER_NAME(asm.[principal_id]) AS [Owner],
USER_SID(asm.[principal_id]) AS [OwnerSID]
FROM sys.assemblies asm;
Ce que vous pouvez faire, c'est:
Pourrait examiner cela: https://docs.Microsoft.com/en-us/sql/relational-databases/memory-management-architecture-guide . Surtout la requête sur ce qui est actuellement alloué. Il vous donnera un endroit où concentrer les diagnostics.
J'ai déjà eu ce problème auparavant, et il a fini par être des appels répétés à une procédure CLR qui ne se fermerait jamais une fois terminé.