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

 

Table des matières


arrow px downINTRODUCTION

arrow px downCREATION 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

arrow px downCONCLUSION

 

 

Introduction

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 pageHaut de page

Création d'un compteur avec la nouvelle architecture V 2.0

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.

Création du manifeste

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
add new item

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 pageHaut de page

Compilation du manifeste

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 pageHaut de page

Initialisation du compteur

5) Ajoutez le code généré à l'application TestPerfLibV2, comme indiqué sur la figure suivante

explorateur de solution

 

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 pageHaut de page

Enregistrement du compteur

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 pageHaut de page

Consommation du compteur.

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.

  1. Exécutez l’application console testPerfLibV2.Exe, le message "compteur2 " doit apparaitre dans une fenêtre console.
  2. Ouvrez Performance moniteur, choisissez, en début de liste, le compteur qui se nomme .A Test de compteurs comme sur la figure suivante :

add counter

Vous devriez voir désormais le compteur évoluer comme sur la figure suivante

reliability and perfomance monitor

Haut de pageHaut de page

Conclusion

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 pageHaut de page