Un programma C # può misurare il proprio utilizzo della CPU in qualche modo?
-
07-07-2019 - |
Domanda
Sto lavorando a un programma in background che funzionerà a lungo e ho un programma di registrazione esterno ( SmartInspect ) che desidero alimentare periodicamente con alcuni valori, per monitorarlo in tempo reale durante il debug.
So che posso semplicemente avviare più programmi, come Task Manager o IARSN TaskInfo, ma mi piacerebbe tenere tutto nel mio programma per questo, poiché voglio anche aggiungere alcune semplici regole come se il programma utilizza più del X% di CPU, contrassegnalo nel registro.
Ho un thread in background che invia periodicamente alcune statistiche a SmartInspect, come consumo di memoria, working set, ecc.
È possibile che questo thread ottenga una misura ragionevolmente accurata di quante risorse CPU del computer consuma? Il programma principale è un'applicazione a thread singolo (a parte il thread del watchdog che registra le statistiche), quindi se una tecnica è limitata a quanto usa un singolo thread , allora andrebbe bene anche.
Ho trovato alcune voci relative a qualcosa chiamato rusage per Linux e C. C'è qualcosa di simile che posso usare per questo?
Modifica: Ok, ho provato il contatore delle prestazioni, ma ogni volta ho aggiunto un sacco di dati GC, quindi il grafico per l'utilizzo della memoria e la garbage collection è salito alle stelle. Immagino che lascerò questa parte per ora.
Soluzione
Puoi anche utilizzare System.Diagnostics. Process.TotalProcessorTime e System.Diagnostics. ProcessThread.TotalProcessorTime per calcolare l'utilizzo del processore come questo articolo descrive.
Altri suggerimenti
Dai un'occhiata a System.Diagnostics.PerformanceCounter
. Se esegui perfmon.exe
, vedrai la gamma di contatori delle prestazioni disponibili (imposta "performance object" su "Process"), uno dei quali è "% Processor Time".
È possibile tramite la classe System.Diagnostic.PerformanceCounter. Ecco un esempio di qualcuno che controlla l'utilizzo della CPU:
Nota che questo richiede privilegi elevati. E potrebbe esserci un impatto sulle prestazioni che lo utilizza.
È bene che tu stia accedendo a monitor come smartinspect. Ma Windows stesso raccoglie i dati per ogni risorsa in questo caso il tuo programma (o processo). WMI è lo standard per il monitoraggio delle applicazioni. Siamo in grado di visualizzare i dati acquisiti da WMI. Molti strumenti di gestione delle applicazioni, monitoraggio dello stato o monitoraggio delle applicazioni supportano WMI immediatamente.
Quindi non consiglierei di registrare l'utilizzo della CPU all'interno dell'applicazione in un file di registro.
Se ritieni che la disponibilità e le prestazioni siano fondamentali, scegli soluzioni come la soluzione Microsoft Operations Manager.
Per avere un'idea di WMI e per ottenere l'elenco dei processi vedere di seguito:
- Win32_PerfFormattedData_PerfProc_Process
per ottenere il tempo della CPU, il filtro è processID
Vedi questo articolo
- È possibile ottenere processID dalla classe Win32_process.
WMI Made Easy For C # di 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());
}
Puoi monitorare il processo anche dal sistema remoto.
Questo articolo del progetto di codice descrive come utilizzare il timer ad alte prestazioni:
http://www.codeproject.com/KB/cs/highperformancetimercshar.aspx
Puoi usarlo per programmare l'esecuzione del tuo codice.
Qui puoi trovare una serie di profiler C # open source: