web-dev-qa-db-fra.com

Un programme C # peut-il mesurer sa propre utilisation de la CPU?

Je travaille sur un programme de base qui fonctionnera depuis longtemps, et j'ai un programme de journalisation externe ( SmartInSpect ) que je veux nourrir de certaines valeurs périodiquement, pour le surveiller en temps réel lors du débogage .

Je sais que je peux simplement reposer plusieurs programmes, comme le chef de la tâche, ou IarSn TaskInfo, mais j'aimerais tout garder dans mon propre programme pour cela, car je souhaite également ajouter des règles simples comme si le programme utilise plus de X% cpu, drapeau ceci dans le journal.

J'ai un fil de fond qui alimente périodiquement des statistiques sur SmartInSpect, telles que la consommation de mémoire, l'ensemble de travail, etc.

Est-il possible que ce fil ait une mesure raisonnablement précise de la quantité de ressources de la CPU de l'ordinateur qu'il consomme? Le programme principal est une application à une seule-filetage (à part le fil de surveillance qui enregistre les statistiques), donc si une technique est limitée à Combien utilise un seul thread utilise alors ce serait bien aussi.

J'ai trouvé des entrées liées à quelque chose appelé RUSAGE Pour Linux et C. Y a-t-il quelque chose de similaire que je peux utiliser pour cela?


Edit: OK, j'ai essayé le contre-courant de performance, mais il a ajouté beaucoup de données GC à chaque fois appelé, donc le graphique pour l'utilisation de la mémoire et Collection de déchets en flèche. Je suppose que je vais juste quitter cette partie pour l'instant.

39
Lasse V. Karlsen

Vous pouvez également utiliser System.Diagnostics. processus.TotalProcessortime et System.Diagnostics. ProcessThread.TotalProcessortime Propriétés Pour calculer l'utilisation de votre processeur comme cela article décrit.

49
axk

Jettes un coup d'oeil à System.Diagnostics.PerformanceCounter. Si vous courez perfmon.exe, vous verrez la gamme de compteurs de performance à votre disposition (définissez "l'objet de performance" sur "processus"), dont l'un est "% de temps du processeur".

8
Sunlight

Vous pouvez par le biais de la classe System.Diagnostic.performancecounter. Voici un exemple de surveillance de quelqu'un d'usage de la CPU:

http://blogs.msdn.com/dotnetinterop/archive/2007/02/02/System-diagnostiques-Performancecounter-A-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 coup de performance en l'utilisant.

4
Keltex

Il est bon que vous enregistriez sur des moniteurs comme SmartInspect. Mais Windows elle-même rassemble les données de chaque ressource dans ce cas votre programme (ou processus). WMI est la norme pour la surveillance des applications. Nous pouvons voir les données capturées par WMI. De nombreuses applications de gestion des applications, de surveillance de la santé ou de surveillance applicatrice prennent en charge l'OMM hors de la boîte.

Je ne vous recommanderais donc pas de loger votre utilisation de la CPU dans l'application à 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 d'obtenir la liste des processus, voir ci-dessous: - Win32_PerfFormattedData_PerfProc_Process Pour obtenir le temps de processeur, le filtre est ProcuitId voir cet article - Vous pouvez obtenir le processeur de la classe Win32_Process.

WMI facilité pour C # de 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 du processus distant.

3
sundar venugopal