Erreur lorsque la RAM utilisée pour stocker les messages dans Message Queuing 2.0 dépasse la mémoire allouée

Cet article fournit de l’aide pour résoudre un problème qui se produit lorsque la quantité de RAM utilisée pour stocker les messages dans Microsoft Message Queuing 2.0 (MSMQ 2.0) dépasse la mémoire allouée.

Version d’origine du produit : Microsoft Message Queuing
Numéro de la base de connaissances d’origine : 899613

Symptômes

Lorsque vous envoyez un message à une file d’attente, MSMQ n’accepte pas le message que vous envoyez. Au lieu de cela, MSMQ génère un message d’erreur de ressources insuffisantes . Vous recevez ce message d’erreur dans l’application qui utilise MSMQ 2.0 pour envoyer des messages.

Lorsque ce problème se produit, les informations suivantes peuvent apparaître dans la trace de pile d’un service ou d’une application .NET Framework :

Type d’exception : System.Messaging.MessageQueueException
MessageQueueErrorCode : InsufficientResources
Message : Ressources insuffisantes pour effectuer l’opération.
ErrorCode : -2147467259
TargetSite : Void SendInternal(System.Object, System.Messaging.MessageQueueTransaction, System.Messaging.MessageQueueTransactionType)
HelpLink : NULL
Source : System.Messaging

En outre, le message ci-dessus est enregistré dans le journal des applications. Dans une application COM+ Queued Component (QC), le message ci-dessus peut être enregistré dans le journal des applications. Ce problème se produit lorsque les conditions suivantes sont remplies :

  • Vous essayez d’envoyer un message dans MSMQ.

  • La mémoire allouée actuellement utilisée pour exécuter le service et stocker les messages a atteint 2 gigaoctets (Go). Par défaut, Windows 2000 alloue 2 Go de mémoire adressable à un processus.

    Une fois le service MSMQ chargé, la quantité par défaut de mémoire allouée disponible pour MSMQ 2.0 pour stocker les messages est comprise entre 1,6 Go et 1,8 Go.

    Remarque

    Si vous utilisez le commutateur de 3 Go, la mémoire allouée sera comprise entre 2 Go et 2,5 Go.

    Les fichiers de stockage de messages sont des fichiers mappés en mémoire. Par conséquent, vous pouvez voir si la limite a été dépassée en vérifiant la taille du dossier de stockage MSMQ. Ce dossier se trouve généralement dans le %WinDir%\System32\MSMQ dossier Stockage. Toutefois, le dossier de stockage peut être configuré pour un autre emplacement. Pour voir si le dossier de stockage a été configuré pour un autre emplacement, recherchez dans le champ Dossier des fichiers de messages sous l’onglet Stockage de l’outil MSMQ de Panneau de configuration.

Cause

Ce problème se produit pour une ou plusieurs des raisons suivantes :

  • L’application qui lit et traite les messages qui arrivent dans les files d’attente rencontre des difficultés. Toutefois, les messages continuent d’arriver dans les files d’attente à un rythme plus rapide que la vitesse à laquelle l’application peut lire et traiter les messages.

  • La journalisation est activée dans les files d’attente. Toutefois, les données qui provoquent l’accumulation des messages n’ont pas été supprimées.

  • Le deadlettering est activé dans les files d’attente. En outre, la quantité de mémoire allouée disponible pour stocker les messages dans des lettres mortes a été atteinte ou dépassée.

  • Les messages se sont accumulés dans la file d’attente sortante, car la file d’attente de destination n’est pas disponible.

Résolution

La méthode que vous utilisez pour résoudre ce problème dépend de la status actuelle du service MSMQ. Avant de pouvoir résoudre ce problème, vous devez arrêter les services ou applications qui écrivent dans les files d’attente.

Si MSMQ est en cours d’exécution

Déterminez quelles files d’attente ont des messages accumulés. Pour ce faire, utilisez l’une des méthodes suivantes :

  • Examinez manuellement les files d’attente à l’aide de l’interface MSMQ. L’interface MSMQ se trouve dans la console Gestion de l’ordinateur.

  • Dans Analyseur de performances, définissez tous les compteurs sur l’objet de performance MSMQ QUEUE. Ensuite, sélectionnez Vue Rapport . Dans la vue Rapport , vous pouvez voir le nombre de messages dans chaque file d’attente.

