Réparation des compteurs de performance

Erreurs de la catégorie perfmon, perflib et counter

Cet article décrit comment corriger les erreurs journalisées dans l’observateur d’évènements liées aux compteurs de performance, telles que :

Event ID 1008 : «Échec de la procédure d’ouverture pour le service «usbhub» dans la DLL « C:\WINDOWS\system32\usbperf.dll ». Les données de performance de ce service ne seront pas disponibles. Le premier mot (DWORD) de la section Données contient le code d’erreur

ou encore

Event ID 3009 : «L’installation des chaînes de compteurs de performances pour le service UGTHRSVC () a échoué. Le premier DWORD de la section Data contient le code d’erreur.»

ou encore

Event ID 2001 : «Impossible de lire la valeur « First Counter » sous la clé usbperf\Performance. Les codes d’état sont renvoyés dans les données.»

ou encore

Event ID 2007: «Impossible de réparer les compteurs de performance pour le service UGTHRSVC. Réinstallez les compteurs de performances en utilisant l’outil LODCTR.»

Reconstruction de tous les compteurs existants

La réparation des compteurs n’est pas très difficile mais peut s’avérer quelque fois fastidieuse. Si votre observateur d’évènements indique que plusieurs compteurs sont endommagés le mieux est de reconstruire tous les compteurs en un seule étape.

L’outil windows dédié au compteurs est l’utilitaire en ligne de commande lodctr.
Sous windows 10 Pour reconstruire les en une seule opération tous les compteurs de performances enregistrés sur le système on invoque lodctr avec l’option /R , une fois dans le répertoire system32 et une autre fois dans le répertoire syswow64. Ensuite on lance une resynchonisation des compteurs de performance avec winmgmt.

reconstruction des compteurs enregistrés
C:\Windows\system32>lodctr /R

C:\Windows\system32>cd C:\Windows\syswow64

C:\Windows\syswow64>lodctr /R

C:\Windows\syswow64>winmgmt.exe /RESYNCPERF

 

Reconstruction unitaire d’un compteur défaillant

Chaque compteur de performance est associé à un service, pour reconstruire un compteur il faut recharger le fichier .ini du service avec l’utilitaire lodctr. Pour le service monService on trouvera le fichier .ini dans le répertoire c:\windows\inf\monService. Tout dépend du message d’erreur qu’on lit dans l’observateur d’évènement, quelque fois le nom du service qui est cité dans le message d’erreur est identique au nom du répertoire , d’autre fois cela peut être un peu compliqué car le nom peut avoir par exemple été traduit en français.

Par exemple dans le cas des erreurs 1008 Perflib: Échec de la procédure d’ouverture pour le service « ESENT » dans la DLL.. le nom du répertoire sera c:\windows\inf\esent.

Prenons le cas du compteur ESENT , ouvrons une fenêtre de commande en mode admin et rendez-vous dans le répertoire \windows\inf\esent

reconstruction d’un compteur
Microsoft Windows [version 10.0.10586]
(c) 2015 Microsoft Corporation. Tous droits réservés.
C:\WINDOWS\system32>cd \Windows\INF\ESENT

C:\Windows\INF\ESENT>dir
Le volume dans le lecteur C n’a pas de nom.
Le numéro de série du volume est 5420-B09C

Répertoire de C:\Windows\INF\ESENT

30/10/2015  20:00    <DIR>          .
30/10/2015  20:00    <DIR>          ..
30/10/2015  08:24    <DIR>          0000
30/10/2015  20:00    <DIR>          040C
30/10/2015  08:17            34 218 esentprf.hxx
1 fichier(s)           34 218 octets
4 Rép(s)  138 081 681 408 octets libres

C:\Windows\INF\ESENT>

 
On se retrouve face à 2 répertoires contenant chacun un fichier esentprf.ini, 0000 contient le fichier en anglais, 040C contient sa version en français (040C est la valeur hexadécimale de la locale windows pour le français, consultez Language Collections pour une liste exhaustive). Pour certain compteur, le répertoire 040C est remplacé par le répertoire 00C.

Dans le cas de notre exemple du compteur ESENT, la reconstruction se fera en rechargeant le fichier 040C\esentprf.ini avec lodctr

reconstruction compteur

C:\Windows\INF\ESENT>lodctr 040c\esentprf.ini

 

Vérification de la reconstruction
Quand lodctr reconstruit le compteur du service “monservice”, il ajoute des informations dans le registre sous la clé HLM\System\CurrentControlSet\Services\monservice\Performance

registreesent
les compteurs du service esent dans le registre

La seconde chose que fait lodctr quand il reconstruit un compteur, c’est d’alimenter les références et les noms des compteurs utilisés par l’analyseur de performances.

performanceesent
les compteurs esent (base de données) dans l’analyseur de performance

Le fichier PerfStringBackup.ini
Quand les 2 opérations, reconstruction du registre et mise à jour de l’analyseur de performance, se sont bien déroulées, lodctr met à jour le fichier c:\windows\System32\PerfStringBackup.ini avec les éléments du compteur. Vous savez que tout s’est bien passé en vérifiant que ce fichier a été mis à jour. Ce fichier peut s’avérer utile si plus tard en cas de nouveau problème vous décidez de reconstruire en une seule opération tous vos compteurs que vous aviez patiemment corrigés, pour cela il vous suffira d’invoquer la commande lodctr /R:perfStringBackup.ini”.

