Śledzenie użycia procesora i pamięci na proces

163

Podejrzewam, że jedna z moich aplikacji zjada więcej cykli procesora, niż chcę. Problem w tym, że dzieje się to w seriach, a samo spojrzenie na menedżera zadań nie pomaga mi, ponieważ pokazuje tylko natychmiastowe użycie.

Czy istnieje sposób (w systemie Windows) na śledzenie historii użycia procesora i pamięci w jakimś procesie. Np. Zacznę śledzić "firefoxa", a po mniej więcej godzinie zobaczę wykres wykorzystania procesora i pamięci w tej godzinie.

Szukam gotowego narzędzia lub programowego sposobu, aby to osiągnąć.

Eli Bendersky
źródło

Odpowiedzi:

167

Wystarczy wpisać perfmondo Start > Runi naciśnij enter. Gdy okno Wydajność jest otwarte, kliknij znak +, aby dodać nowe liczniki do wykresu. Liczniki to różne aspekty działania komputera i są grupowane według podobieństwa w grupy zwane „Obiektem wydajności”.

W przypadku pytań można wybrać obiekty wydajności „Proces”, „Pamięć” i „Procesor”. Możesz wtedy zobaczyć te liczniki w czasie rzeczywistym

Możesz również określić narzędzie, aby zapisać dane dotyczące wydajności do późniejszej inspekcji. Aby to zrobić, wybierz „Dzienniki wydajności i alerty” w panelu po lewej stronie. (Znajduje się tuż pod konsolą Monitora systemu, która zapewnia nam wspomniane wyżej liczniki. Jeśli go tam nie ma, kliknij „Plik”> „Dodaj / usuń przystawkę”, kliknij Dodaj i wybierz z listy „Dzienniki wydajności i alerty” ".) Z" Dzienników wydajności i alertów "utwórz nową konfigurację monitorowania w" Dzienniki liczników ". Następnie możesz dodać liczniki, określić częstotliwość próbkowania, format dziennika (binarny lub zwykły tekst) i lokalizację dziennika.

Martin08
źródło
1
Jaki jest idealny interwał, aby pobrać próbkę danych z dziennika liczników?
Steph Rose,
8
MS oczywiście zmieniło interfejs użytkownika na PerformanceMonitor odkąd to napisałeś. Masz jakiś pomysł, jak to zrobić w systemie Windows 2008 R2?
Martin Brown
5
@MartinBrown - znalazłem to . To jest świetne.
JNF
2
ktoś wie, jak zrobić drugą część zapisywania logowania na Vista?
Wygląda na to, że
11
Kliknij prawym przyciskiem myszy Zestawy modułów zbierających dane -> Zdefiniowane przez użytkownika. Wybierz Nowy-> Zestaw kolektorów danych. Nadaj mu nazwę i wybierz Utwórz ręcznie. Kliknij Następny. Wybierz Licznik wydajności. Kliknij Następny. Dodaj liczniki wydajności i wprowadź interwał próbkowania. Następnie w sekcji Zestawy modułów zbierających dane kliknij zestaw prawym przyciskiem myszy i kliknij „Start”. Po jakimś czasie klikasz prawym przyciskiem na swoim zestawie i klikasz „Stop”. Następnie możesz znaleźć raport w Raporty-> Zdefiniowane przez użytkownika-> Twój zestaw. Kliknij prawym przyciskiem myszy wykres i wybierz Zapisz dane jako.
Gremio
43

Process Explorer może wyświetlać całkowity czas procesora zajęty przez proces, a także wykres historii dla każdego procesu.

Niall
źródło
3
Jak więc użyłbyś tego do znalezienia procesu, który losowo zaczyna zużywać więcej pamięci lub mocy procesora w krótkiej serii. Czy mógłbyś to rozwinąć?
Xitcod13
Kliknij prawym przyciskiem myszy nagłówki kolumn, wybierz opcję Wybierz kolumny, a następnie zaznacz opcję „Historia procesora” w sekcji „Wydajność procesu”
Laurent,
czy możesz zresetować go do zera?
Simon_Weaver
Czy mogę zalogować się do pliku zużycia pamięci przez dany PID?
Royi
Chciałem tylko zwrócić uwagę innym użytkownikom: wykres procesora dla każdego procesu zaczyna się nagrywać dopiero po pierwszym otwarciu, nawet jeśli Process Explorer był otwarty, więc ta metoda jest praktycznie bezużyteczna do przechwytywania sporadycznego zdarzenia i próby jego izolacji do jednego procesu. Zwrócę uwagę, że jeśli klikniesz globalny wykres procesora systemu (który rozpoczyna nagrywanie po otwarciu Eksploratora procesów) i najedziesz kursorem myszy na dowolny punkt, pokaże on proces, który w tym momencie najwięcej wykorzystywał procesor.
SUM 1
19

Korzystając z perfmon.exe, próbowałem użyć licznika „Bajty prywatne” w obszarze Liczniki „Proces” do śledzenia użycia pamięci i działa to dobrze.

CppNoob
źródło
1
To jest poprawna odpowiedź. Możesz również uzyskać informacje o procesorze w obszarze Proces. Kliknij Przetwarzaj, a następnie wybierz swoją aplikację (w Twoim przykładzie Firefox) pod instancjami wybranego obiektu.
Chris McCowan,
11

może możesz tego użyć. Powinien zadziałać i zgłosić czas procesora dla określonego procesu.

@echo off
: Rich Kreider <[email protected]>
: report processor time for given process until process exits (could be expanded to use a PID to be more
: precise)
: Depends:  typeperf
: Usage:  foo.cmd <processname>

set process=%~1
echo Press CTRL-C To Stop...
:begin
for /f "tokens=2 delims=," %%c in ('typeperf "\Process(%process%)\%% Processor Time" -si 1 -sc 1 ^| find /V "\\"') do (
if %%~c==-1 (
goto :end
) else (
echo %%~c%%
goto begin
)
)

:end
echo Process seems to have terminated.
Rich Kreider
źródło
7

Zgadzam się, perfmon.exe umożliwia dodawanie liczników (kliknij prawym przyciskiem myszy w prawym panelu) dla dowolnego procesu, który chcesz monitorować.

Obiekt wydajności: Sprawdź proces „Wybierz instancje z listy” i wybierz firefox.

Ady Romantika
źródło
1
Dzięki. Jak wyświetlić historię użycia procesora w określonym z góry czasie, np. Godzinę?
Eli Bendersky,
6

WMI to Windows Management Instrumentation i jest wbudowane we wszystkie najnowsze wersje systemu Windows. Pozwala programowo śledzić takie rzeczy, jak użycie procesora, operacje wejścia / wyjścia dysku i użycie pamięci.

Perfmon.exe jest interfejsem użytkownika z graficznym interfejsem użytkownika i może monitorować proces, zapisywać informacje w dzienniku i umożliwiać analizę dziennika po fakcie. Nie jest to najbardziej elegancki program na świecie, ale spełnia swoje zadanie.

doflynn
źródło
5
Z technicznego punktu widzenia perfmon jest interfejsem do bazowego interfejsu API licznika wydajności systemu Windows, który poprzedza WMI o wiele lat. Usługa WMI udostępnia również interfejs API licznika wydajności w swojej przestrzeni nazw.
Rob Walker,
2

Process Lasso jest przeznaczony bardziej do automatyzacji procesów i optymalizacji klas priorytetów, a nie do tworzenia wykresów. Powiedział, że ma oferty historię poszczególnych procesów wykorzystania CPU (narysowany jako biała linia na wykresie), ale to nie nie oferują historię poszczególnych procesów wykorzystania pamięci.

OŚWIADCZENIE: Jestem autorem Process Lasso, ale tak naprawdę nie popieram go tutaj - ponieważ są lepsze rozwiązania (perfmon jest najlepsze).

Najlepszą rzeczą na świecie jest Monitor zasobów i wydajności systemu Windows Vista +. Może śledzić wykorzystanie procesora, pamięci, sieci i dysków przez procesy w czasie. Jest to świetne narzędzie do generowania informacji o systemie, które powinno zostać utworzone dawno temu. O ile się nie mylę, może śledzić wykorzystanie procesora na proces i pamięci w czasie (między innymi wymienionymi rzeczami).

dyasta
źródło
2

Możesz również spróbować użyć skryptu C # / Perl / Java, aby uzyskać dane dotyczące wykorzystania za pomocą poleceń WMI, a poniżej przedstawiono odpowiednie kroki.

Musimy wykonać 2 zapytania WMI Select i zastosować formułę procentowego wykorzystania procesora

1. Aby pobrać całkowitą liczbę procesów logicznych

select NumberOfLogicalProcessors from Win32_ComputerSystem

2. Aby pobrać wartości PercentProcessorTime, TimeStamp_Sys100NS (zastosowano formułę wykorzystania procesora, aby uzyskać rzeczywisty procent wykorzystania) i WorkingSetPrivate (RAM) minimum 2 razy z interwałem uśpienia wynoszącym 1 sekundę

select * from Win32_PerfRawData_PerfProc_Process where IDProcess=1234

3. Zastosuj wzór na% wykorzystania procesora

CPU%= ((p2-p1)/(t2-t1)*100)/NumberOfLogicalProcessors

p2 wskazało PercentProcessorTime pobrane po raz drugi, a p1 wskazało PercentProcessorTime pobrane po raz pierwszy, t2 i t1 dotyczą TimeStamp_Sys100NS.

Przykładowy kod Perla do tego można znaleźć pod linkiem http://www.craftedforeveryone.com/cpu-and-ram-utilization-of-an-application-using-perl-via-wmi/

Ta logika dotyczy wszystkich języków programowania, które obsługują zapytania WMI

Kaarthikeyan
źródło
WMI i Powershell?
PreguntonCojoneroCabrón
2

Chociaż tego nie wypróbowałem, ProcDump wydaje się lepszym rozwiązaniem.

Opis ze strony:

ProcDump to narzędzie wiersza poleceń, którego głównym celem jest monitorowanie aplikacji pod kątem skoków mocy procesora i generowanie zrzutów awaryjnych podczas skoków, których administrator lub programista może użyć do określenia przyczyny takiego wzrostu. ProcDump obejmuje również monitorowanie zawieszonych okien (przy użyciu tej samej definicji zawieszenia okna, których używa system Windows i Menedżer zadań), monitorowanie nieobsługiwanych wyjątków i może generować zrzuty na podstawie wartości liczników wydajności systemu. Może również służyć jako ogólne narzędzie do zrzutu procesów, które można osadzić w innych skryptach.

Sean
źródło
1

Hmm, widzę, że Process Explorer może to zrobić, chociaż jego wykresy nie są zbyt wygodne. Wciąż szukam alternatywnych / lepszych sposobów, aby to zrobić.

Eli Bendersky
źródło
1

Perfmon.exe jest wbudowany w system Windows.

Programista SaaS
źródło
1

W systemie Windows 10 Menedżer zadań może wyświetlać skumulowane godziny pracy procesora. Po prostu przejdź do zakładki „Historia aplikacji” i „Usuń historię użytkowania”. Teraz zostaw wszystko uruchomione na godzinę lub dwie:

Skumulowany czas procesora w systemie Windows 10

To NIE powoduje podziału użycia w przeglądarkach według kart. Dość często nieaktywne karty wykonują ogromną ilość pracy, a każda otwarta karta zużywa energię i spowalnia komputer.

Bryce
źródło
1

Było wymaganie, aby uzyskać status i użycie procesora / pamięci niektórych określonych serwerów Windows. Użyłem poniższego skryptu:

To jest przykład usługi wyszukiwania systemu Windows.

  $cpu = Get-WmiObject win32_processor
  $search = get-service "WSearch"
  if ($search.Status -eq 'Running')
  {
  $searchmem = Get-WmiObject Win32_Service -Filter "Name = 'WSearch'"
  $searchid = $searchmem.ProcessID
  $searchcpu1 = Get-WmiObject Win32_PerfRawData_PerfProc_Process | Where {$_.IDProcess -eq $searchid}
  Start-Sleep -Seconds 1
  $searchcpu2 = Get-WmiObject Win32_PerfRawData_PerfProc_Process | Where {$_.IDProcess -eq $searchid}
  $searchp2p1 = $searchcpu2.PercentProcessorTime - $searchcpu1.PercentProcessorTime
  $searcht2t1 = $searchcpu2.Timestamp_Sys100NS - $searchcpu1.Timestamp_Sys100NS
  $searchcpu = [Math]::Round(($searchp2p1 / $searcht2t1 * 100) /$cpu.NumberOfLogicalProcessors, 1)
  $searchmem = [Math]::Round($searchcpu1.WorkingSetPrivate / 1mb,1)
  Write-Host 'Service is' $search.Status', Memory consumed: '$searchmem' MB, CPU Usage: '$searchcpu' %'
  }

  else
  {
  Write-Host Service is $search.Status -BackgroundColor Red
  }
Prosenjit Sen
źródło
0

Używam taskinfo do wykresu historii prędkości procesora / pamięci RAM / IO. http://www.iarsn.com/taskinfo.html

Ale wybuchy braku reakcji brzmią bardziej jak czas przerwania z powodu fałszywego dysku HD / SS.

Terrik
źródło