Svchost.exe exécutant le service NSI Fuite de mémoire et de mémoire de pool non paginée Balise NSpc

S’applique à
Windows Server 2008 R2 Service Pack 1 Windows 7

Symptômes

Supposons que vous ayez une application ou un outil en cours d’exécution dans Windows 7 ou Windows Server 2008 R2 et que l’application ou l’outil effectue une ou plusieurs des tâches suivantes :

  • Surveillance d’un autre serveur à l’aide d’ICMP ou de ping.exe
  • Démarrage de plusieurs processus de courte durée pour effectuer un travail, qui est alors arrêté
  • Toute activité réseau est alors arrêtée par une autre application ou un autre script

Dans ce cas, après que votre serveur a été exécuté en continu pendant plusieurs heures ou plusieurs jours, vous remarquez que le service NSI (Network Store Interface) présente une fuite de mémoire. En outre, vous remarquez les symptômes suivants :

  • Si vous arrêtez le logiciel de surveillance, la fuite de mémoire s’arrête.
  • Si vous arrêtez l’application, puis redémarrez l’ordinateur, aucune fuite de mémoire ne se produit dans le service NSI.
  • Dans certains cas, si vous désactivez puis activez la carte réseau, vous remarquez un pic soudain d’utilisation du processeur par le service NSI. En outre, l’utilisation de la mémoire passe immédiatement de 1 ou 2 gigaoctets (Go) à 200 ou 300 mégaoctets (Mo).

Ce problème peut se produire dans l’un des scénarios suivants.

Scénario 1

Si une application telle que ping.exe est arrêtée de force, il est possible que la fonction IcmpCloseHandle ne soit pas appelée. Dans ce cas, le service NSI peut détecter qu’un client est disponible. Par conséquent, le service envoie continuellement des notifications relatives aux messages ICMP. Étant donné que le client n’existe pas, la liste des notifications continue de s’allonger. La liste n’est nettoyée qu’une fois que le service NSI est arrêté.

Pour envoyer un ping, vous devez ouvrir le handle ICMP, puis utiliser ces autres fonctions IP Helper pour envoyer et recevoir des données ICMP :

Fonction IcmpCreateFile

ICMPCreateFile

IcmpSendEcho2Ex

Une fois que l’application a envoyé le ping, elle doit appeler la fonction IcmpCloseHandle pour fermer le handle ICMP.

Scénario 2

Un développeur de logiciels crée une application pour envoyer et recevoir des messages ICMP à l’aide des API IPHlelper. Si un seul handle ICMP est utilisé pour envoyer des messages ICMP à plusieurs clients, et s’il le fait à un débit très élevé, l’API IPHelper qui est notifiée lors de la réception d’un message ne peut pas maintenir la vitesse. Dans ce cas, vous remarquez que la mémoire du service NSI continue de croître de façon exponentielle. En outre, vous remarquez une utilisation élevée du processeur par le service NSI (nsisvc.dll).

Scénario 3

Vous disposez d’une application ou d’un service qui utilise directement ou indirectement les fonctions IP Helper. L’application s’arrête ou est arrêtée, et elle ne se ferme pas correctement lorsque chaque inscription de notification n’est pas annulée (CancelMibChangeNotify2). Dans ce cas, le serveur NSI maintient l’inscription en attente pour le processus arrêté. S’il y a de nombreux cas d’arrêt de l’application, le service NSI aura de nombreux enregistrements en attente. Un état asynchrone RPC et d’autres informations sont conservées pour chaque inscription. Cela augmente l’utilisation de la mémoire. En règle générale, ces inscriptions sont effectuées pour un changement d’interface ou un changement d’adresse IP de monodiffusion. S’il n’y a pas de changement dans l’État, ces enregistrements sont toujours maintenus.

Les fonctions de notification suivantes sont utilisées pendant le processus d’inscription :

La raison pour laquelle de nombreuses applications n’appellent pas (CancelMibChangeNotify2) ou n’arrêtent pas le processus est décrite dans la rubrique de la fonction NotifyIpInterfaceChange sur le site web Microsoft Developer Network.

Une fois que la fonction NotifyIpInterfaceChange est appelée pour s’inscrire aux notifications de modification, ces notifications continuent d’être envoyées jusqu’à ce que l’application se désinscrive pour recevoir des notifications de modification ou que l’application s’arrête. Si l’application s’arrête, le système désinscrit automatiquement toute inscription pour les notifications de modification. Nous vous recommandons de configurer une application pour qu’elle se désinscrive explicitement aux notifications de modification avant de s’arrêter.

Pour chaque inscription à la notification, vous devez également allouer de la mémoire de pool non paginé (NPP) pour la balise NSpc.

Cause

Ce problème se produit, car le processus d’inscription pour notification se ferme sans désinscription préalable du service NSI. Par conséquent, la fuite d’enregistrement dans NSI provoque la fuite de mémoire dans le service NSI. De plus, NPP fuit de la mémoire dans la balise de contextes proxy NSI NSpc (NSI.dll).

Résolution

Informations sur le correctif logiciel

Un correctif logiciel pris en charge est disponible auprès du Support Microsoft. Toutefois, il est conçu uniquement pour corriger le problème décrit dans cet article. N'appliquez ce correctif qu'aux systèmes sur lesquels vous constatez le problème décrit dans le présent article. Ce correctif logiciel va peut-être subir des tests supplémentaires. Ainsi, si vous n'êtes pas sérieusement concerné par ce problème, il est recommandé d'attendre la prochaine mise à jour logicielle qui contiendra ce correctif.

Si le correctif logiciel est disponible en téléchargement, une section « Téléchargement de correctif logiciel disponible » figure en haut du présent article de la Base de connaissances. Si cette section est absente, procurez-vous le correctif logiciel auprès des services de Support technique Microsoft.

Remarque Si des problèmes supplémentaires surviennent ou si des procédures de dépannage sont nécessaires, vous devrez peut-être créer une demande de service distincte. Les coûts habituels du support s'appliqueront aux autres questions et problèmes du support non directement liés au correctif logiciel en question. Pour obtenir la liste complète des numéros de téléphone des services d’assistance technique Microsoft ou pour créer une demande de service distincte, reportez-vous au site web de Microsoft à l’adresse suivante :

http://support.microsoft.com/contactus/?ws=support

Remarque Le formulaire « Téléchargement de correctif logiciel disponible » affiche les langues pour lesquelles le correctif logiciel est disponible. Si votre langue n'est pas répertoriée, cela signifie qu'aucun correctif logiciel n'est disponible pour cette langue.

Configuration requise

Pour appliquer ce correctif logiciel, vous devez avoir installé le Service Pack 1 pour Windows 7 ou Windows Server 2008 R2.

Nécessité de redémarrer

Vous devez redémarrer l'ordinateur après l'application de ce correctif logiciel.

Informations sur le remplacement des correctifs logiciels

Ce correctif logiciel ne remplace aucun correctif logiciel déjà publié.

Informations de fichier

La version anglaise (États-Unis) de ce correctif logiciel installe des fichiers dont les attributs sont répertoriés dans les tableaux ci-dessous. Les date et heure de création de ces fichiers sont exprimées en temps universel coordonné (UTC). Les date et heure de ces fichiers s’affichent sur votre ordinateur local conformément à l’heure locale et en tenant compte de l’heure d’été. En outre, ces date et heure peuvent changer lorsque vous effectuez certaines opérations sur les fichiers.

Informations et remarques sur les fichiers Windows 7 et Windows Server 2008 R2

