Czy program w C# może jakoś zmierzyć własne użycie procesora?

Pracuję nad programem w tle, który będzie działał przez długi czas, i mam zewnętrzny program rejestrujący (SmartInspect ), który chcę okresowo podawać niektóre wartości, aby monitorować je w czasie rzeczywistym podczas debugowania.

Wiem, że mogę po prostu odpalić wiele programów, takich jak Menedżer zadań lub Iarsn TaskInfo, ale chciałbym zachować wszystko we własnym programie do tego, ponieważ chcę również dodać kilka prostych zasad, takich jak jeśli program używa więcej niż x % CPU, oznacz to w dziennik.

Mam wątek w tle, który okresowo przekazuje niektóre statystyki do SmartInspect, takie jak zużycie pamięci, zestaw roboczy itp.

Czy jest możliwe, aby ten wątek miał dość dokładną miarę tego, ile zasobów procesora komputera zużywa? Głównym programem jest aplikacja jednowątkowa (oprócz wątku watchdog, który rejestruje statystyki), więc jeśli technika jest ograniczona do ile zużywa pojedynczy wątek , to byłoby dobrze też.

Znalazłem kilka wpisów związanych z czymś o nazwie rusage dla Linuksa i C. czy jest coś podobnego, którego mogę użyć do tego?


Edit: ok, próbowałem sposobu licznika wydajności, ale za każdym razem dodawał sporo danych GC, więc Wykres użycia pamięci i zbierania śmieci gwałtownie wzrósł. Na razie zostawię tę część.

Author: Blair Conrad, 2008-11-09

5 answers

Można również użyć systemu .Diagnostyka.Proces.TotalProcessorTime i System.Diagnostyka.Procesthread.TotalProcessorTime właściwości do obliczenia wykorzystania procesora, jak opisuje ten artykuł .

 46
Author: axk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-09 15:43:07

Spójrz na System.Diagnostics.PerformanceCounter. Jeśli uruchomisz perfmon.exe, zobaczysz zakres dostępnych liczników wydajności (Ustaw "obiekt wydajności" na "proces"), z których jeden to "% czasu procesora".

 8
Author: Sunlight,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-09 14:27:07

Można przez System.Diagnostyka.Klasa PerformanceCounter. Oto przykład kogoś monitorującego użycie procesora:

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

Zauważ, że wymaga to podwyższonych uprawnień. I może być hit z jego użyciem.

 4
Author: Keltex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-09 14:27:11

Dobrze, że logujesz się do monitorów takich jak smartinspect. Ale sam system Windows zbiera dane dla każdego zasobu w tym przypadku programu (lub procesu). WMI jest standardem monitorowania aplikacji. Możemy przeglądać dane przechwycone przez WMI. Wiele narzędzi do zarządzania aplikacjami, monitorowania stanu zdrowia lub monitorowania applicaiton obsługuje WMI po wyjęciu z pudełka.

Nie polecam więc logowania użycia procesora w aplikacji do pliku dziennika.

Jeśli uważasz, że dostępność i wydajność ma kluczowe znaczenie, a następnie przejdź do rozwiązań takich jak rozwiązanie Microsoft Operations manager.

Aby dowiedzieć się więcej o WMI i uzyskać listę procesów patrz poniżej: - Win32_PerfFormattedData_PerfProc_Process Aby uzyskać Czas procesora, filtr jest processID Zobacz ten artykuł - Możesz pobrać processID z klasy Win32_process.

WMI Made Easy For C# by 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());
} 

Możesz również monitorować proces ze zdalnego systemu.

 3
Author: sundar venugopal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-01 09:16:04

Ten artykuł o projekcie kodu opisuje jak używać timera o wysokiej wydajności:

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

Możesz go użyć do czasu wykonania kodu.

Tutaj możesz znaleźć kilka otwartych profili C#:

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

 -2
Author: Ashley Davis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-11 10:56:40