web-dev-qa-db-fra.com

SQL Dumping toutes les pages du cache tampon toutes les quelques minutes

J'ai un seul nœud SQL2012 SP4 exécutant plusieurs bases de données.

Le serveur a 20 Go de mémoire disponible, 14 Go alloué à SQL (rien d'autre en cours d'exécution sur la boîte).

Toutes quelques minutes SQL décharge l'ensemble du cache tampon. L'espérance de vie de la page frappe zéro, les descripteurs de cache tampon montrent qu'il n'y a rien dans le cache.

J'ai examiné les notifications des moniteurs de ressources et les notifications rebondissent de haut/stabilisateur/bas tous les millisecondes:

Ressource_memphysical_high ressource_mem_steady ressource_memphysical_low

Avec des horodatages qui sont plusieurs millisecondes à part. Le Ple est essentiellement un motif de scie.

J'ai vu cela arriver avant avec SQL2012 SP1 et cette question:

SQL Server 2012 Pages gratuites dans le cache tampon non utilisé

Semble être un problème similaire, bien que j'ai déjà mis à jour à SP4.

J'ai essayé d'allumer le LPIM pour le compte de service et j'ai essayé de jouer avec le réglage de la mémoire maximale. Abaissement de la mémoire Max semble avoir causé le cache tampon vide plus fréquemment.

Des idées de quoi vérifier ensuite?

La charge de travail du serveur n'est littéralement rien (je fais défiler à travers des listes d'éléments dans un fichier ERP System et qu'il atteint environ 40-50 Mo avant que le cache tombe à nouveau).

C'est intéressant parce que j'ai mis à niveau de SP1 pour essayer de résoudre ce problème - le cache il y avait à environ 500 Mo. Depuis lors, j'ai laissé tomber le réglage de la mémoire maximale à 14 Go, ce qui semble avoir aggravé.

Je me demande si Windows paniquant et je lance des notifications incorrectes pour la pression de mémoire sur SQL - il s'ensuit que le serveur avec une mémoire maximale définie à un peu fondé semblait exécuter ok-ish mais ne remplit jamais le cache plus de quelques centaines de MB - mais maintenant Gars à peine à 50 ...

Plus d'infos: pour ceux qui ont demandé

Nombre de cœurs : 4

Taille de la base de données: 80 Go

Le journal des erreurs indique:A significant part of sql server process memory has been paged out. This may result in a performance degradation. Duration: 0 seconds. Working set (KB): 247928, committed (KB): 495656, memory utilization: 50%.

Résultats des scripts d'exécution de ce lien: https://www.sqlskills.com/blogs/jonathan/identifing-external-memory-pressure-with-dm_os_ring_buffer_resource_monitor/

Results of memory pressure query

Je ne sais pas comment interpréter ceci - on dirait qu'il y a une pression de mémoire interne et externe à divers moments ..

Encore plus d'informations :

C'est un invité Hyper-V assis sur un hôte de 96 Go de RAM totale dont environ la moitié est alloué aux invités.

Les symptômes semblent similaires à ceci:

SQL Server 2012 X64 - Impossible d'allouer en toute sécurité plus de 50% de RAM

Toutefois, lorsque j'ai alloué 14 Go à SQL, les symptômes ont été lancés immédiatement (à peine 3 Go de la mémoire du serveur a été commis)

Hier soir, j'ai heurté la mémoire invité à 32 Go et le problème est parti mais je ne vois que 14 Go de commit de la mémoire totale de serveur (et l'entreprise qui gère la DB est occupée ce matin et que ceci est quand ils ont généralement leurs problèmes de performance).

Environ 8-9 Go de données dans le cache pour le moment, semble être stable.

Il semble suggérer que 20 Go suffisent pour la charge de travail sur cette case. Je suis heureux de le laisser avec 32 Go pour le moment, mais j'aimerais vraiment aller au bas de cela afin que je puisse mieux configurer le VMS/SQL.

Je continuerai à creuser et à mettre à jour si je trouve la réponse!

Encore plus d'informations:

