Jak monitorować wykorzystanie procesora / pamięci w jednym procesie?

170

Chciałbym monitorować wykorzystanie pamięci / procesora jednego procesu w czasie rzeczywistym. Podobny, topale ukierunkowany tylko na jeden proces, najlepiej z pewnego rodzaju wykresem historycznym.

Josh K.
źródło
Jakie statystyki pamięci chcesz? Jest ich dużo.
vwduder
Zużycie pamięci w danym przedziale czasowym, bieżące użycie, maksymalne wykorzystanie, średnia.
Josh K

Odpowiedzi:

139

W systemie Linux topfaktycznie koncentruje się na pojedynczym procesie, chociaż oczywiście nie ma wykresu historii:

top -p PID

Jest to również dostępne w systemie Mac OS X z inną składnią:

top -pid PID
Michał Mrożek
źródło
9
A ponieważ możesz nie chcieć za każdym razem sprawdzać PID, spróbuj czegoś takiego top -p `pgrep -f /usr/bin/kvm`.
Stefan Lasiewski,
Używam kaktusów do monitorowania niektórych indywidualnych procesów, ale instalacja pełnej wersji instalacji kaktusów wydaje się zbyt złożona, by poradzić sobie z prostą sytuacją, o którą tu pytamy.
Stefan Lasiewski,
@Stefan: Zakładam, że musiałbym uruchomić to zdalnie?
Josh K
@Josh: Tak, musisz uruchomić Cacti (który wymaga MySQL, Apache i kilku innych pakietów) na innym serwerze. W większości dystrybucji dystrybucja jest dość prosta przy użyciu Yum lub apt-get.
Stefan Lasiewski,
@Stefan, jeśli chcesz zdalnie sprawdzić, możesz zrobić ssh @ remotehost 'top -p PID> ~ hostname_pid.txt; exit'and
klerk
61

htopjest doskonałym zamiennikiem top. Ma ... Kolory! Proste skróty klawiaturowe! Przewiń listę za pomocą klawiszy strzałek! Zabij proces bez wychodzenia i bez odnotowywania PID! Oznacz wiele procesów i zabij je wszystkie!

Wśród wszystkich funkcji strona podręcznika mówi, że możesz nacisnąć, Faby wykonać proces.

Naprawdę powinieneś spróbować htop. Nigdy więcej nie zacząłem top, po raz pierwszy htop.

Wyświetl pojedynczy proces:

htop -p PID

Denilson Sá Maia
źródło
7
+1 za htop. Jest to jeden z pierwszych programów, które instaluję w nowym systemie. To znacznie ułatwia mi życie. Widok drzewa jest również bardzo przydatny.
Barthelemy
9
topma również kolory. Prasa z.
tshepang
2
Masz rację! topma kolory! Szkoda, że ​​jego kolory są dość bezużyteczne, szczególnie w porównaniu do htop(które zanika procesy innych użytkowników i podkreśla basename programu).
Denilson Sá Maia,
1
I też htop -p PIDbędzie działać, podobnie jak przykład podany przez @Michaela Mrożka.
noisebleed
1
Jedynym powodem, dla którego warto użyć top, jest to, że htop jest niedostępny lub nie można go zainstalować. Właśnie dlatego utworzono htop, aby zapewnić znacznie więcej funkcji.
lepe
59

psrecord

Poniższy wykres historii adresów pewnego rodzaju . psrecordPakiet Python robi dokładnie to.

pip install psrecord                             # local user install
sudo apt-get install python-matplotlib python-tk # for plotting; or via pip

W przypadku pojedynczego procesu jest to (zatrzymane przez Ctrl+C):

psrecord $(pgrep proc-name1) --interval 1 --plot plot1.png

W przypadku kilku procesów pomocny jest następujący skrypt do synchronizacji wykresów:

#!/bin/bash    
psrecord $(pgrep proc-name1) --interval 1 --duration 60 --plot plot1.png &
P1=$!
psrecord $(pgrep proc-name2) --interval 1 --duration 60 --plot plot2.png &
P2=$!
wait $P1 $P2
echo 'Done'

Wykresy wyglądają następująco: przykład psrecord

profiler pamięci

Pakiet zapewnia RSS-tylko próbkowania (plus niektóre opcje specyficzne dla Pythona). Może także rejestrować proces z procesami potomnymi (patrz mprof --help).

pip install memory_profiler
mprof run /path/to/executable
mprof plot

