Résoudre les problèmes de mémoire insuffisante

S’applique à :SQL Server

OLTP en mémoire utilise plus de mémoire et de différentes façons que SQL Server. Il est possible que la quantité de mémoire que vous avez installée et allouée pour OLTP en mémoire devienne insuffisante pour vos besoins croissants. Si c'est le cas, vous risquez de manquer de mémoire. Cette rubrique explique les procédures à mettre en œuvre en cas d'insuffisance de mémoire. Consultez Analyse et dépannage de l’utilisation de mémoire pour des conseils pouvant vous aider à éviter de nombreuses situations d’épuisement de la mémoire.

Thèmes abordés dans cette rubrique

Rubrique Vue d’ensemble
Résoudre les problèmes de restauration de base de données en cas d'insuffisance de mémoire Que faire si vous obtenez le message d’erreur « Échec de l’opération de restauration pour la base de données « databaseName » en raison d’une mémoire insuffisante dans le pool de ressources «< resourcePoolName>> ».<
Résoudre les problèmes d'insuffisance de mémoire ayant un impact sur la charge de travail Explique la procédure à suivre si vous constatez que les problèmes d'insuffisance de mémoire ont un effet négatif sur les performances.
Résoudre les échecs d'allocation de pages dus à une mémoire insuffisante alors qu'il y a suffisamment de mémoire à disposition Que faire si vous obtenez le message d’erreur « Disallowing page allocations for database 'databaseName' due to insufficient memory in the resource pool 'resourcePoolName' (Disallowing page allocations for databaseName>) en raison d’une mémoire insuffisante dans le pool de ressources «< resourcePoolName> ».< ... » lorsque la mémoire disponible est suffisante pour l’opération.
Bonnes pratiques concernant l’utilisation de l’OLTP en mémoire dans un environnement de machine virtuelle Ce qu’il faut savoir avant d’utiliser l’OLTP en mémoire dans un environnement virtualisé.

Résoudre les problèmes de restauration de base de données en cas d'insuffisance de mémoire

Lorsque vous tentez de restaurer une base de données, vous pouvez recevoir le message d’erreur : « Échec de l’opération de restauration pour la base de données « databaseName> » en raison d’une mémoire insuffisante dans le pool de ressources «< resourcePoolName> ».< Cela indique que le serveur n’a pas suffisamment de mémoire disponible pour restaurer la base de données.

Le serveur sur lequel vous restaurez une base de données doit disposer de suffisamment de mémoire pour les tables à mémoire optimisée dans la sauvegarde de base de données. Dans le cas contraire, la base de données n’est pas mise en ligne et est marquée comme suspecte.

Si le serveur n’a pas suffisamment de mémoire physique, et que cette erreur persiste, cela peut signifier que les autres processus utilisent trop de mémoire ou indiquer qu’un problème de configuration ne permet pas de disposer d’une quantité de mémoire suffisante pour procéder à la restauration. Pour cette classe de problèmes, prenez les mesures suivantes pour augmenter la quantité de mémoire disponible pour l’opération de restauration :

  • Fermez temporairement les applications en cours d'exécution.
    En fermant une ou plusieurs applications en cours d’exécution ou en interrompant les services inutiles pour le moment, vous libérez la mémoire utilisée pour la mettre à disposition de l’opération de sauvegarde. Vous pourrez les redémarrer à la fin de la restauration.

  • Augmentez la valeur de MAX_MEMORY_PERCENT.
    Si la base de données est liée à un pool de ressources, ce qui est recommandé, la mémoire disponible pour la restauration est régie par MAX_MEMORY_PERCENT. Si la valeur est trop faible, la restauration échouera. Cet extrait de code modifie la valeur de MAX_MEMORY_PERCENT pour le pool de ressources PoolHk à 70 % de la mémoire installée.

    Important

    Si le serveur s'exécute sur une machine virtuelle sans être dédié, attribuez à MIN_MEMORY_PERCENT et à MAX_MEMORY_PERCENT la même valeur.
    Pour plus d’informations, consultez la rubrique Bonnes pratiques concernant l’utilisation de l’OLTP en mémoire dans un environnement de machine virtuelle.

    -- disable resource governor  
    ALTER RESOURCE GOVERNOR DISABLE  
    
    -- change the value of MAX_MEMORY_PERCENT  
    ALTER RESOURCE POOL PoolHk  
    WITH  
         ( MAX_MEMORY_PERCENT = 70 )  
    GO  
    
    -- reconfigure the Resource Governor  
    --    RECONFIGURE enables resource governor  
    ALTER RESOURCE GOVERNOR RECONFIGURE  
    GO  
    
    

    Pour plus d’informations sur les valeurs maximales de MAX_MEMORY_PERCENT, consultez la section Pourcentage de mémoire disponible pour les tables et index mémoire optimisés.

  • Augmentez max server memory.
    Pour plus d’informations sur la configuration de max server memory, consultez la rubrique Mémoire du serveur (option de configuration de serveur).