Une fois que vous avez déterminé quelles files d’attente ont accumulé des messages, vous devez déterminer pourquoi les messages se sont accumulés. Il existe plusieurs raisons possibles pour lesquelles les messages peuvent s’accumuler dans les files d’attente. Ces raisons sont les suivantes :

  • Les messages qui se trouvent dans la file d’attente de messages sortants ne peuvent pas atteindre leur destination. Si les messages ne peuvent pas atteindre leur destination, assurez-vous que l’ordinateur de destination est disponible pour recevoir des messages. Si ces messages sont obsolètes ou n’ont aucune valeur, effacez la file d’attente.

  • L’application qui doit recevoir des messages s’est arrêtée ou est entrée dans une condition d’erreur. Si l’une de ces conditions est vraie, résolvez le problème dans cette application.

  • Les messages dans les files d’attente de lettres mortes ou dans les files d’attente de journal ont été conservés. Ces messages n’ont pas été supprimés ou traités. Si ces messages ont été conservés, déterminez l’objectif de conservation de ces messages. L’option permettant de journaliser les messages est fréquemment utilisée pour les tests.

Une fois le test terminé, cette option peut être laissée involontairement activée. Si les messages sont mis en mémoire morte, ils n’ont pas été traités ou remis dans un délai spécifié. Si la journalisation ou la mise en file d’attente est activée, un processus doit lire ces messages hors de la file d’attente. Une fois que vous avez identifié les files d’attente où les messages se sont accumulés, vous pouvez supprimer les messages accumulés.

Si MSMQ n’est pas en cours d’exécution et que vous ne pouvez pas le démarrer manuellement

Remarque

  • Avant d’apporter des modifications aux fichiers dans le dossier de stockage MSMQ, nous vous recommandons de sauvegarder l’environnement MSMQ actuel à l’aide de MQbkup.exe. Cette étape est très importante si vous avez besoin d’aide des services de support technique.

  • Étant donné que MSMQ est entré dans un état instable, vous ne pourrez peut-être pas récupérer tous les messages. Si vous rencontrez des difficultés pour restaurer les messages à l’aide des étapes suivantes et que les données sont très importantes, contactez les services de support technique pour obtenir de l’aide.

Pour sauvegarder la configuration MSMQ à l’aide de MQbkup.exe, procédez comme suit.

Remarque

Avant d’exécuter MQbkup.exe, sélectionnez un dossier dans lequel vous allez sauvegarder les fichiers MSMQ. Ce dossier doit se trouver sur un disque disposant d’au moins 2,5 Go d’espace disponible.

  1. Ouvrez une fenêtre d'invite de commandes.

  2. Remplacez le répertoire par %WinDir%\System32.

  3. Exécutez la commande suivante :

    MQbkup.exe -b Drive :\ Folder to Put Backup Files
    
  4. Notez l’emplacement du dossier dans lequel vous avez sauvegardé les fichiers MSMQ.

Démarrer le serveur à l’aide du commutateur de 3 Go

Remarque

Le commutateur de 3 Go est uniquement une option pour Windows 2000 Advanced Server. Pour Windows 2000 Server et pour Windows 2000 Professionnel, accédez à la section Pour récupérer manuellement vos messages .

Par défaut, Windows 2000 alloue 2 Go de mémoire adressable à chaque processus. Ce problème se produit parce que MSMQ utilise l’ensemble de l’allocation. Ce comportement empêche le service de redémarrer correctement. Si vous utilisez le commutateur de 3 Go, Windows 2000 Advanced Server alloue 3 Go de mémoire adressable à chaque processus. Cette configuration donne à MSMQ suffisamment de mémoire adressable pour charger le service et les fichiers de stockage de messages après avoir redémarré le serveur. Ce commutateur augmente le stockage MSMQ entre 2 Go et 2,5 Go.

Avertissement

Cette configuration peut affecter d’autres ressources sur le serveur. Nous vous recommandons de supprimer le commutateur de 3 Go une fois que vous avez terminé la résolution des problèmes. Cette configuration n’est pas destinée à résoudre définitivement le problème. Toutefois, vous pouvez utiliser cette configuration pour accéder à MSMQ afin de pouvoir effectuer les étapes de la section Si MSMQ est en cours d’exécution .

Pour plus d’informations sur la configuration de l’exécution de Windows à l’aide du commutateur de 3 Go, consultez la rubrique Activation de la prise en charge du réglage de la mémoire des applications dans vos applications dans le fichier d’aide de Windows 2000.

Pour récupérer manuellement vos messages

Remarque

  • Suivez ces étapes uniquement si MSMQ n’est pas en cours d’exécution.
  • Étant donné que MSMQ est dans un état instable et ne démarre pas, vous ne pourrez peut-être pas récupérer tous les messages.