Domyślnie wyświetla się python-tkeksplorator wykresów oparty na Tkinter ( może być potrzebny), który można wyeksportować:

mprof

grafit-stos i statystyki

Może to wydawać się przesadą dla prostego jednorazowego testu, ale dla czegoś takiego jak kilkudniowe debugowanie jest z pewnością rozsądne. Poręczne urządzenie raintank/graphite-stackwielofunkcyjne (od autorów Grafany) psutili statsdklient. procmon.pyzapewnia wdrożenie.

$ docker run --rm -p 8080:3000 -p 8125:8125/udp raintank/graphite-stack

Następnie w innym terminalu, po uruchomieniu procesu docelowego:

$ sudo apt-get install python-statsd python-psutil # or via pip
$ python procmon.py -s localhost -f chromium -r 'chromium.*'

Następnie otwierając Grafana na http: // localhost: 8080 , uwierzytelnianie jako admin:admin, konfigurowanie źródła danych https: // localhost , możesz wykreślić wykres jak:

wykres grafana

stos grafitowy i telegraf

Zamiast skryptu Python wysyłającego metryki do Statsd telegraf(i procstatwtyczki wejściowej) można użyć do bezpośredniego przesłania metryk do Graphite.

Minimalna telegrafkonfiguracja wygląda następująco:

[agent]
  interval = "1s"

[[outputs.graphite]]
  servers = ["localhost:2003"]
  prefix = "testprfx"

[[inputs.procstat]]
  pid_file = "/path/to/file/with.pid"

Następnie uruchom linię telegraf --config minconf.conf. Część Grafana jest taka sama, z wyjątkiem nazw metryk.

sysdig

sysdig(dostępne w repozytoriach Debiana i Ubuntu) z interfejsem użytkownika sysdig-inspect wyglądają bardzo obiecująco, dostarczając niezwykle drobiazgowych szczegółów wraz z wykorzystaniem procesora i RSS, ale niestety interfejs użytkownika nie jest w stanie ich renderować i sysdig nie może filtrować procinfo zdarzenia według procesu na czas pisania. Chociaż powinno to być możliwe dzięki niestandardowemu dłutowi ( sysdigrozszerzenie napisane w Lua).

saaj
źródło
pgrep systemd podaje wiele wierszy danych wyjściowych, a tym samym błędy psrecord, co należy zrobić? Chcę tylko przetestować w dowolnym procesie.
EralpB,
1
@EralpB pgrep --helpna ratunek. Jest przynajmniej --newesti --oldest.
saaj
2
To powinna być zaakceptowana odpowiedź, ponieważ faktycznie daje wykres historii wykorzystania pamięci. Uwaga: w przypadku metody Ctrl+Cpsrecord proces psrecord po prostu kończy pracę bez zapisywania wykresu, należy zakończyć testowany proces.
user2561747
8

Aby użyć tych informacji w skrypcie, możesz to zrobić:

calcPercCpu.sh

#!/bin/bash
nPid=$1;
nTimes=10; # customize it
delay=0.1; # customize it
strCalc=`top -d $delay -b -n $nTimes -p $nPid \
  |grep $nPid \
  |sed -r -e "s;\s\s*; ;g" -e "s;^ *;;" \
  |cut -d' ' -f9 \
  |tr '\n' '+' \
  |sed -r -e "s;(.*)[+]$;\1;" -e "s/.*/scale=2;(&)\/$nTimes/"`;
nPercCpu=`echo "$strCalc" |bc -l`
echo $nPercCpu

użyj jak: calcPercCpu.sh 1234gdzie 1234 jest pid

Dla podanego $ nPid będzie mierzył średnio 10 migawek użycia procesora w ciągu całej 1 sekundy (opóźnienie 0,1 s każdy * nTimes = 10); co zapewnia dobry i szybki dokładny wynik tego, co dzieje się w danym momencie.

Dostosuj zmienne do swoich potrzeb.

