Chciałbym monitorować wykorzystanie pamięci / procesora jednego procesu w czasie rzeczywistym. Podobny, top
ale ukierunkowany tylko na jeden proces, najlepiej z pewnego rodzaju wykresem historycznym.
Chciałbym monitorować wykorzystanie pamięci / procesora jednego procesu w czasie rzeczywistym. Podobny, top
ale ukierunkowany tylko na jeden proces, najlepiej z pewnego rodzaju wykresem historycznym.
Odpowiedzi:
W systemie Linux top
faktycznie 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
top -p `pgrep -f /usr/bin/kvm`
.
hostname
_pid.txt; exit'and
htop
jest 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
top
ma również kolory. Prasa z
.
top
ma 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).
htop -p PID
będzie działać, podobnie jak przykład podany przez @Michaela Mrożka.
Poniższy wykres historii adresów pewnego rodzaju . psrecord
Pakiet 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:
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-tk
eksplorator wykresów oparty na Tkinter ( może być potrzebny), który można wyeksportować:
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-stack
wielofunkcyjne (od autorów Grafany) psutil
i statsd
klient. procmon.py
zapewnia 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:
Zamiast skryptu Python wysyłającego metryki do Statsd telegraf
(i procstat
wtyczki wejściowej) można użyć do bezpośredniego przesłania metryk do Graphite.
Minimalna telegraf
konfiguracja 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
(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 ( sysdig
rozszerzenie napisane w Lua).
pgrep --help
na ratunek. Jest przynajmniej --newest
i --oldest
.
Ctrl+C
psrecord proces psrecord po prostu kończy pracę bez zapisywania wykresu, należy zakończyć testowany proces.
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 1234
gdzie 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.
$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.
top
wynik jest przeciętny $delay
. Por. Jak obliczyć zużycie procesora
Zwykle używam następujących dwóch:
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.
daemontools : zbiór narzędzi do zarządzania usługami UNIX
Używając top
i awk
moż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 $delay
opóźniony ze względu na to, jak top
dział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
.
Jeśli znasz nazwę procesu, możesz użyć
top -p $(pidof <process_name>)
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
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)
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.
top
faktycznie oferują tę funkcję. Moja wersja na Fedorze 19 nie. To samo dotyczy Ubuntu 13.04.