39 votes

Un programme C# peut-il mesurer sa propre utilisation du CPU d'une manière ou d'une autre ?

Je travaille sur un programme d'arrière-plan qui sera exécuté pendant une longue période, et j'ai un programme de journalisation externe ( SmartInspect ) que je veux alimenter périodiquement avec certaines valeurs, pour le surveiller en temps réel lors du débogage.

Je sais que je peux simplement lancer plusieurs programmes, comme le Gestionnaire des tâches, ou IARSN TaskInfo, mais je voudrais tout garder dans mon propre programme pour cela, car je veux aussi ajouter quelques règles simples comme si le programme utilise plus de X% de CPU, le signaler dans le journal.

J'ai un fil d'arrière-plan qui fournit périodiquement des statistiques à SmartInspect, comme la consommation de mémoire, l'ensemble de travail, etc.

Est-il possible pour ce fil d'obtenir une mesure raisonnablement précise de la part des ressources du processeur de l'ordinateur qu'il consomme ? Le programme principal est une application à un seul thread (à l'exception du thread de surveillance qui enregistre les statistiques), donc si une technique est limitée à combien consomme un seul fil alors ce serait bien aussi.

J'ai trouvé des entrées liées à quelque chose appelé rusage pour Linux et C. Existe-t-il quelque chose de similaire que je puisse utiliser pour cela ?


Edit : Ok, j'ai essayé la méthode du compteur de performance, mais cela ajoutait beaucoup de données GC à chaque appel, donc le graphique de l'utilisation de la mémoire et de la collecte des déchets montait en flèche. Je pense que je vais laisser cette partie de côté pour le moment.

49voto

axk Points 2147

Vous pouvez également utiliser System.Diagnostics. Process.TotalProcessorTime et System.Diagnostics. ProcessThread.TotalProcessorTime (temps total du processeur) pour calculer l'utilisation de votre processeur comme ceci article décrit.

8voto

Sunlight Points 1897

Jetez un coup d'œil à System.Diagnostics.PerformanceCounter . Si vous vous retrouvez perfmon.exe vous verrez la gamme de compteurs de performance disponibles (définissez l'objet de performance sur 'Process'), dont l'un est '% Processor Time'.

4voto

Keltex Points 17151

Vous pouvez utiliser la classe System.Diagnostic.PerformanceCounter. Voici un exemple de surveillance de l'utilisation du CPU :

http://blogs.msdn.com/dotnetinterop/archive/2007/02/02/system-diagnostics-performancecounter-and-processor-time-on-multi-core-or-multi-cpu.aspx

Notez que cela nécessite des privilèges élevés. Et il peut y avoir un impact sur les performances en l'utilisant.

3voto

sundar venugopal Points 1366

C'est bien que vous vous connectiez à des moniteurs comme smartinspect. Mais Windows rassemble lui-même les données pour chaque ressource, dans ce cas votre programme (ou processus). WMI est le standard pour la surveillance des applications. Nous pouvons visualiser les données capturées par WMI. De nombreux outils de gestion des applications, de surveillance de la santé ou de surveillance des applications prennent en charge WMI dès le départ.

Je ne vous recommande donc pas d'enregistrer l'utilisation du CPU dans l'application dans un fichier journal.

Si vous pensez que la disponibilité et les performances sont essentielles, optez pour des solutions telles que la solution Microsoft Operations Manager.

Pour avoir une idée de WMI et obtenir la liste des processus, voir ci-dessous : - Win32_PerfFormattedData_PerfProc_Process pour obtenir le temps Cpu, le filtre est processID Voir cet article - Vous pouvez obtenir le processID à partir de la classe Win32_process.

WMI simplifié pour C# par Kevin Matthew Goss

oConn.Username = "JohnDoe";
oConn.Password = "JohnsPass";

System.Management.ManagementScope oMs = new System.Management.ManagementScope("\\MachineX", oConn);    

//get Fixed disk stats
System.Management.ObjectQuery oQuery = new System.Management.ObjectQuery("select FreeSpace,Size,Name from Win32_LogicalDisk where DriveType=3");

//Execute the query 
ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oMs,oQuery);

//Get the results
ManagementObjectCollection oReturnCollection = oSearcher.Get();   

//loop through found drives and write out info
foreach( ManagementObject oReturn in oReturnCollection )
{
    // Disk name
    Console.WriteLine("Name : " + oReturn["Name"].ToString());
    // Free Space in bytes
    Console.WriteLine("FreeSpace: " + oReturn["FreeSpace"].ToString());
    // Size in bytes
    Console.WriteLine("Size: " + oReturn["Size"].ToString());
} 

Vous pouvez également surveiller le processus à partir du système distant.

-2voto

Ashley Davis Points 3016

Cet article de projet de code décrit comment utiliser le timer haute performance :

http://www.codeproject.com/KB/cs/highperformancetimercshar.aspx

Vous pouvez l'utiliser pour chronométrer l'exécution de votre code.

Vous trouverez ici un certain nombre de profileurs C# open source :

http://csharp-source.net/open-source/profile

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X