Wodnik Moc
źródło
Uhm, 10 procesów do monitorowania użycia procesora na poziomie 1?
xebeche
@xebeche „będzie mierzyć średnio 10 migawek” „nTimes = 10; # customize it” :)
Aquarius Power
Chodzi mi o to, że nie podoba mi się to, że wywołujesz 10 procesów w celu pobrania 1 cyfry ( $nPercCpu): shell, top, grep, sed, cut ... bc. Wiele, jeśli nie wszystkie z nich, można na przykład połączyć w skrypt 1 Sed lub Awk.
xebeche
@xebeche spoko, nie krępuj się edytować dodając lepsze polecenie do istniejącego (alternatywnie), masz moją ciekawość :)
Aquarius Power
1
Dodałem własną odpowiedź . BTW, zauważ, że nie ma sensu obliczać średniej, ponieważ topwynik jest przeciętny $delay. Por. Jak obliczyć zużycie procesora
xebeche
5

Zwykle używam następujących dwóch:

  1. Suwmiarka HP : to bardzo dobre narzędzie do monitorowania procesów, można również sprawdzić wykres połączeń i inne informacje niskiego poziomu. Pamiętaj jednak, że jest bezpłatny tylko do użytku osobistego.

  2. daemontools : zbiór narzędzi do zarządzania usługami UNIX

Hemant
źródło
6
Przez lata korzystałem z Daemontools. Jest świetny jako nadzorca / organ nadzorczy dla innych procesów. W jaki sposób pomaga monitorować użycie procesora / pamięci dla jednego procesu?
Stefan Lasiewski,
3

Używając topi awkmożna łatwo stworzyć np. Oddzielony przecinkami dziennik użycia % CPU ( $9) +% MEM ( $10), który można później wprowadzić do dowolnego narzędzia statystycznego i graficznego.

top -b -d $delay -p $pid | awk -v OFS="," '$1+0>0 {
print strftime("%Y-%m-%d %H:%M:%S"),$1,$NF,$9,$10; fflush() }'

Wyjście będzie jak

2019-03-26 17:43:47,2991,firefox,13.0,5.2
2019-03-26 17:43:48,2991,firefox,4.0,5.2
2019-03-26 17:43:49,2991,firefox,64.0,5.3
2019-03-26 17:43:50,2991,firefox,71.3,5.4
2019-03-26 17:43:51,2991,firefox,67.0,5.4

Nie da to jednak dobrych wyników dla dużych $delay, ponieważ wydrukowany znacznik czasu jest $delayopóźniony ze względu na to, jak topdziała wyjście. Bez wchodzenia w zbyt wiele szczegółów, jednym prostym sposobem na obejście tego jest zarejestrowanie czasu dostarczonego przez top:

top -b -d $delay -p $pid | awk -v OFS="," '$1=="top"{ time=$3 }
$1+0>0 { print time,$1,$NF,$9,$10; fflush() }'

Wówczas znacznik czasu jest dokładny, ale wyjście nadal będzie opóźnione o $delay.

xebeche
źródło
2

Jeśli znasz nazwę procesu, możesz użyć

top -p $(pidof <process_name>)
użytkownik4757345
źródło
8
Tak właśnie brzmi przyjęta odpowiedź sprzed lat i jej pierwszy komentarz.
dhag
1

Jeśli masz wyciętą dystrybucję Linuksa, w której top nie ma opcji na proces (-p) lub powiązanych opcji, możesz przeanalizować dane wyjściowe komendy top dla nazwy procesu, aby uzyskać informacje o zużyciu procesora na proces.

while true;  do top -bn1 | awk '/your_process_name/ {print  $8}' ; sleep 1; done

8 reprezentuje użycie procesora na proces w danych wyjściowych polecenia top w mojej wbudowanej dystrybucji Linuksa

Razan Paul
źródło
1

Brak wystarczającej reputacji do skomentowania, ale w przypadku psrecord możesz także wywołać go bezpośrednio, w sposób programowy, bezpośrednio w Pythonie:

from psrecord.main import monitor
monitor(<pid number>, logfile = "./test.log", plot="./fig.png", include_children=True)
ZettaCircl
źródło
0

Jeśli potrzebujesz średnich z okresu określonego procesu, wypróbuj opcję akumulacji -c na górze:

top -c a -pid PID

„-c a” znaleziono na górze dla Mac 10.8.5.

W Scientific Linux opcja to -S, którą można ustawić interaktywnie.

Kieleth
źródło
Prawdopodobnie zechcesz dodać dalsze szczegóły, które wersje topfaktycznie oferują tę funkcję. Moja wersja na Fedorze 19 nie. To samo dotyczy Ubuntu 13.04.
slm
Masz rację !, Byłem bardzo szczęśliwy, że znalazłem coś przydatnego, zapomniałem, że byłem w komputerze Mac w domu.
Kieleth