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.
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.
Odpowiedzi:
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
top -p `pgrep -f /usr/bin/kvm`.
hostname_pid.txt; exit'and
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
topma również kolory. Prasa z.
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).
htop -p PIDbędzie działać, podobnie jak przykład podany przez @Michaela Mrożka.
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:

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ć:
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:
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(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).
pgrep --helpna ratunek. Jest przynajmniej --newesti --oldest.
Ctrl+Cpsrecord 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 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.
$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.
topwynik 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 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.
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.
topfaktycznie oferują tę funkcję. Moja wersja na Fedorze 19 nie. To samo dotyczy Ubuntu 13.04.