Saya ingin memonitor penggunaan memori / cpu satu proses secara real time. Serupa dengan top
tetapi ditargetkan hanya pada satu proses, lebih disukai dengan semacam grafik riwayat.
Saya ingin memonitor penggunaan memori / cpu satu proses secara real time. Serupa dengan top
tetapi ditargetkan hanya pada satu proses, lebih disukai dengan semacam grafik riwayat.
Jawaban:
Di Linux, top
sebenarnya mendukung pemfokusan pada satu proses tunggal, meskipun secara alami tidak memiliki grafik riwayat:
top -p PID
Ini juga tersedia di Mac OS X dengan sintaks yang berbeda:
top -pid PID
top -p `pgrep -f /usr/bin/kvm`
.
hostname
_pid.txt; exit'and
htop
adalah pengganti yang bagus untuk top
. Ini memiliki ... Warna! Pintasan keyboard sederhana! Gulir daftar menggunakan tombol panah! Matikan proses tanpa meninggalkan dan tanpa mencatat PID! Tandai banyak proses dan bunuh semuanya!
Di antara semua fitur, halaman manual mengatakan Anda dapat menekan Funtuk mengikuti proses.
Sungguh, Anda harus mencoba htop
. Saya tidak pernah memulai top
lagi, setelah pertama kali saya gunakan htop
.
Tampilkan satu proses:
htop -p PID
top
juga memiliki warna. Tekan z
.
top
memiliki warna! Sayang sekali warnanya sangat tidak berguna, khususnya bila dibandingkan dengan htop
(yang memudar proses pengguna lain dan menyoroti nama program).
htop -p PID
akan bekerja juga, sama seperti contoh yang diberikan oleh @Michael Mrozek.
Berikut ini semacam grafik riwayat . psrecord
Paket python melakukan hal ini.
pip install psrecord # local user install
sudo apt-get install python-matplotlib python-tk # for plotting; or via pip
Untuk satu proses, berikut ini (dihentikan oleh Ctrl+C):
psrecord $(pgrep proc-name1) --interval 1 --plot plot1.png
Untuk beberapa proses, skrip berikut bermanfaat untuk menyinkronkan bagan:
#!/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'
The paket menyediakan RSS-satunya sampel (ditambah beberapa pilihan Python-spesifik). Itu juga dapat merekam proses dengan proses anak-anaknya (lihat mprof --help
).
pip install memory_profiler
mprof run /path/to/executable
mprof plot
Secara default, ini akan muncul python-tk
explorer grafik berbasis Tkinter ( mungkin diperlukan) yang dapat diekspor:
Ini mungkin tampak berlebihan untuk tes satu kali yang sederhana, tetapi untuk sesuatu seperti debugging beberapa hari, itu pasti, masuk akal. raintank/graphite-stack
Gambar psutil
dan statsd
klien all-in-one (dari penulis Grafana) yang praktis procmon.py
menyediakan implementasi.
$ docker run --rm -p 8080:3000 -p 8125:8125/udp raintank/graphite-stack
Kemudian di terminal lain, setelah memulai proses target:
$ sudo apt-get install python-statsd python-psutil # or via pip
$ python procmon.py -s localhost -f chromium -r 'chromium.*'
Kemudian membuka Grafana di http: // localhost: 8080 , otentikasi sebagai admin:admin
, mengatur sumber data https: // localhost , Anda dapat merencanakan grafik seperti:
Alih-alih skrip Python yang mengirim metrik ke Statsd, telegraf
(dan procstat
memasukkan plugin) dapat digunakan untuk mengirim metrik ke Graphite secara langsung.
telegraf
Konfigurasi minimal terlihat seperti:
[agent]
interval = "1s"
[[outputs.graphite]]
servers = ["localhost:2003"]
prefix = "testprfx"
[[inputs.procstat]]
pid_file = "/path/to/file/with.pid"
Kemudian jalankan line telegraf --config minconf.conf
. Bagian Grafana sama, kecuali nama metrik.
sysdig
(tersedia di repositori Debian dan Ubuntu) dengan UI sysdig-inspect terlihat sangat menjanjikan, memberikan detail yang sangat halus bersama dengan pemanfaatan CPU dan RSS, tetapi sayangnya UI tidak dapat membuat mereka, dan sysdig
tidak dapat menyaring procinfo
acara dengan proses di saat penulisan. Padahal, ini harus dimungkinkan dengan pahat khusus ( sysdig
ekstensi ditulis dalam Lua).
pgrep --help
untuk menyelamatkan. Setidaknya ada --newest
dan --oldest
.
Ctrl+C
pada proses psrecord hanya berhenti tanpa menyimpan plot, Anda harus mengakhiri proses-tes.
Untuk menggunakan informasi itu pada skrip Anda dapat melakukan ini:
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
gunakan seperti: di calcPercCpu.sh 1234
mana 1234 adalah pid
Untuk $ nPid yang ditentukan, itu akan mengukur rata - rata 10 snapshot dari penggunaan cpu dalam keseluruhan 1 detik (penundaan masing-masing 0,1s * nTimes = 10); yang memberikan hasil akurat dan baik dari apa yang terjadi pada saat itu.
Tweak variabel sesuai kebutuhan Anda.
$nPercCpu
): shell, top, grep, sed, cut ... bc. Banyak jika tidak semua ini misalnya Anda bisa bergabung menjadi 1 Sed atau skrip Awk.
top
's keluaran adalah rata-rata lebih $delay
. Lih Bagaimana cara menghitung penggunaan CPU
Saya biasanya menggunakan dua berikut:
HP caliper : alat yang sangat bagus untuk memantau prosesnya, Anda dapat memeriksa grafik panggilan dan informasi tingkat rendah lainnya. Tetapi harap dicatat ini gratis hanya untuk penggunaan pribadi.
daemontools : koleksi alat untuk mengelola layanan UNIX
Menggunakan top
dan awk
seseorang dapat dengan mudah membuat mis. Log yang dipisahkan koma dari% CPU ( $9
) +% MEM ( $10
) yang nantinya dapat dimasukkan ke dalam statistik dan alat grafik.
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() }'
Output akan seperti
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
Ini tidak akan memberikan hasil yang baik untuk yang besar $delay
, karena cap waktu yang dicetak sebenarnya $delay
tertinggal karena bagaimana top
hasil kerjanya. Tanpa terlalu banyak detail, satu cara sederhana untuk melakukannya adalah dengan mencatat waktu yang disediakan oleh top
:
top -b -d $delay -p $pid | awk -v OFS="," '$1=="top"{ time=$3 }
$1+0>0 { print time,$1,$NF,$9,$10; fflush() }'
Maka cap waktu akurat, tetapi output masih akan tertunda $delay
.
Jika Anda tahu nama proses yang dapat Anda gunakan
top -p $(pidof <process_name>)
Jika Anda memiliki distribusi Linux cut-down di mana top tidak memiliki opsi per proses (-p) atau opsi terkait, Anda dapat mengurai output dari perintah top untuk nama proses Anda untuk mendapatkan informasi penggunaan CPU per proses.
while true; do top -bn1 | awk '/your_process_name/ {print $8}' ; sleep 1; done
8 mewakili penggunaan CPU per proses dalam output dari perintah teratas dalam distribusi Linux saya yang tertanam
Reputasi tidak cukup untuk berkomentar, tetapi untuk psrecord Anda juga dapat menyebutnya langsung, dengan cara terprogram, langsung dalam Python:
from psrecord.main import monitor
monitor(<pid number>, logfile = "./test.log", plot="./fig.png", include_children=True)
Jika Anda memerlukan rata-rata untuk periode waktu proses tertentu, coba opsi akumulatif -c dari atas:
top -c a -pid PID
"-c a" ditemukan di bagian atas untuk Mac 10.8.5.
Untuk Scientific Linux, opsinya adalah -S, yang dapat diatur secara interaktif.
top
sebenarnya menyediakan fitur ini. Versi saya di Fedora 19 tidak. Sama juga di Ubuntu 13.04.
Saya agak terlambat di sini, tetapi saya akan membagikan trik baris perintah saya hanya dengan menggunakan default ps
WATCHED_PID=$({ command_to_profile >log.stdout 2>log.stderr & } && echo $!);
while ps -p $WATCHED_PID --no-headers --format "etime pid %cpu %mem rss" do;
sleep 1
done
Saya menggunakan ini sebagai one-liner. Di sini baris pertama menjalankan perintah dan menyimpan PID dalam variabel. Kemudian ps akan mencetak waktu yang telah berlalu, PID yang menggunakan CPU persen, memori persen, dan memori RSS. Anda dapat menambahkan bidang lain juga.
Segera setelah proses berakhir, ps
perintah tidak akan mengembalikan "sukses" dan while
loop akan berakhir.
Anda dapat mengabaikan baris pertama jika PID yang ingin Anda profil sudah berjalan. Cukup tempatkan id yang diinginkan dalam variabel.
Anda akan mendapatkan output seperti ini:
00:00 7805 0.0 0.0 2784
00:01 7805 99.0 0.8 63876
00:02 7805 99.5 1.3 104532
00:03 7805 100 1.6 129876
00:04 7805 100 2.1 170796
00:05 7805 100 2.9 234984
00:06 7805 100 3.7 297552
00:07 7805 100 4.0 319464
00:08 7805 100 4.2 337680
00:09 7805 100 4.5 358800
00:10 7805 100 4.7 371736
....