2008-11-09 15 views
35

Pracuję nad programem działającym w tle, który będzie działał przez długi czas i mam program zewnętrznego rejestrowania (SmartInspect), który chcę okresowo podawać z niektórymi wartościami, aby monitorować go w czasie rzeczywistym podczas debugowania.Czy program C# może w jakiś sposób mierzyć wykorzystanie własnego procesora?

Wiem, że mogę po prostu uruchomić wiele programów, takich jak Menedżer zadań lub IARSN TaskInfo, ale chciałbym zachować wszystko w swoim własnym programie, ponieważ chcę również dodać proste zasady, takie jak program używa więcej niż X% CPU, zaznacz to w dzienniku.

Mam wątek tła, które okresowo żywi pewne statystyki do SmartInspect, jak zużycie pamięci, ustawić roboczą itp

Czy jest możliwe dla tego wątku, aby uzyskać dość dokładną miarę jak dużo zasobów procesora w komputerze to konsumuje? Główny program jest aplikacją jednowątkową (poza wątkiem watchdoga, który rejestruje statystyki), więc jeśli technika jest ograniczona do , to jak bardzo pojedynczy wątek będzie używać, to też byłoby dobre.

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


Edit: Ok, próbowałem drogę liczników wydajności, ale to dodaje sporo GC-danych za każdym razem o nazwie, więc wykres dla wykorzystania pamięci i zbierania śmieci gwałtownie wzrosła. Chyba zostawię tę część na razie.

Odpowiedz

46

Można również użyć właściwości System.Diagnostics.Process.TotalProcessorTime i System.Diagnostics.ProcessThread.TotalProcessorTime do obliczenia wykorzystania procesora, jak opisuje to article.

+0

To działało znacznie lepiej i nie dodało tak dużego nacisku na GC, tylko niewielki wzrost. Dzięki! –

+0

@axk Artykuł nie wydaje się być dostępny, czy może ukończyć odpowiedź, która tylko wskazuje, jak odzyskać TYLKO bieżącą część procesora? – J4N

8

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

+1

Ta odpowiedź pracował dla mnie najlepsza. Chciałbym jednak dodać, że: 1. Musisz upewnić się, że otrzymujesz następną wartość z licznika raz na sekundę lub rzadziej niż to, lub wyniki są wyłączone, i 2. Jeśli patrzysz na procesor statystyki, musisz podzielić to przez Environment.ProcessorCount inaczej uzyskasz zwariowane procenty, takie jak do 800% na maszynie z 8 rdzeniami. –

3

To dobrze, że logujesz się do monitorów takich jak smartinspect. Ale same okna zbierają dane dla każdego zasobu w tym przypadku twojego programu (lub procesu). Usługa WMI jest standardem monitorowania aplikacji. Możemy przeglądać dane przechwycone przez WMI. Wiele narzędzi do zarządzania aplikacjami, monitorowania zdrowia lub narzędzi do monitorowania aplikacji obsługuje WMI od razu po wyjęciu z pudełka.

Nie polecam rejestrowania wykorzystania procesora w aplikacji do pliku dziennika.

Jeśli sądzisz, że dostępność i wydajność są kluczowe, sięgnij po rozwiązania, takie jak rozwiązanie Microsoft Operations Manager.

Aby zorientować się o WMI i uzyskać wykaz procesu patrz poniżej: - Win32_PerfFormattedData_PerfProc_Process dostać czasu procesora, filtr jest processID See this article - Można uzyskać ProcessID z klasy Win32_Process.

WMI Made Easy For C# 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żna monitorować proces ze zdalnego systemu, jak również.

+2

To jest ściśle narzędzie do debugowania, a kod, który się loguje, nie zostanie nawet skompilowany do wersji wydania. W tym celu skompilowane zostanie tylko logowanie na poziomie metod, na wypadek, gdy muszę spróbować odtworzyć dziwną awarię na innym komputerze. Dzięki za szczegółowe informacje, zanotowałem to. –

-2

Kod ten artykuł projekt opisuje jak korzystać z wysokiej wydajności stoper:

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

Można go używać do czasu wykonania kodu.

Tutaj można znaleźć szereg open source C# profilers:

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

+0

Nie potrzebowałem timera, potrzebowałem sposobu na sprawdzenie, ile procesora używał program w danym okresie czasu, nie jest to bezpośrednio związane z czasem podjęte mogą być operacje we/wy, które blokują na przykład. –

Powiązane problemy