SQL Server 2005: la mémoire système est insuffisante pour exécuter cette requête

13

L'un de nos serveurs SQL, qui fonctionne depuis un certain temps (années), a récemment généré des erreurs de mémoire insuffisantes. Dans le journal des événements d'application, nous voyons:

ID d'événement: 701

Description: la mémoire système est insuffisante pour exécuter cette requête.

Notre équipe qui gère ce serveur est composée principalement de développeurs qui doublent les tâches d'administrateur système. Cependant, notre expertise principale est le développement. Cela étant dit, nous ne savons pas comment résoudre ce problème. Nous avons parcouru les forums et ainsi de suite et n'avons rien trouvé qui corresponde

Voici donc quelques détails supplémentaires pour faciliter le dépannage:

  • Notre mémoire minimale du serveur est définie sur 0.
  • Notre mémoire serveur maximale est définie sur 2000.
  • La mémoire physique totale est de 3 325,85 Mo (provenant de sysinfo).
  • La mémoire virtuelle totale est de 7,10 Go (de sysinfo).
  • Nous n'utilisions pas AWE pour allouer de la mémoire, mais nous devons maintenant voir si cela fait une différence.
  • Cette erreur a été générée par un travail qui sauvegardait un journal des transactions et n'exécutait pas de requête.
  • Nous avons de nombreux serveurs liés. Les types de SGBDR de l'autre côté sont les systèmes SQL Server (2005 et 2000), Oracle 10g et OSI PI.
  • Il est intermittent à ce stade. Nous ne pouvons pas sembler corréler un moment ou un événement aux erreurs.
  • Bien sûr, le redémarrage semble le faire disparaître pendant un certain temps, ce qui est logique en raison de la nature du message d'erreur.
  • Ce serveur triple en tant que serveur d'applications (deux services Windows) et serveur Web, ainsi que le serveur de base de données.

ÉDITER:

Nous sommes sur SP3. La plupart des publications que nous avons trouvées étaient antérieures au SP1, ce qui ne s'applique pas à nous.

SELECT  SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')

Retour

9.00.4035.00 SP3 Standard Edition

Aaron Daniels
la source
Pouvez-vous consulter le journal des erreurs SQL Server car il peut y avoir des détails supplémentaires concernant cette erreur.
John Sansom

Réponses:

4

Je suggère également d'utiliser le paramètre de démarrage -g. Cela semble fonctionner pour la plupart des gens et fonctionnera probablement pour vous aussi. Ma seule préoccupation serait que le problème sous-jacent ne soit pas résolu. Par exemple, s'il y a une fuite de mémoire due à un serveur lié et que le MTL est augmenté à 512 Mo, sera-ce juste une période plus longue entre les problèmes de mémoire? Je ne connais pas la réponse à cela, mais j'ai tendance à être d'accord avec UndertheFold en ce qu'un perfmon peut être un bon début.

Mike Thien
la source
7

Le message d'erreur "La mémoire système est insuffisante pour exécuter cette requête." fait référence à l'espace d'adressage virtuel (VAS) non disponible et non à la mémoire au sens conventionnel, c'est-à-dire dans l'espace de processus SQL Server.

Étant donné que vous n'exécutez que 3 Go sur ce serveur et que SQL Server a été attribué jusqu'à 2 Go, cela signifie que le système d'exploitation et, plus important encore, tout autre élément de la boîte a moins de 1 Go pour jouer. Ce n'est pas beaucoup de mémoire.

Si ce problème est en effet le résultat d'une fuite de mémoire, c'est le VAS en dehors de l'espace de processus SQL Server (memToLeave) qui est consommé.

Je suggère d'utiliser le paramètre de démarrage -g pour affecter plus de mémoire à la partie memToLeave.

Consultez l'article suivant pour plus d'informations:

http://www.johnsansom.com/sql-server-memory-configuration-determining-memtoleave-settings/

Vous pouvez également souhaiter réduire le paramètre de mémoire maximale de SQL Server, mais je le ferais en dernier recours.

John Sansom
la source
Bon article. Merci aussi de l'avoir écrit! Nous avons plusieurs décharges AppDomains dans nos journaux SQL. Nous n'avons que 2 procédures stockées CLR, et elles ne font qu'obtenir et mettre des données vers / depuis un service Web. Il semble étrange que ces 2 procédures stockées CLR utilisent trop de VAS hors de la boîte.
Aaron Daniels,
Je vous en prie. Comme vous le savez peut-être, l'allocation par défaut pour memToLeave n'est que de 256 Mo. Il s'agit d'un tout petit bac à sable pour vos AppDomains, tout le CLR / code managé, les requêtes de serveur lié, SSIS etc., surtout si vous utilisez toute la mémoire disponible sur le serveur. Je suggère de le doubler à 512 Mo en utilisant le paramètre de démarrage -g.
John Sansom
1

Cela pourrait être lié à une fuite de mémoire d'un pilote de serveur lié, selon ce fil de discussion :

Voici ce que Microsoft nous a dit.

Apparemment, le traitement des données à l'aide d'un serveur lié spécifiquement le pilote fox pro provoque une fuite de mémoire qui s'accumule au fil du temps.

splattne
la source
0

Ce serveur triple en tant que serveur d'applications (deux services Windows) et serveur Web, ainsi que le serveur de base de données.

Je définirais votre mémoire minimale - il est tout à fait possible que ces autres processus "volent" la mémoire de SQL

Vous pouvez exécuter un journal de compteur à l'aide de perfmon pour le confirmer et / ou vous donner plus d'informations pour identifier le vrai problème.

CPU_BUSY
la source
0

Référence tirée de ce blog!

Il existe différentes alternatives pour résoudre ce problème.

Tout d'abord, vérifiez votre paramètre SQL Server pour «mémoire serveur minimale» et «mémoire serveur maximale». Si vous avez trouvé une très petite différence dans les deux valeurs, augmentez votre «mémoire serveur maximale».

Deuxièmement, vous avez trouvé des requêtes de longue durée avec ses informations d'utilisation de la mémoire et si cette requête est dans des états inactifs, veuillez vérifier et tuer ce processus. L'optimisation des performances de la base de données est une chose importante pour les utilisations de la mémoire.

Troisièmement, découvert les utilisations d'index pour les requêtes de longue durée car sans indexation appropriée, votre système augmente les E / S DISK et affecte directement votre mémoire.

Quatrièmement, vérifiez la taille du fichier d'échange de mémoire virtuelle et augmentez la taille de ce fichier.

Cinquièmement, vérifiez la taille de la «mémoire minimale par requête». En réalité, elle est de 1024 Ko par défaut, mais dans de rares situations, vous pouvez réduire la taille de ce paramètre. En fait, ce n'est pas conseillé, mais vous pouvez l'essayer.

Sixièmement, essayez d'exécuter cette commande DBCC et encore une fois ce n'est pas conseillé car cela peut affecter les performances globales du serveur. Mais vous pouvez essayer ça.

Anvesh
la source