Problèmes de mémoire insuffisante sur SQL Server 2012 SP3

8

J'ai eu des erreurs de MOO SQL Server périodiques, une fois au point que SQL Server s'est arrêté et s'est toujours produit pendant la nuit, lorsque personne ne l'utilise, et aucun travail de l'Agent SQL en cours d'exécution à ce moment-là:

Voici l'erreur typique:

17/08/2017 19: 31: 17, spid100, Inconnu, La mémoire système est insuffisante dans le pool de ressources «interne» pour exécuter cette requête.

17/08/2017 19: 31: 17, spid100, inconnu, erreur: 701 Gravité: 17 État: 123.

17/08/2017 19: 31: 17, spid112, inconnu, erreur: 18056 Gravité: 20 État: 29. (Paramètres :). L'erreur est imprimée en mode laconique car une erreur s'est produite lors du formatage. Le suivi des notifications ETW, etc. est ignoré.

Voici les informations du serveur:

  • 10 Go de mémoire MIN SQL Server
  • 21 Go de mémoire SQL MAX Server
  • seulement 4 DB sur le serveur
  • leurs tailles ne sont que de 1 à 2 Go chacune
  • La taille de Tempdb n'a jamais dépassé 1 Go (définie sur une croissance automatique de 10 Go)
  • Les index sont tous à faible fragmentation, les statistiques sont mises à jour
  • Version:

    Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64) 
        Oct 20 2015 15:36:27 
        Copyright (c) Microsoft Corporation
        Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)

J'ai vérifié plusieurs éléments:

  • DBCC memorystatus
  • Statistiques rapides:

    SELECT (physical_memory_in_use_kb/1024)/1024 AS [PhysicalMemInUseGB]
    FROM sys.dm_os_process_memory;
    GO
    
    Output:
    20 GB
    Page Life Expectancy                     155932
  • Aucun gouverneur de ressources activé:

    select pool_id, cache_memory_kb, used_memory_kb,
           out_of_memory_count,used_memgrant_kb
      from sys.dm_resource_governor_resource_pools
    
    Output:
    
    pool_id | cache_memory_kb | used_memory_kb | out_of_memory_count | used_memgrant_kb
    --------+-----------------+----------------+---------------------+-----------------
          1 |          295368 |         641416 |                   0 |                0
    
    
    select (physical_memory_in_use_kb/1024) Memory_usedby_Sqlserver_MB,
           (locked_page_allocations_kb/1024) Locked_pages_used_Sqlserver_MB,
           (total_virtual_address_space_kb/1024 )Total_VAS_in_MB,
           process_physical_memory_low,
           process_virtual_memory_low
      from sys. dm_os_process_memory
    
    Output:
    
    Memory_usedby_Sqlserver_MB | Locked_pages_used_Sqlserver_MB | Total_VAS_in_MB | process_physical_memory_low | process_virtual_memory_low
    ----------------------------------------------------------------------------------------------------------------------------------------
                         20553 |                          20393 |       134217727 |                           0 |                          0

Le serveur est sur SP3, je sais qu'il y avait un problème de fuite de mémoire dans SP1, donc l'exclure.

Quelqu'un remarque-t-il quelque chose dans le résultat DBCC sur lequel je devrais me concentrer?

user132852
la source
1
Y a-t-il d'autres services / applications hébergés sur ce serveur? Le compte de service SQL Server fait-il partie de la stratégie de sécurité locale Pages verrouillées en mémoire? Les journaux des événements Windows indiquent-ils d'autres problèmes au moment où vous avez rencontré le crash de SQL Server?
John Eisbrener
-Aucune autre application hébergée sur ce serveur, c'est un serveur SQL dédié. -Le compte de service du serveur SQL fait partie du groupe des administrateurs Windows. - Je ne vois qu'un tas d'erreurs VSS: Erreur du service de cliché instantané des volumes: erreur inattendue lors de l'interrogation de l'interface IVssWriterCallback. h = 0x80070005, l'accès est refusé. . Cela est souvent dû à des paramètres de sécurité incorrects dans le processus d'écriture ou de demande. Opération: collecte des données de l'écrivain Contexte: ID de la classe de l'écrivain: {35e81631-13e1-48db-97fc-d5bc721bb18a} Nom de l'écrivain: NPS VSS Writer ID de l'instance de l'écrivain: {...}
user132852
1
Le serveur est-il une machine virtuelle? Dans l'affirmative, dispose-t-elle de ressources mémoire «dédiées» ou partage-t-elle avec d'autres machines virtuelles? Et, si elle partage la mémoire, la distribution des ressources mémoire est-elle sur-engagée? J'ai vu cela se produire (quelle que soit la version) sur les serveurs VM où la mémoire était surallouée.
SQL_Hacker
3
Merci Shanky. Juste pour mettre à jour, j'ai trouvé le problème vendredi dernier après l'avoir ajouté à la surveillance, il semble que l'une des sessions de surveillance des applications dans l'application (tierce partie) n'ait pas été configurée correctement, la session de connexion ne se ferme que quelques heures plus tard, lorsque le MOO le tue.
user132852
1
@ user132852 vous pouvez mettre votre solution dans une réponse et la marquer comme ayant répondu.
Thomas Kronawitter

