Microsoft France : Eric Vernié
Les nouvelles API de Windows Vista et Windows Serveur 2008 :
Les compteurs de performances V 2.0
Document de référence
Révision 1.0
INTRODUCTION
CREATION D'UN COMPTEUR AVEC LA NOUVELLE ARCHITECTURE V 2.0
- Création du manifeste
- Compilation du manifeste
- Initialisation du compteur
- Enregistrement du compteur
- Consommation du compteur
CONCLUSION
Dans ce dernier article consacré à la robustesse et à la fiabilité de Windows Vista et Windows Serveur 2008, nous allons aborder la création de compteurs de performances.
Les compteurs de performances sont présent depuis longtemps sur la plate-forme Windows, et permettent de superviser plusieurs aspects d'un ordinateur, tels que les ressources réseau, la consommation mémoire, la consommation disque, mais aussi de superviser n'importe quelle application. La précédente architecture, disponible avec Windows XP et Windows Serveur 2003, imposait aux développeurs qui souhaitaient ajouter à leurs applications des compteurs de performances, de développer des DLLs additionnelles, qui devaient être enregistrées avec un système tel que performance monitor
Développer des compteurs de performances (à part pour ceux qui développe en .NET) était une vraie sinécure.
Et bien aujourd'hui bonne nouvelle, la nouvelle architecture PerfLib V 2.0, disponible dans Windows Vista et Windows Serveur 2008, a été conçue pour simplifier le travail nécessaire à la création et à la consommation de compteurs de performance.
Conçu au dessus de la couche Event Tracing For Windows (ETW) elle fourni de plus grande performances et de fiabilité, en permettant une collecte de données et de rapports, plus rapides, avec moins de consommation mémoire, et en évitant l'enregistrement dans le registre Windows et le partage de mémoire.
En résumé, les développeurs n'ont plus besoin d'écrire et d'enregistrer des Dlls pour ajouter à leurs applications des compteurs de performance. En faite, ils n'ont plus besoin d'écrire de code du tout. A la place, ils créent des fichiers manifestes au format XML, qui décrivent les compteurs, avec l'outil CTRPP.EXE, ils créées les coquilles C, qu'ils peuvent alors intégrer à leurs applications.
Le code généré par CTRPP.EXE, appels directement les APIs PerfLib V 2.0 pour enregistrer les compteurs.
Pour instrumenter l'application, les développeurs, n'ont plus qu'à appeler le code généré et les APIs de Perflib, pour soumettre des données à leurs compteurs.
Mais les bénéfices ne s’arrêtent pas là. En effet, les applications consommatrices de données de performances, peuvent obtenir un jeu restreints de données, alors qu’avant elles obtenaient la totalité du jeu de données pour une instance d’un compteur. Enfin, il n’est plus nécessaire de charger en mémoire la totalité des Dlls de compteurs de performances évitant ainsi les problèmes de fuites mémoire.
Technologies utilisées:
C/C++
Visual Studio 2008
Software development Kit Vista :
https://www.microsoft.com/downloads/details.aspx?familyid=4377f86d-c913-4b5c-b87e-ef72e5b4e065
Haut de page
La création de compteurs de performance avec cette nouvelle architecture, est principalement déclarative avec en fin de compte très peu de code.
Le manifeste est un fichier XML qui doit respecter un certain schéma défini à cette adresse :
https://msdn2.microsoft.com/en-us/library/aa373092.aspx
Ce fichier XML, servira à deux titres:
- Pour construire le code nécessaire pour l'instrumentalisation de votre application
- Pour enregistrer le compteur dans Windows
1) Créez un nouveau projet Win32 de type console que vous nommez TestPerfLibV2.
2) Ajoutez-y un nouveau fichier XML, que vous nommez TestPerfLibV2.man
3) Ouvrez ce fichier TestPerfLibV2.man et ajoutez-y le code xml suivant :
< instrumentationManifest >
< instrumentation >
< Counters >
< Provider
callback = "custom"
providerName="FournisseurSimpleDeCompteurs"
applicationIdentity="TestPerfLibV2.exe"
providerType = "userMode"
providerGuid = "{A64503B4-43DD-430d-8EFD-9DB77DBF0D17}"
>
< counterSet
guid = "{8B52B3AC-B74C-4772-82E3-E6A114AA3688}"
uri ="EV.Compteurs.TestSimple"
name=".A Test de compteurs"
description="Test de création de compteurs avec l'architecture V 2.0"
instances="single">
<counter id="1"
uri="EV.Compteurs.TestSimple.Compteur1"
name="Compteur1"
type = "perf_counter_rawcount"
detailLevel = "standard"
description="Ceci est un test de compteur simple"
defaultScale = "-1">
</ counter >
</ counterSet >
</ Provider >
</ Counters >
</instrumentation >
</instrumentationManifest>
Haut de page
Une fois le manifeste crée, nous allons construire automatiquement, à l’aide de l’outil CTRPP.EXE, l’ossature de notre compteur de la manière suivante :
CTRPP.EXE TestPerfLibV2.man
Plusieurs fichiers sont ainsi crée dont voici la description
TestPerfLibV2.c | Fichier source, contenant l’implémentation des méthodes PerfStartProvider, et PerfAutoCleanup |
TestPerfLibV2.h | Fichier d’entête de définition des méthodes PerfStartProvider et PerfAutoCleanup, ainsi que des handles et objets COM de notre compteur. |
TestPerfLibV2.rc | Fichier de ressources de type string qui décrivent notre compteurs |
TestPerfLibV2_r.h | Fichier de définition des numéros d’identification de nos ressources de type string |
Exemple de fichier source :
ULONG
PerfAutoInitialize(
void
)
{
ULONG Status = ERROR_SUCCESS;
Status = PerfStartProvider(
(LPGUID) & ProviderGuid_TestPerfLibV2_1,
(PERFLIBREQUEST) ControlCallback_TestPerfLibV2_1,
& hDataSource_TestPerfLibV2_1);
if (Status != ERROR_SUCCESS) {
goto Cleanup;
}
Status = PerfSetCounterSetInfo(
hDataSource_TestPerfLibV2_1,
(PPERF_COUNTERSET_INFO) & CtrSet_TestPerfLibV2_1_1,
dwCtrSet_TestPerfLibV2_1_1);
if (Status != ERROR_SUCCESS) {
goto Cleanup;
}
Cleanup:
if (Status != ERROR_SUCCESS) {
PerfStopProvider(hDataSource_TestPerfLibV2_1);
}
return Status;
}
Haut de page
5) Ajoutez le code généré à l'application TestPerfLibV2, comme indiqué sur la figure suivante
6) Ouvrez le fichier TestPerfLibV2.CPP, et incluez les entêtes suivantes :
#include<Windows.h>
#include <Perflib.h>
#include "TestPerfLibV2.h"
7) Dans la méthode _tmain, ajoutez à la fois le code d’initialisation, et de consommation de notre compteur
Exemple :
int _tmain(int argc, _TCHAR* argv[])
{
ULONG Status = 0x0;
PPERF_COUNTERSET_INSTANCE perfInstance = NULL;
int valeur=1;
//Initialisation du compteur de performance
Status = PerfAutoInitialize();
if (Status != ERROR_SUCCESS) {
return Status;
}
//Création d'une instance
perfInstance= PerfCreateInstance (hDataSource_TestPerfLibV2_1,
&CtrSetGuid_TestPerfLibV2_1_1,
L"Instance1",0);
if (perfInstance == NULL)
{
Status = GetLastError();
goto Cleanup;
}
//Envoie des données à notre compteur
while(valeur <=1000)
{
Sleep (1000);
PerfSetULongCounterValue(hDataSource_TestPerfLibV2_1,perfInstance,1,valeur++);
printf("Compteur2\n");
}
Cleanup:
PerfAutoCleanup();
return Status;
}
Dans cet exemple, j’utilise la méthode PerfAutoInitialize() (crée par CRTPP.EXE) pour initialiser le compteur, ensuite, je l’instancie à l’aide de la méthode PerfCreateInstance(), puis je l’alimente dans une boucle à l’aide de la méthode PerfSetUlongCounterValue().
Avant de compiler notre solution, il nous reste à ajouter l’option /TC pour le fichier TestPerfLibV2.C
Haut de page
Pour enregistrer le compteur, il suffit d’utiliser l’outil Lodctr.exe de la manière suivante.
Loadctr /m :TestPerfLibV2.man
Pour le des-enregistrer utilisez unlodctr.exe /m :TestPerfLibV2.man
Haut de page
Sur Windows Vista, les APIs PDH (Performance Data Helper) ainsi que les anciennes APIs peuvent être utilisées pour consommer notre compteur. Il est également possible d’utiliser les APIs Performance Logs and Alert. Mais dans cet article nous allons utiliser l’outil Performance monitor pour consommer notre compteur.
- Exécutez l’application console testPerfLibV2.Exe, le message "compteur2 " doit apparaitre dans une fenêtre console.
- Ouvrez Performance moniteur, choisissez, en début de liste, le compteur qui se nomme .A Test de compteurs comme sur la figure suivante :
Vous devriez voir désormais le compteur évoluer comme sur la figure suivante
Haut de page
Dans cette article, nous venons de voir comment il est désormais simple avec Windows Vista et Windows Serveur 2008, de décrire à l’aide de fichier manifeste au format XML un compteur de performance. Comment construire avec l’outil CRTPP.EXE à partir de ce manifeste, l’ossature d’un compteur de performance.
Comment enregistrer à l’aide de l’outil lodctr.exe le compteur de performance et enfin comment l’initialiser et le consommer à l’aide des APIs Perf*.
Pour en savoir plus rendez-vous à l’adresse :
https://msdn2.microsoft.com/en-us/library/bb267838.aspx
Haut de page