web-dev-qa-db-fra.com

SQLSERVER 2016 augmente continuellement la mémoire volée

Nous vivons une croissance lente de la mémoire volée sur nos serveurs de base de données sur l'espace de plusieurs jours. Il semble que le plateau d'environ 130-140 Go, à quel point nous commençons à avoir des problèmes plus importants tels que des erreurs hors mémoire, des basculements de FreeZes et AG multi-seconds. Les problèmes commencent à se manifester environ une semaine après un redémarrage. J'ai commencé à enregistrer l'historique de la mémoire volée, qui est indiquée ci-dessous:

Stolen memory over time

Regarder sys.dm_os_memory_clerks, il apparaît comme si la majeure partie de celle-ci provient de la mémoire non-page enregistrée contre le pool tampon sur Numa Node 0:

Buffer pool memory clerks

Suivi du total pages_kb Pour la piscine tampon au fil du temps, montre la baisse du nombre de pages comme virtual_memory_committed_kb grandit. (Le 13 avril, le serveur a été redémarré pour les mises à jour Windows. Le piscine tampon remplit à 400 Go environ environ une heure)

Buffer pool pages

Quelqu'un a-t-il déjà vu ce comportement?

Nous exécutons SQLServer 2016 CU12 13.0.5698.0 Le serveur est un exemple de 64-Core AWS EC2 I3.16XLarge. Nous avons un certain nombre d'autres grappes de la même taille qui montrent tous ce problème. Nous avons également quelques clusters sur des instances 32-Core I3.8xLarge qui montrent également la croissance de la mémoire volée, mais elles ne finissent pas de ralentir/jeter des erreurs hors mémoire. La seule différence (autre que l'échelle) est que les serveurs 64-CORE ont 2 nœuds numa.

Server config

Mise à jour: MS a indiqué que le bugFix in kb4536005 n'est pas reporté à SQL2016.

4
geofftnz

j'ai une suspicion. D'abord, êtes-vous capable d'ouvrir des billets de support avec Microsoft?

Capture [\ SQLServer: noeud de mémoire (*)\stolen Node mémoire (KB)] Pour les nœuds NUMA et comparer la somme sur [\ SQLSERVER: Memory Manager\Stolen Server Mémoire (KB)]. Si ma suspicion est correcte, lorsque des ennuis font brasser la divergence entre les deux - qui semblent être toujours d'accord - seront assez élevés. L'autre caractéristique Tell-Tale: jusqu'à N-1 Les nœuds Numa SQLOS peuvent avoir montré cette relation (où N est le nombre de nœuds numa) [Mémoire de nœud de base de données] + [Mémoire de nœud volée] + [Mémoire de nœud libre]> [Total mémoire de noeud]

je décris le problème quelque peu dans ces poteaux de blog.

https://sql-sasquatch.blogspot.com/2018/07/sql-server-2016-Memory-accounting.html
[.____] https://sql-sasquatch.blogspot.com/2018/10/sql-server-2016-memory-accounting-par.html

Le problème de la comptabilité de base est que la croissance de la piscine parfois tampon se produit d'une manière que les blocs de descripteur tampon sont attribués à partir du nœud SQLOS A, mais les pages référencées dans les BDB proviennent du noeud SQLOS B. Le résultat de cette condition est qu'une partie de la mémoire physique. contrôlé par SQLOS obtient double-compté: la même mémoire est comptabilisée sur le nœud A (où les BDB vivent) en tant que [base de données Node mémoire] [~ # ~ # ~]] Comptabilisé sur le nœud SQLOS B comme [volé Node Mémoire]. Cette situation est confuse et inefficace ... mais ce n'est pas encore toute la floraison du problème.

Le problème complètement fleurit lorsque tellement Node b [mémoire de nœud volé] est également Node a [mémoire de noeud de base de données] que Node b [mémoire de noeud de base de données] gouttes à ~ 2% de Node b [mémoire de nœud cible]. Lorsque cela se produit, le taux de [\ SQLSERVER: Buffer Manager\List Stands/SEC] Skyrockets - Nous avons vu 2000/sec quand cela nous est arrivé à nous. SQL Server est Essayer pour corriger le problème (trop peu [mémoire de noeud de base de données]) sur Node b en coupant divers types de cache sur Node B. mais Ça ne peut pas !! Parce que la [mémoire de nœud volée] n'est dans aucun des différents types de cache attendus.

Résolution temporaire: lorsque [la mémoire de nœud totale] s'approche [mémoire de nœud cible] mais [la mémoire de nœud de base de données] s'approche 2% de [mémoire de nœud cible], exécutez DBCC Dropcleanbuffers.

kB4536005 résout ce problème dans SQL Server 2017 CU20 et SQL Server 2019 CU2. https://support.microsoft.com/en-us/help/4536005/improvement-fix-incorrection-Memory-page-accompounting-that-causes-out-of-me ) ==

Il existe une solution similaire Sounding corrective dans SQL Server 2016 SP2 CU5, KB4470916. https://support.microsoft.com/en-ca/help/4470916/fix-OUT-Of-Memory-Error-Occuilles-Quand-Database-node-Memory-kb-drops-belo

Cependant, je ne crois pas que KB4470916 résout le problème avec une double comptabilité. Ainsi, bien que cela puisse améliorer la réponse SQL Server à un seul nœud SQLOS ayant [mémoire nœud de base de données] au seuil d'~ 2%, je pense qu'il laisse ouvrir la possibilité de piquer l'ours en raison de ce double comptage. Et cela peut être la situation que vous êtes dans.

Toutefois, si la somme de [la mémoire de nœud volée] sur les deux nœuds est toujours alignée sur [Mémoire de serveur volée] dans l'instance, vous pouvez tout oublier à ce sujet comme si c'était un mauvais rêve. :-)

9
sqL_handLe