D'importants correctifs pour Windows 7 et Windows Server 2008 R2 sont contenus dans les mêmes packages. Toutefois, les correctifs de la page Demande de correctifs sont répertoriées pour les deux systèmes d'exploitation. Pour demander le package de correctifs logiciels qui s'applique à l'un des systèmes d'exploitation ou aux deux, sélectionnez le correctif logiciel répertorié sous Windows 7/Windows Server 2008 R2 sur la page. Reportez-vous systématiquement à la liste des produits concernés pour déterminer le système d'exploitation auquel les différents correctifs logiciels s'appliquent.

  • Vous pouvez identifier les fichiers qui s'appliquent à un produit spécifique, SR_Level (RTM, SPn) et à un dossier (LDR, GDR) en examinant les numéros de version des fichiers tels qu'ils apparaissent dans le tableau suivant.

    Version en cours Produit SR_Level Service branch
    6.1.760 0. 16xxx Windows 7 et Windows Server 2008 R2 RTM GDR
    6.1.760 1. 22xxx Windows 7 et Windows Server 2008 R2 SP1 LDR
  • Les dossiers GDR ne contiennent que les correctifs généralement publiés pour résoudre les problèmes courants extrêmement importants. Les dossiers LDR contiennent des correctifs logiciels en plus des correctifs largement publiés.

  • Les fichiers MANIFEST (.manifest) et MUM (.mum) qui sont installés pour chaque environnement sont répertoriés séparément dans la section « Informations sur les fichiers supplémentaires pour Windows 7 et Windows Server 2008 R2 ».

  • Les fichiers MUM et MANIFEST, ainsi que les fichiers du catalogue de sécurité associés (.cat), sont extrêmement importants pour conserver l'état des composants mis à jour. Les fichiers du catalogue de sécurité pour lesquels les attributs ne sont pas répertoriés sont dotés d’une signature numérique Microsoft.

Pour toutes les versions x86 prises en charge de Windows 7

Nom de fichier Version de fichier Taille du fichier Date Heure Plateforme
Nsi.dll 6.1.7600.16385 8,704 14-Juil-2009 01:16 x86
Nsiproxy.sys 6.1.7600.16385 16 896 13-Juil-2009 12:23 x86
Nsisvc.dll 6.1.7601.22590 20,480 05-févr-2014 02:03 x86
Winnsi.dll 6.1.7600.16385 16 896 14-Juil-2009 01:16 x86

Pour toutes les versions x64 prises en charge de Windows 7 et Windows Server 2008 R2

Nom de fichier Version de fichier Taille du fichier Date Heure Plateforme
Nsi.dll 6.1.7600.16385 13 824 14-Juil-2009 01:41 x64
Nsiproxy.sys 6.1.7601.22590 24 576 05-févr-2014 1,501 x64
Nsisvc.dll 6.1.7601.22590 26,624 05-févr-2014 18:02:42 PM x64
Winnsi.dll 6.1.7600.16385 26,112 14-Juil-2009 01:41 x64
Nsi.dll 6.1.7601.22590 8,704 05-févr-2014 02:03 x86
Winnsi.dll 6.1.7601.22590 16 896 05-févr-2014 02:04 x86

Pour toutes les versions IA-64 prises en charge de Windows Server 2008 R2

Nom de fichier Version de fichier Taille du fichier Date Heure Plateforme
Nsi.dll 6.1.7600.16385 18,944 14-Juil-2009 01:48 IA-64
Nsiproxy.sys 6.1.7601.22590 53 760 05-févr-2014 00:50 IA-64
Nsisvc.dll 6.1.7601.22590 60 928 05-févr-2014 01:48 IA-64
Winnsi.dll 6.1.7600.16385 38,912 14-Juil-2009 01:50 IA-64
Nsi.dll 6.1.7601.22590 8,704 05-févr-2014 02:03 x86
Winnsi.dll 6.1.7601.22590 16 896 05-févr-2014 02:04 x86

Informations sur les fichiers supplémentaires pour Windows 7 et Windows Server 2008 R2

Fichiers supplémentaires pour toutes les versions x86 prises en charge de Windows 7