Le fichier perfStringBackup.ini est constitué de 2 parties:
– Une première dans lequel se trouve la référence des 4 clés First/Last counter et First/Last Help pour le compteur su service.

// la référence des compteurs du service ESENT dans le fichier perfStringBackup.ini
....
[PERF_ESENT]
First Counter=2476
First Help=2477
Last Counter=4368
Last Help=4369
.....

– Une seconde partie qui contient la table de référence utilisée par l’analyseur de performance.

// tables des compteurs du service ESENT dans le fichier perfStringBackup.ini
....
2476=Database
2477=Database provides performance statistics for...
2478=Pages Converted/sec
2479=Pages Converted/sec is the number of times...
...
4368=Database Cache Size Unused
4369=Database Cache Size Unused is ...
...

Pour le service ESENT, vous pouvez constater que dans le fichier perfStringBackup.ini la valeur de First Counter, 2476, est celle du premier libellé (2476=Database) et la valeur de Last Help, 4369, est celle du dernier libellé (4369=Database Cache Size Unused is …). Ces lignes vont par paires, la première est le titre du compteur (counter) et celle qui suit son détail (help), ce sont ces titres et détails que vous retrouvez dans la liste des compteurs de l’analyseur de performance.

Résoudre les problèmes de reconstruction
Parfois Lodctr rencontre quelques problèmes pour créer les compteurs, dans ce cas la commande lodctr /Q peut aider à vérifier que le compteur a correctement été ajouté au registre. Les 4 valeurs “First Counter”, “Last Counter”, “First Help”, “Last Help” listées par la commande doivent correspondre à celles présentes dans le registre.

vérification d’un compteur
C:\Windows\INF\ESENT>lodctr /Q:esent
Performance Counter ID Queries [PERFLIB]:
Base Index: 0x00000737 (1847)
Last Counter Text ID: 0x00002B6A (11114)
Last Help Text ID: 0x00002B6B (11115)[ESENT] Performance Counters (Enabled)
DLL Name: %systemroot%\system32\esentprf.dll
Open Procedure: OpenPerformanceData
Collect Procedure: CollectPerformanceData
Close Procedure: ClosePerformanceData
First Counter ID: 0x000009AC (2476)
Last Counter ID: 0x00001110 (4368)
First Help ID: 0x000009AD (2477)
Last Help ID: 0x00001111 (4369)
C:\Windows\INF\ESENT>

 

Quelque fois il arrive que Lodctr reconstruise correctement les 4 clés du registre mais qu’en revanche il ne soit pas capable d’ajouter les compteurs dans l’analyseur de performance. Dans ce cas lodctr ne met pas à jour le fichier PerfStringBackup.ini, cette absence de mise à jour lors de la reconstruction est le signal que quelque chose ne s’est pas correctement passé ou bien qu’une opération supplémentaire est nécessaire.

Par exemple dans le cas d’erreurs concernant les compteurs du service “rassembleur”, il vous faudra vous assurer de mettre à jour les compteurs des 2 services UGatherer et du service UGTHRSVC.

L’absence du fichier en langue anglaise dans le répertoire \Windows\inf\monService\0409 peut également être une source de difficulté. Dans ce cas de figure on peut recopier dans le répertoire 0409 celui présent dans le répertoire 040C puis l’éditer pour remplacer la propriété de langue “00C=French” par “009=English”, ensuite on renouvelle à l’identique l’opération de reconstruction avec lodctr et le fichier présent dans le répertoire 040C.

Avant de retenter une opération de reconstruction qui n’aurait pas abouti correctement, il peut s’avérer parfois utile de supprimer (ou renommer) les 4 clés “First Counter”, “First Help”, “Last Counter”, “Last Help” du registre pour le service concerné.

Si la reconstruction d’un compteur individuel échoue, alors si votre fichier PerfStringBackup.ini est plus ou moins à jour vous pouvez l’utiliser pour recharger l’ensemble des compteurs (lodctr /R:\windows\system32\perfStringBackup.ini”). Attention, tous les compteurs qui ne sont pas présents dans ce fichier se retrouveront dans un état invalide qui nécessitera leur reconstruction individuel. Toutefois avant de démarrer l’opération, il est possible d’ajouter manuellement dans le fichier perfStringBackup.ini les entrées qui manquent. Pour chaque service manquant, vous devez ajouter le bloc [Perf_monservice] et la liste des paires titre/détail (nnnn=… nnnn+1=…) tout en veillant que les valeurs First/Last/Counter/Help du bloc [Perf_MonService] soient en phase avec les indices de la liste des paires titres/détails (cf détail fichier perfStringBackup.ini). Vous pouvez récupérer la liste des paires titre/detail d’un service sur une autre système windows, ou la reconstruire en partant du fichier .ini présent dans le répertoire \windows\inf\Monservice\040C. Vous pouvez également récupérer le fichier perfStringBackup.ini d’une machine de configuration similaire.

Et dans le cas ultime où vous ne réussiriez pas à reconstruire les compteurs d’un service, vous pouvez tout de même supprimer le message d’erreur journalisé périodiquement dans l’observateur d’évènements en désactivant le compteur via la commande lodctr /D:monService (l’option /E:monService sert à le réactiver).

Note : La plupart des opérations décrites dans cet article doivent être exécutées en mode administrateur, pour savoir comment lancer un fenêtre de commande ou d’autres exécutable en mode administrateur, consulter https://tex.fr/lobservateur-devenements-corriger-erreurs-windows/