Je n'ai pas redémarré SQL après l'allumage de LPIM (ne réalisez pas que c'était une exigence) mais j'ai laissé ce réglage sur et redémarrer pour mettre à niveau la mémoire, je ne suis donc pas sûr que l'augmentation de la mémoire ou du LPIM a soulagé les problèmes.

Je vais sauter ce soir lorsque le serveur est inactif et vérifie comment il regarde à nouveau 20 Go.

encore plus encore plus d'informations:

Actuellement, le serveur tiole sur OK avec 32 Go alloué et nous n'avons pas vu le problème depuis. Si cela se reproduit à nouveau, je reviendrai sur cette question et continuer à creuser.

Il reste actuellement un mystère mais je suppose que je ne masque que les problèmes pour le moment.

9
Charleh

Bien que vous puissiez avoir résolu votre problème vous-même, voici un résumé des informations pertinentes entourant la solution.

Options de configuration du serveur de mémoire de serveur

Microsoft écrit dans leur article Options de configuration du serveur de mémoire de serveur (Microsoft | SQL Docs) pour la section Définition manuellement les options de mémoire

( Accent Mine)

En outre, régler un min_server_memory la valeur est essentielle dans un environnement virtualisé pour assurer La pression de la mémoire de l'hôte sous-jacente ne tente pas de de désallouer la mémoire de la piscine tampon sur une machine virtuelle SQL Server invitée (VM) au-delà de ce qui est nécessaire pour acceptable performance.

La section concernant Verrouiller les pages en mémoire (même document) a un paragraphe convivial égal qui se lit comme suit:

( Accent Mine)

Cette stratégie Windows détermine quels comptes peuvent utiliser un processus permettant de conserver des données dans la mémoire physique empêchant le système de faire appel à la mémoire de la mémoire virtuelle sur le disque . Les pages de verrouillage en mémoire peuvent conserver le serveur sensible lorsque la mémoire de pagination sur le disque se produit. Les pages de verrouillage de l'option de mémoire sont définies sur dans les cas de SQL Server Standard Edition et plus tard lorsque le compte avec les privilèges pour exécuter SQLSERVR.EXE a été accordé aux pages de verrouillage de Windows dans la mémoire (LPIM).

La section LPIM poursuit pour expliquer que:

( Accent Mine)

Réglage de cette option n'affecte pas la gestion de la mémoire dynamique SQL Server, ce qui lui permet de se développer ou de réduire à la demande d'autres commis à la mémoire. Lorsque vous utilisez les pages de verrouillage dans l'utilisateur de la mémoire, il est recommandé de définir une limite supérieure pour la mémoire Max Server comme indiqué ci-dessus.

... et dans un commentaire important qui:

( Accent Mine)

Définition de cette option ne doit être utilisée que si nécessaire, , à savoir s'il y a des panneaux indiquant que SQLServr processus est en cours de pagination . Dans ce cas, l'erreur 17890 sera signalée dans leristLog, ressemblant à l'exemple ci-dessous:

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: ##%.  

Démarrage avec SQL Server 2012 (11.x), le drapeau de trace 845 n'est pas nécessaire pour que l'édition standard utilise des pages verrouillées.

Solution

Sur la base des résultats ci-dessus et de vos observations, la solution à votre problème serait de configurer les paramètres suivants:

  1. min_server_memory (5-10 gb?) Basé sur votre commentaire:

    Environ 8-9 Go de données dans le cache pour le moment, semble être stable.

    ... et la recommandation de Microsoft de la définition d'un min_server_memory.

  2. max_server_memory (20-32 Go) basé sur votre observation:

    Il semble suggérer que 20 Go suffisent pour la charge de travail sur cette case. Je suis heureux de le laisser avec 32 Go pour le moment, mais j'aimerais vraiment aller au bas de cela afin que je puisse mieux configurer le VMS/SQL.

    ... et la recommandation de Microsoft de la définition d'un max_server_memory.

  3. Verrouiller les pages en mémoire: activé pour le compte de service SQL Server.
    [.____] Basé sur la saisie d'erreur de votre instance SQL Server que vous avez mentionnée et la référence de Microsoft dans l'article. [.____]

    Définition de cette option ne doit être utilisée que si nécessaire, , à savoir s'il y a des panneaux indiquant que SQLServr processus est en cours de pagination .

Avant de continuer ...

(L'un des) avantages d'avoir un environnement virtualisé est que les ressources peuvent/doivent être partagées et éventuellement même surnommées. Cependant, allumer des pages de verrouillage en mémoire (LPIM) pourrait avoir un impact négatif sur votre environnement Hyper-V, si votre matériel héberge plusieurs instances. Un engagement excessivement de RAM peut-il épuiser d'autres instances.

Avant d'envisager de changer tous les leviers, commencez par des paramètres 1. et 2. Et si vous avez le réglage précis que ces paramètres de mémoire ne fonctionnent pas, envisagez de tourner sur LPIM si vous avez suffisamment de matériel .

4
John K. N.