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.

È stato utile?

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:

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

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:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top