Avertissement

Ce processus peut amener une application à recevoir des messages transactionnels dans un ordre différent de l’ordre dans lequel les messages sont arrivés à l’origine.

  1. Créez un dossier temporaire pour stocker vos fichiers de stockage de messages. Ne placez pas ce dossier dans le dossier MSMQ.

  2. Sélectionnez uniquement les fichiers qui ont l’extension de nom de fichier .mq .

    Avertissement

    Certains fichiers situés dans le dossier de stockage MSMQ sont critiques pour que MSMQ s’exécute correctement. Veillez à sélectionner uniquement les fichiers qui ont l’extension de nom de fichier .mq .

  3. Déplacez les fichiers sélectionnés vers le dossier que vous avez créé à l’étape 1.

  4. Assurez-vous que le pilote d’accès aux données MSMQ n’est pas démarré. Pour ce faire, exécutez la commande suivante dans une invite de commandes :

    Net Stop MQAC /y
    
  5. Démarrez le service MSMQ. Pour ce faire, exécutez la commande suivante à l'invite de commandes :

    Net Start MSMQ
    

    Remarque

    Si les données contenues dans les messages ne sont pas importantes et que vous souhaitez uniquement remettre MSMQ en ligne, vous pouvez vous arrêter ici.

  6. Une fois que vous avez vérifié que le service va maintenant démarrer, arrêtez-le. Pour ce faire, exécutez la commande suivante à l'invite de commandes :

    Net Stop MQAC /y
    

    Cette commande arrête à la fois le service MSMQ et le pilote d’accès aux données.

  7. Dans le dossier vers lequel vous avez déplacé les fichiers de stockage de messages à l’étape 5, notez que certains noms de fichiers ont un formatp Number.mq et que certains noms de fichiers ont un formatl Number.mq. Ces fichiers sont stockés sous forme de paires. Chaque fichier p a un fichier l correspondant.

    Notez les dates auxquelles les fichiers ont été modifiés. Sélectionnez le fichier p le plus ancien et le fichier l correspondant. Déplacez ces fichiers vers le dossier de stockage MSMQ d’origine.

  8. Exécutez la commande à l’étape 5 pour démarrer le service MSMQ. Si le service démarre, suivez les étapes de la section Si MSMQ est en cours d’exécution pour déterminer dans quelles files d’attente les messages s’accumulent et comment gérer les messages.

  9. Après avoir supprimé les messages cumulés des files d’attente, répétez les étapes 6 à 8 jusqu’à ce que vous ayez renvoyé tous les fichiers de messages dans le dossier de stockage MSMQ et que vous ayez supprimé tous les messages cumulés des files d’attente.

    Remarque

    Ne déplacez pas plus de 1,6 Go de données dans le dossier de stockage MSMQ en même temps. Si vous procédez ainsi, le service risque de ne pas démarrer.

Procédure pour reproduire le problème

Sur un ordinateur exécutant Windows 2000 Server, envoyez des messages à une file d’attente locale jusqu’à ce que l’application que vous utilisez pour envoyer les messages reçoive une erreur d’exception 0x00e0027 .

MSMQ 2.0 stocke les messages dans des fichiers mappés en mémoire. Sur un ordinateur exécutant Windows 2000 Server, la quantité par défaut de mémoire allouée disponible pour MSMQ 2.0 est de 2 Go. Une fois les composants de MSMQ 2.0 chargés sur l’ordinateur, la quantité de mémoire allouée disponible pour MSMQ 2.0 est réduite à environ 1,6 Go et 1,8 Go.

Si vous activez le commutateur de 3 Go dans le fichier Boot.ini , la quantité de mémoire allouée disponible pour MSMQ 2.0 passe à 3 Go. Une fois les composants de MSMQ 2.0 chargés sur l’ordinateur, la quantité de mémoire allouée disponible pour MSMQ 2.0 est réduite à 2,7 Go.

Toutefois, la mémoire allouée supplémentaire prend également environ 1 Go de mémoire allouée du noyau. Ce comportement peut affecter les performances du système et affecter les applications qui effectuent des E/S de fichiers.

Nous vous déconseillons d’utiliser le commutateur de 3 Go uniquement pour augmenter la quantité de mémoire allouée disponible pour MSMQ 2.0. Au lieu de cela, nous vous recommandons de configurer un quota d’ordinateurs pour éviter le problème mentionné dans la section Symptômes .

Pour plus d’informations, consultez Comment configurer des quotas d’ordinateurs et des quotas de file d’attente dans Microsoft Message Queuing.