Nom de fichier Package_1_for_kb2847346~31bf3856ad364e35~x86~~6.1.1.0.mum
Version de fichier Non applicable
Taille du fichier 1,822
Date (UTC) 05-févr-2014
de redémarrage (UTC) 06:35
Plateforme Non applicable
Nom de fichier Package_2_for_kb2847346~31bf3856ad364e35~x86~~6.1.1.0.mum
Version de fichier Non applicable
Taille du fichier 1,805
Date (UTC) 05-févr-2014
de redémarrage (UTC) 06:35
Plateforme Non applicable
Nom de fichier Package_3_for_kb2847346~31bf3856ad364e35~x86~~6.1.1.0.mum
Version de fichier Non applicable
Taille du fichier 1,807
Date (UTC) 05-févr-2014
de redémarrage (UTC) 06:35
Plateforme Non applicable
Nom de fichier Package_for_kb2847346_rtm~31bf3856ad364e35~x86~~6.1.1.0.mum
Version de fichier Non applicable
Taille du fichier 1,459
Date (UTC) 05-févr-2014
de redémarrage (UTC) 06:35
Plateforme Non applicable
Nom de fichier Package_for_kb2847346_sp1~31bf3856ad364e35~x86~~6.1.1.0.mum
Version de fichier Non applicable
Taille du fichier 1,819
Date (UTC) 05-févr-2014
de redémarrage (UTC) 06:35
Plateforme Non applicable
Nom de fichier X86_dfca12963d5c03edca970b29ad513eb4_31bf3856ad364e35_6.1.7601.22590_none_ff32d7aebbbb6891.manifest
Version de fichier Non applicable
Taille du fichier 699
Date (UTC) 05-févr-2014
de redémarrage (UTC) 06:35
Plateforme Non applicable
Nom de fichier X86_microsoft-windows-usermodensi_31bf3856ad364e35_6.1.7601.22590_none_749890603f18301d.manifest
Version de fichier Non applicable
Taille du fichier 8,301
Date (UTC) 05-févr-2014
de redémarrage (UTC) 06:38
Plateforme Non applicable

Fichiers supplémentaires pour toutes les versions x64 prises en charge de Windows 7 et Windows Server 2008 R2

Nom de fichier Amd64_37e172e525713d1718cb98daea282913_31bf3856ad364e35_6.1.7601.22590_none_9888f3a0165278fe.manifest
Version de fichier Non applicable
Taille du fichier 1,048
Date (UTC) 05-févr-2014
de redémarrage (UTC) 06:35
Plateforme Non applicable
Nom de fichier Amd64_3839818617f8250fd6f59e35da1df9bd_31bf3856ad364e35_6.1.7601.22590_none_8fbf427f98b0d1cb.manifest
Version de fichier Non applicable
Taille du fichier 703
Date (UTC) 05-févr-2014
de redémarrage (UTC) 06:35
Plateforme Non applicable
Nom de fichier Amd64_a9af583825031567fe0548a9c2c728ab_31bf3856ad364e35_6.1.7601.22590_none_59ced916edddc9da.manifest
Version de fichier Non applicable
Taille du fichier 703
Date (UTC) 05-févr-2014
de redémarrage (UTC) 06:35
Plateforme Non applicable
Nom de fichier Amd64_microsoft-windows-usermodensi_31bf3856ad364e35_6.1.7601.22590_none_d0b72be3f775a153.manifest
Version de fichier Non applicable
Taille du fichier 8,305
Date (UTC) 05-févr-2014
de redémarrage (UTC) 06:41
Plateforme Non applicable
Nom de fichier Package_1_for_kb2847346~31bf3856ad364e35~amd64~~6.1.1.0.mum
Version de fichier Non applicable
Taille du fichier 1,832
Date (UTC) 05-févr-2014
de redémarrage (UTC) 06:35
Plateforme Non applicable
Nom de fichier Package_2_for_kb2847346~31bf3856ad364e35~amd64~~6.1.1.0.mum
Version de fichier Non applicable
Taille du fichier 2,237
Date (UTC) 05-févr-2014
de redémarrage (UTC) 06:35
Plateforme Non applicable
Nom de fichier Package_3_for_kb2847346~31bf3856ad364e35~amd64~~6.1.1.0.mum
Version de fichier Non applicable
Taille du fichier 2,015
Date (UTC) 05-févr-2014
de redémarrage (UTC) 06:35
Plateforme Non applicable
Nom de fichier Package_4_for_kb2847346~31bf3856ad364e35~amd64~~6.1.1.0.mum
Version de fichier Non applicable
Taille du fichier 2,036
Date (UTC) 05-févr-2014
de redémarrage (UTC) 06:35
Plateforme Non applicable
Nom de fichier Package_for_kb2847346_rtm~31bf3856ad364e35~amd64~~6.1.1.0.mum
Version de fichier Non applicable
Taille du fichier 1,467
Date (UTC) 05-févr-2014
de redémarrage (UTC) 06:35
Plateforme Non applicable
Nom de fichier Package_for_kb2847346_sp1~31bf3856ad364e35~amd64~~6.1.1.0.mum
Version de fichier Non applicable
Taille du fichier 2,830
Date (UTC) 05-févr-2014
de redémarrage (UTC) 06:35
Plateforme Non applicable
Nom de fichier Wow64_microsoft-windows-usermodensi_31bf3856ad364e35_6.1.7601.22590_none_db0bd6362bd6634e.manifest
Version de fichier Non applicable
Taille du fichier 4,690
Date (UTC) 05-févr-2014
de redémarrage (UTC) 02:16
Plateforme Non applicable

