2013-08-23 20 views
10

chcę mieć bieżące wykorzystanie procesora w moim projekcieuzyskać bieżące wykorzystanie procesora w C#

namespace Monitoring_Tool 
{ 
    public partial class ajaxExecute : System.Web.UI.Page 
    { 
     private PerformanceCounter theCPUCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total"); 
     private PerformanceCounter theMemCounter = new PerformanceCounter("Memory", "Available MBytes"); 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      float cpuUsage = 0.00F; 

      cpuUsage = this.theCPUCounter.NextValue(); 
     } 
    } 
} 

Kiedy debugować mojego projektu, wartość w cpuUsage pokazuje 0.00 ale kiedy robię QuickWatch na this.theCPUCounter.NextValue(); to pokazano 20.6786852 .

Dlaczego nie mogę zapisać go w zmiennej?

+2

Głupia uwaga, ale być może jeszcze nie przekroczyłeś instrukcji podczas debugowania, więc nowa wartość nie jest jeszcze przechowywana w zmiennej 'cpuUsage'? – Mr47

Odpowiedz

9

To dlatego, że należy wielokrotnie wywoływać numer NextValue na tej samej instancji PerformanceCounter (co najmniej dwa razy). Pierwsze wywołanie zawsze zwraca 0.

Można obejść ten (sort of), wywołując NextValue dwukrotnie w swojej obsługi zdarzeń Page_Load tylko przechowywanie wartości zwracanej drugiego naboru:

 float cpuUsage = 0.00F; 

     this.theCPUCounter.NextValue(); 
     cpuUsage = this.theCPUCounter.NextValue(); 

Powód to pokazuje w QuickWatch debuggera prawdopodobnie dlatego, że jest (niejawnie) wywoływana wiele razy (raz przez program i raz przez debugger dla wartości QuickWatch).

Aktualizacja do „rodzaju” powyżej:

Jak wspominają inni zwykle trzeba spać trochę czasu pomiędzy dwoma połączeniami do obserwowania rzeczywistości różnica w obciążeniu procesora, które prowadzą do „wymierny” różnicy. Spanie przez 1 s zwykle powoduje lewę, ale może nie być wystarczającym opóźnieniem w załadowaniu twojej strony.

Co naprawdę chcesz zrobić, to podać wątek w tle, który wielokrotnie odpytuje ten licznik wydajności, śpiąc kilka sekund pomiędzy. I przechowując gdzieś wynik. Od Twojego Page_Load lub innych zdarzeń/funkcji zapytaj (ostatnią) wartość. Wszystko z koniecznym zablokowaniem przed wyścigami danych oczywiście. Będzie to tak dokładne, jak można uzyskać w odniesieniu do tego wskaźnika.

Ponieważ oczywiście używasz ASP.NET, musisz zachować ostrożność w przypadku takich wątków w tle. Nie jestem ekspertem ASP.NET, ale zgodnie z this powinno być możliwe, nawet jeśli wątek (i odczyty licznika doskonałości), które zostały zrobione, zostaną poddane recyklingowi, gdy twoja domena aplikacji/aplikacja internetowa jest. Jednak w przypadku tego rodzaju funkcji nie powinno to stanowić problemu.

+1

"Pierwsze wywołanie zawsze zwróci 0." czy istnieje ku temu powód? – sab669

+0

@ sab669 Zgodnie z ['documentation'] (https://msdn.microsoft.com/en-us/library/system.diagnostics.performancecounter.nextvalue.aspx):" Jeśli obliczona wartość licznika zależy od dwóch liczników czyta, pierwsza operacja odczytu zwraca 0.0 ". Liczniki "% Processor Time" wymagają stanu, aby dać ci odpowiedź, a pierwsze wywołanie w nich nie ma stanu do porównania, ale mają go zwrócić 0. Więcej informacji [tutaj] (http://stackoverflow.com/a/18399097/5095502). – Quantic

9

Jest to licznik wydajności, który w znacznym stopniu zależy od , gdy czytasz go pod. Rdzeniem procesora jest kod wykonujący pełny otwór w "100%". Lub jest całkowicie wyłączony, zatrzymany przez instrukcję HALT. Licznik "% czasu procesora" informuje o ile% czasu, od czasu ostatniego sprawdzenia,, wykonywał kod.

Dzięki temu otrzymasz wartości tylko wtedy, gdy poczekasz wystarczająco długo między próbkowaniem. Jedna sekunda to schemat standardowy, tak jest w Perfmon.exe i Taskmgr.exe. Im krótszy odstęp, tym mniej dokładna jest liczba. Zaczyna zmieniać się gwałtownie, skacząc między 0 a 100%.

Uzyskanie 0% zdarzenia Load strony jest normalne, po prostu inicjalizuje licznik, aby ustawić początek interwału. Uzyskanie próbki jest trudne, nie można tego realistycznie zrobić w module obsługi zdarzeń. Musiałbyś zrobić coś drastycznego, jak posiadanie osobnego licznika czasu lub wątku próbkującego w odstępach jednej sekundy i używać tej wartości.

Powiązane problemy