Résoudre les problèmes d'insuffisance de mémoire ayant un impact sur la charge de travail

Évidemment, il est préférable de ne pas se trouver dans une situation d'insuffisance de mémoire. Une planification et une surveillance appropriées permettent souvent d'éviter ce type de problème. Néanmoins, même la meilleure des planifications ne suffit pas toujours pour anticiper ce qui va réellement se produire. Vous risquez donc d'être confronté à un problème d'insuffisance de mémoire à un moment ou un autre. Vous pouvez mettre fin à une situation d'insuffisance de mémoire en procédant aux deux étapes ci-dessous :

  1. Ouvrir une connexion administrateur dédiée (DAC).

  2. Prendre une mesure corrective

Ouvrir une connexion administrateur dédiée (DAC).

SQL Server propose une connexion administrateur dédiée (DAC). Cette connexion DAC permet à un administrateur d’accéder à une instance active du moteur de base de données SQL Server afin de résoudre les problèmes sur le serveur, même si ce serveur ne répond pas aux autres connexions clientes. La DAC est disponible via l’utilitaire sqlcmd et SQL Server Management Studio.

Pour obtenir des conseils sur l’utilisation de DAC par le biais de SSMS ou de sqlcmd, consultez Connexion de diagnostic pour les administrateurs de base de données.

Prendre une mesure corrective

Pour résoudre une situation d'insuffisance de mémoire, vous devez libérer de la mémoire existante en réduisant son utilisation ou mettre plus de mémoire à la disposition de vos tables en mémoire.

Libérer de la mémoire existante

Supprimer les lignes non essentielles des tables mémoire optimisées et patienter jusqu'au prochain garbage collection

Vous pouvez supprimer les lignes non essentielles d'une table mémoire optimisée. Le garbage collector remet à disposition la mémoire utilisée par ces lignes. Le moteur de l'OLTP en mémoire collecte les lignes à nettoyer de façon agressive. Cependant, une transaction longue peut empêcher cette opération de garbage collection. Par exemple, si une transaction s’exécute pendant 5 minutes, les versions de ligne créées par des opérations de mise à jour ou de suppression alors que la transaction était active ne peuvent pas être récupérées par le garbage collector.

Déplacer une ou plusieurs lignes dans une table sur disque

Les articles TechNet suivants donnent des conseils pour déplacer des lignes d'une table mémoire optimisée vers une table sur disque.

Augmenter la mémoire disponible

Augmenter la valeur de MAX_MEMORY_PERCENT sur le pool de ressources

Si vous n’avez pas créé de pool de ressources nommé pour vos tables en mémoire, vous devez le faire et y lier vos bases de données OLTP en mémoire. Consultez la rubrique Lier une base de données avec des tables mémoire optimisées à un pool de ressources pour obtenir des conseils sur la création et la liaison de vos bases de données OLTP en mémoire à un pool de ressources.

Si votre base de données OLTP en mémoire est liée à un pool de ressources, vous pouvez augmenter le pourcentage de mémoire auquel le pool peut accéder. Consultez la sous-rubrique Modifier MIN_MEMORY_PERCENT et MAX_MEMORY_PERCENT sur un pool existant pour obtenir des conseils sur la modification des valeurs MIN_MEMORY_PERCENT et MAX_MEMORY_PERCENT pour un pool de ressources.

Augmentez la valeur de MAX_MEMORY_PERCENT.
Cet extrait de code modifie la valeur de MAX_MEMORY_PERCENT pour le pool de ressources PoolHk à 70 % de la mémoire installée.

Important

Si le serveur s'exécute sur une machine virtuelle sans être dédié, attribuez à MIN_MEMORY_PERCENT et à MAX_MEMORY_PERCENT la même valeur.
Pour plus d’informations, consultez la rubrique Bonnes pratiques concernant l’utilisation de l’OLTP en mémoire dans un environnement de machine virtuelle.

-- disable resource governor  
ALTER RESOURCE GOVERNOR DISABLE  
  
-- change the value of MAX_MEMORY_PERCENT  
ALTER RESOURCE POOL PoolHk  
WITH  
     ( MAX_MEMORY_PERCENT = 70 )  
GO  
  
-- reconfigure the Resource Governor to enabled it
ALTER RESOURCE GOVERNOR RECONFIGURE  
GO  

Pour plus d’informations sur les valeurs maximales de MAX_MEMORY_PERCENT, consultez la section Pourcentage de mémoire disponible pour les tables et index mémoire optimisés.

Installer de la mémoire supplémentaire

