Question

Je travaille sur un programme d'arrière-plan qui fonctionnera longtemps et je dispose d'un programme de journalisation externe ( SmartInspect ) que je souhaite alimenter périodiquement avec certaines valeurs, afin de le surveiller en temps réel lors du débogage.

Je sais que je peux tout simplement lancer plusieurs programmes, comme le gestionnaire de tâches ou IARSN TaskInfo, mais je voudrais tout conserver dans mon propre programme à cet effet, car je souhaite également ajouter quelques règles simples, comme si le programme utilise plus de X% de la CPU, le marquer dans le journal.

J'ai un fil d'arrière-plan qui fournit régulièrement des statistiques à SmartInspect, telles que la consommation de mémoire, le jeu de travail, etc.

Est-il possible pour ce thread d’obtenir une mesure raisonnablement précise de la quantité de ressources CPU 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). Par conséquent, si une technique est limitée à la quantité d'utilisation d'un seul thread , alors ce serait également une bonne chose.

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?

Modifier: Bien, j'ai essayé le compteur de performances, mais il a ajouté un nombre considérable de données GC à chaque fois appelé, de sorte que le graphique d'utilisation de la mémoire et de la récupération de mémoire est monté en flèche. Je suppose que je vais laisser cette partie pour le moment.

Était-ce utile?

La solution

Vous pouvez également utiliser System.Diagnostics. > Process.TotalProcessorTime et System.Diagnostics. ProcessThread.TotalProcessorTime propriétés permettant de calculer votre utilisation du processeur comme suit: article décrit.

Autres conseils

Consultez System.Diagnostics.PerformanceCounter . Si vous exécutez perfmon.exe , la plage de compteurs de performance à votre disposition (définissez "objet de performance" sur "Processus"), dont "% temps processeur".

Vous pouvez utiliser la classe System.Diagnostic.PerformanceCounter. Voici un exemple de quelqu'un qui surveille l'utilisation du processeur:

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 coup dur en utilisant l’utilisation

Il est bon que vous vous connectiez à des moniteurs tels que smartinspect. Mais Windows lui-même rassemble les données pour 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 nombreux outils de gestion des applications, de surveillance de l'état ou de surveillance des applications prennent en charge WMI prêt à l'emploi.

Je ne vous recommanderais donc pas de consigner l'utilisation de votre processeur 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 l'heure du processeur, le filtre est processID Voir cet article  - Vous pouvez obtenir le processID 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 depuis le système distant.

Cet article de projet de code explique comment utiliser le minuteur hautes performances:

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

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

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top