Réponses:

2

Étant donné que SQL Server s'exécute sur une machine virtuelle, comme l'indique l' (hypervisor)indicateur dans l'instruction de version, vous devez vous assurer qu'il dispose d'une réservation de mémoire dans VMWare (ou Hyper-V, etc.) sur le serveur hôte.

La réservation de mémoire doit généralement représenter 100% de la mémoire allouée à la machine virtuelle pour les machines virtuelles SQL Server utilisées dans un environnement de production. Sans réservation de mémoire, le serveur hôte peut "voler" la mémoire de la machine virtuelle via l'utilisation d'un "pilote de ballon" à utiliser par une autre machine virtuelle, ce qui est probablement la cause de votre état de mémoire insuffisante.

Dans VMWare vCenter, pour définir la réservation de mémoire sur une machine virtuelle:

  1. Mettez la machine virtuelle hors tension avant de configurer les paramètres de mémoire.

  2. Dans vSphere Client, cliquez avec le bouton droit sur une machine virtuelle dans l'inventaire et sélectionnez Modifier les paramètres.

  3. Dans la fenêtre Propriétés de la machine virtuelle, sélectionnez l'onglet Ressources et sélectionnez Mémoire.

  4. Dans le panneau Allocation des ressources, activez la case à cocher Réserver toute la mémoire invité (Tous verrouillés).

  5. Cliquez sur OK.

Si vous utilisez Microsoft Hyper-V, désactivez la mémoire dynamique pour la machine virtuelle, en utilisant ce processus dans Hyper-V Manager:

  1. Assurez-vous que la machine virtuelle est désactivée.
  2. Faites un clic droit sur la VM, choisissez "Paramètres"
  3. Sélectionnez "Mémoire" dans le volet gauche.
  4. Assurez-vous que «Activer la mémoire dynamique» n'est pas coché.
  5. Démarrez la VM.
Max Vernon
la source
1

Quelques changements de configuration que je ferais:

  1. Supprimez les paramètres de mémoire minimum, il n'y a littéralement pas besoin de cela.
    • La raison pour laquelle vous souhaitez modifier cela est parce que si elle est définie, SQL Server ne libérera jamais la mémoire sous la marque. Si des pages sont verrouillées en mémoire, la mémoire ne peut plus être paginée.
  2. Ajustez la mémoire maximale du serveur à 75% du total pour un total <32 Go ou 87,5% pour un total> 32 Go.
    • En supposant que SQL Server est la seule chose en cours d'exécution sur la machine, laissez-la consommer la mémoire restante après avoir accordé au système d'exploitation suffisamment de mémoire pour fonctionner correctement.

Vous pouvez utiliser le script suivant pour accomplir cela:

use master;
go

-- MIN Server Memory
exec sys.sp_configure
    'min server memory (MB)'
    ,0;

-- MAX Server Memory
declare
  @systemMemory int
  ,@maxServerMemory int;

select
  @systemMemory = total_physical_memory_kb / 1024
from
  sys.dm_os_sys_memory;

set @maxServerMemory = floor(@systemMemory * .75);

if @systemMemory >= 32768
  begin
    set @maxServerMemory = floor(@systemMemory * .875);
  end;

exec sys.sp_configure
  'max server memory (MB)'
  ,@maxServerMemory;

reconfigure;
go
pimbrouwers
la source
3
Je sais que ce sont des pratiques exemplaires assez standard, mais pouvez-vous expliquer un peu comment les modifier aidera à l'erreur qu'ils frappent?
Erik Darling