2012-06-10 10 views
5

Nasz model biznesowy wymaga obciążania użytkowników na podstawie godzin/zużycia procesora.Obliczanie użycia procesora

Początkowo myślałem o tym, aby po prostu użyć StopWatch, a następnie użyć czasu, który upłynął jako jednostka miary.

Ale problem z tym podejściem polega na tym, że w dniu, w którym 5000 użytkowników trafia na serwer, czas, jaki upłynął dla tego samego fragmentu kodu, będzie wyższy niż w nocy, kiedy tylko 50 użytkowników uderza w serwer.

Inną opcją jest obciążanie użytkowników na podstawie iteracji wykonanych na danych przekazanych przez użytkowników. Istnieje kilka problemów związanych z tym podejściem.

  • Niektóre funkcje nie wymagają żadnej iteracji danych.
  • Wykorzystanie procesora dla x + y jest niższe niż w przypadku x + y * z.

Jaki jest dobry sposób obliczania informacji o wykorzystaniu procesora w C#/.NET, aby pozostał taki sam dla wszystkich użytkowników dla tej samej operacji, niezależnie od obciążenia serwera?

Prawdopodobnie, całkowita liczba rzeczywistych instrukcji na poziomie zespołu? Czy istnieje sposób, aby uzyskać te informacje w języku C#?

Jakie inne podejścia, rekomendacje możesz udostępniać?

Wielkie dzięki za rozpatrzenie tego.

Odpowiedz

14

Wykonaj wszystko, co użytkownicy chcą uruchomić w oddzielnym process i po zakończeniu procesu odszukaj jego CPU time. Różni się to również od czasu zegarowego, ponieważ uwzględnia tylko czas, w jakim proces faktycznie przebiegł na CPU.

Minimal przykład dla tych, którzy nie chcą czytać dokumentację:

ProcessStartInfo psi = new ProcessStartInfo(@"C:\Blah\Foo.exe"); 
Process p = Process.Start(psi); 
p.WaitForExit(); 
TimeSpan time = p.TotalProcessorTime; 
p.Close(); 

Możesz uruchomić to asynchronicznie, choć.

Nie ma potrzeby szacowania, zgadywania lub czarnej magii. W każdym razie nie można tego obliczyć w wiarygodny sposób.

+2

Czy możesz podzielić się przykładami wykonania kodu w oddzielnym procesie i uzyskaniem czasu procesora? – Moon

+0

+1 dla "dla tych, którzy nie chcą czytać dokumentacji" (jak również dla otrzymania poprawnej odpowiedzi :-)) – phoog

+0

BTW, co jeśli chcę śledzić użycie tylko jednej funkcji? Mogę zawinąć ten kod wewnątrz exe. Ale czy istnieje lepszy sposób? Jeśli funkcja wykonuje inne zadanie w wątku tła, czy będą one częścią tego samego procesu i będą miały wpływ na 'TotalProcessTime'? – Moon