Fichiers supplémentaires pour toutes les versions IA-64 prises en charge de Windows Server 2008 R2

Nom de fichier Ia64_44d491142723affea686ec2fba3cb4ac_31bf3856ad364e35_6.1.7601.22590_none_dc26e555dbabe437.manifest
Version de fichier Non applicable
Taille du fichier 1,046
Date (UTC) 05-févr-2014
de redémarrage (UTC) 06:35
Plateforme Non applicable
Nom de fichier Ia64_microsoft-windows-usermodensi_31bf3856ad364e35_6.1.7601.22590_none_749a34563f163919.manifest
Version de fichier Non applicable
Taille du fichier 8,303
Date (UTC) 05-févr-2014
de redémarrage (UTC) 06:35
Plateforme Non applicable
Nom de fichier Package_1_for_kb2847346~31bf3856ad364e35~ia64~~6.1.1.0.mum
Version de fichier Non applicable
Taille du fichier 2,029
Date (UTC) 05-févr-2014
de redémarrage (UTC) 06:35
Plateforme Non applicable
Nom de fichier Package_for_kb2847346_sp1~31bf3856ad364e35~ia64~~6.1.1.0.mum
Version de fichier Non applicable
Taille du fichier 1,446
Date (UTC) 05-févr-2014
de redémarrage (UTC) 06:35
Plateforme Non applicable
Nom de fichier Wow64_microsoft-windows-usermodensi_31bf3856ad364e35_6.1.7601.22590_none_db0bd6362bd6634e.manifest
Version de fichier Non applicable
Taille du fichier 4,690
Date (UTC) 05-févr-2014
de redémarrage (UTC) 02:16
Plateforme Non applicable

Solution de contournement

Pour contourner ce problème, utilisez lʼune des solutions de contournement suivantes se rapportant à votre situation.

Solution de contournement pour le scénario 1

Assurez-vous que l’application, telle que ping.exe, n’est pas arrêtée de force. Au lieu de cela, laissez l’application s’arrêter normalement.

Sinon, effectuez une mise à niveau vers Windows Server 2012. Ce problème est résolu dans Windows Server 2012. Ce correctif empêche le service NSI de provoquer une fuite de mémoire, quelle que soit la façon dont l’application est arrêtée.

Solution de contournement pour le scénario 2

Un développeur de logiciels doit créer plusieurs identifiants ICMP pour envoyer des demandes ICMP. Si vous devez envoyer un grand nombre de paquets ICMP, vous devez utiliser des sockets bruts et envoyer et recevoir directement des paquets ICMP sur le socket RAW. Cela donnera la performance la plus rapide.

Solution de contournement du scénario 3

Dans ce scénario, si vous désactivez et activez la carte réseau, l’utilisation de la mémoire diminue immédiatement, mais entraîne un court pic d’utilisation du processeur.

Cela est dû au fait que lorsqu’un changement se produit dans l’adresse IP ou l’interface, le service NSI est notifié par le noyau. Le service NSI tente ensuite d’avertir tous les clients inscrits pour la notification. Lorsque le service tente d’avertir un processus client qui n’existe pas, le RPC signale une erreur. Par conséquent, le service NSI supprime toutes les informations d’état enregistrées pour ce processus client. Une fois ceci fait, cette mémoire est libérée.

Dans ce cas, plusieurs centaines de milliers de notifications sont enregistrées. Une fois l’événement survenu, toute la mémoire de ces clients non valides est libérée.

Ce problème est résolu dans Windows 8.