En fin de compte, la meilleure solution, le cas échéant, consiste à installer de la mémoire physique supplémentaire. Si vous effectuez cette opération, n’oubliez pas que vous serez probablement en mesure d’augmenter la valeur de MAX_MEMORY_PERCENT (consultez la sous-rubrique Modifier MIN_MEMORY_PERCENT et MAX_MEMORY_PERCENT sur un pool existant), car SQL Server n’aura probablement pas besoin de plus de mémoire, ce qui vous permet de tirer le meilleur parti si la mémoire nouvellement installée n’est pas disponible pour le pool de ressources.

Important

Si le serveur s'exécute sur une machine virtuelle sans être dédié, attribuez à MIN_MEMORY_PERCENT et à MAX_MEMORY_PERCENT la même valeur.
Pour plus d’informations, consultez la rubrique Bonnes pratiques concernant l’utilisation de l’OLTP en mémoire dans un environnement de machine virtuelle.

Résoudre les échecs d'allocation de pages dus à une mémoire insuffisante alors qu'il y a suffisamment de mémoire à disposition

Si vous obtenez le message d’erreur Disallowing page allocations for database '*\<databaseName>*' due to insufficient memory in the resource pool '*\<resourcePoolName>*'. See 'https://go.microsoft.com/fwlink/?LinkId=330673' for more information. dans le journal des erreurs quand la mémoire physique disponible est suffisante pour allouer la page, il peut être dû à la désactivation de Resource Governor. Lorsque Resource Governor est désactivé, MEMORYBROKER_FOR_RESERVE induit une sollicitation de la mémoire artificielle.

Pour corriger le problème, vous devez activer Resource Governor.

Consultez Activer Resource Governor pour obtenir des informations sur les limites et les restrictions, ainsi que sur l’activation de Resource Governor à l’aide de l’Explorateur d’objets, sur les propriétés de Resource Governor et sur Transact-SQL.

Bonnes pratiques concernant l’utilisation de l’OLTP en mémoire dans un environnement de machine virtuelle

La virtualisation de serveur vous permet de réduire les coûts d’exploitation et de capital informatique et d’optimiser l’efficacité informatique, grâce à des processus de configuration, de maintenance, de disponibilité, de sauvegarde et de récupération d’applications optimisés. Avec les progrès technologiques récents, les charges de travail de base de données complexes peuvent être consolidées plus aisément à l'aide de la virtualisation. Cette rubrique porte sur les bonnes pratiques relatives à l’utilisation d’OLTP en mémoire SQL Server dans un environnement virtualisé.

Préallocation de mémoire

Pour la mémoire dans un environnement virtualisé, de meilleures performances et une prise en charge améliorée sont essentielles. Vous devez pouvoir allouer rapidement de la mémoire aux machines virtuelles en fonction des exigences (charges de pointe et creuses) et garantir que la mémoire n'est pas gaspillée. La fonctionnalité de mémoire dynamique d’Hyper-V augmente l’agilité de l’allocation et de la gestion de la mémoire entre les machines virtuelles exécutées sur un hôte.

Certaines bonnes pratiques pour virtualiser et gérer SQL Server ont besoin d’être modifiées lors de la virtualisation d’une base de données avec des tables mémoire optimisées. Sans les tables mémoire optimisées, les deux meilleures pratiques sont les suivantes :

  • Si vous utilisez le paramètre min server memory, il vaut mieux allouer uniquement la quantité de mémoire nécessaire, afin qu’une mémoire suffisante reste disponible pour d’autres processus (évitant ainsi la pagination).
  • Ne définissez pas la préallocation de mémoire sur une valeur trop élevée. Sinon, les autres processus ne disposeront pas de suffisamment de mémoire au moment où ils en ont besoin, ce qui peut entraîner une pagination de mémoire.

Si vous suivez les pratiques ci-dessus pour une base de données avec des tables à mémoire optimisée, une tentative de récupération et de restauration d’une base de données peut entraîner le blocage de la base de données à l’état « Récupération en attente », même si vous avez suffisamment de mémoire disponible pour la récupérer. En effet, au démarrage, l’OLTP en mémoire met les données en mémoire plus rapidement que l’allocation de mémoire dynamique n’alloue la mémoire nécessaire à la base de données.

Résolution

Pour atténuer ce problème, préallouez suffisamment de mémoire à la base de données pour la récupération ou le redémarrage ; ne vous contentez pas d'une valeur minimale en comptant sur la mémoire dynamique pour fournir la mémoire supplémentaire lorsque cela est nécessaire.

Voir aussi

Gestion de la mémoire pour l’OLTP en mémoire
Surveiller l’utilisation de la mémoire et résoudre les problèmes connexes
Lier une base de données avec des tables à mémoire optimisée à un pool de ressources
Guide d’architecture de gestion de la mémoire
server memory (options de configuration de serveur)