KB3074434 - CORRECTIF : Erreur de mémoire insuffisante lorsque l’espace d’adressage virtuel du processus de SQL Server est très faible en mémoire disponible

S’applique à
SQL Server 2012 Service Pack 3 SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Enterprise Core SQL Server 2012 Standard

Après avoir appliqué cette mise à jour, vous devez ajouter l’indicateur de trace -T8075 en tant que paramètre de démarrage pour activer cette modification.

Symptômes

Lorsque vous exécutez une requête dans une version 64 bits de Microsoft SQL Server 2012, vous recevez un message d’erreur mémoire insuffisante semblable au suivant dans le journal des erreurs SQL Server :

Remarque

Échec de l’allocation des pages : FAIL_PAGE_ALLOCATION 513

L’exécution des requêtes prend beaucoup de temps et SOS_MEMORY_TOPLEVELBLOCKALLOCATOR attentes.

Lorsque vous examinez les points d’informations suivants, vous constaterez que l’espace d’adressage virtuel disponible est très faible :

  • DBCC MEMORYSTATUS - Section Nombres de processus/système - Mémoire virtuelle disponible
  • DMV : sys.dm_os_process_memory - virtual_address_space_available_kb de colonne

Ces valeurs commencent autour de 8 téraoctets (To) sur un processus x64 et continuent à descendre et à atteindre quelques gigaoctets (Go). 

Lorsque vous êtes au stade où l’espace d’adressage virtuel disponible est très faible, les requêtes qui tentent d’effectuer l’allocation de mémoire peuvent également rencontrer un type d’attente CMEMTHREAD.

Les points de données suivants continueront d’augmenter au fil du temps :

  • DMV : sys.dm_os_process_memory et sys.dm_os_memory_nodes - virtual_address_space_reserved_kb de colonne
  • DBCC MEMORYSTATUS - Section Gestionnaire de mémoire - Machine virtuelle réservée

Ces valeurs augmentent généralement en multiples de la valeur « mémoire maximale du serveur » jusqu’à près de 8 To.

Cause

Lorsque le processus de SQL Server a atteint l’état où Mémoire totale du serveur = Mémoire du serveur cible = mémoire maximale du serveur, il existe des stratégies dans SQL Server gestionnaire de mémoire pour permettre aux nouvelles allocations de demander la réussite temporaire de plusieurs pages de 8 Ko. Le modèle d’allocation répété dans une telle condition peut entraîner la fragmentation des blocs de mémoire et la consommation de l’espace d’adressage virtuel. Si ce processus se répète plusieurs fois, l’espace d’adressage virtuel SQL Server est épuisé et vous remarquerez les symptômes mentionnés précédemment.

Résolution

Informations sur les mises à jour cumulatives

Le problème a été résolu pour la première fois dans la mise à jour cumulative suivante de SQL Server.

Recommandation : Installer la dernière mise à jour cumulative pour SQL Server

Chaque nouvelle mise à jour cumulative pour SQL Server contient tous les correctifs logiciels et tous les correctifs de sécurité inclus dans la mise à jour cumulative précédente. Nous vous recommandons de télécharger et d’installer les dernières mises à jour cumulatives pour SQL Server :

Ce correctif logiciel empêche la mémoire insuffisante et la réduction continue de l’espace d’adressage virtuel disponible que vous pouvez rencontrer.

État

Microsoft a confirmé qu’il s’agissait d’un problème dans les produits Microsoft répertoriés dans la section « S’applique à ».

Informations supplémentaires

  • Windows 2012 R2 permet à l’espace d’adressage virtuel de croître jusqu’à 128 To. Par conséquent, vous ne remarquerez peut-être pas ce problème dans les environnements Windows 2012 R2. Pour plus d’informations, consultez la rubrique suivante dans le Centre de développement Windows :

    Limites de mémoire pour les versions windows et Windows Server

  • Si vous constatez une croissance continue dans l’espace d’adressage virtuel, même après avoir appliqué le correctif, vous pouvez déterminer quelles requêtes ou opérations demandent de grandes quantités de mémoire à l’aide de l’événement étendu Page_allocated. Voici un exemple de script :

    CREATE EVENT SESSION [memory_tracking] ON SERVER
    ADD EVENT sqlos.page_allocated(
        ACTION(package0.callstack,sqlos.cpu_id,sqlos.task_address,sqlos.worker_address,sqlserver.database_id,sqlserver.query_hash,sqlserver.request_id,sqlserver.session_id,sqlserver.sql_text)
        WHERE ([number_pages]>(1)))
    ADD TARGET package0.event_file(SET filename=N'E:\Data\MSSQL11.MSSQLSERVER\MSSQL\Log\memory_tracking.xel')
    WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=PER_CPU,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
    GO
    
    
    

    Il s’agit généralement de sauvegardes de journaux et d’opérations de maintenance d’index, qui se produisent fréquemment.