Bagaimana memonitor penggunaan CPU / memori dari satu proses?

170

Saya ingin memonitor penggunaan memori / cpu satu proses secara real time. Serupa dengan toptetapi ditargetkan hanya pada satu proses, lebih disukai dengan semacam grafik riwayat.

Josh K.
sumber
Statistik memori apa yang Anda inginkan? Ada banyak dari mereka.
vwduder
Penggunaan memori selama jangka waktu tertentu, penggunaan saat ini, penggunaan maksimum, rata-rata.
Josh K

Jawaban:

140

Di Linux, topsebenarnya 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
Michael Mrozek
sumber
9
Dan karena Anda mungkin tidak ingin mencari PID setiap saat, cobalah sesuatu seperti top -p `pgrep -f /usr/bin/kvm`.
Stefan Lasiewski
Saya menggunakan Cacti untuk memantau beberapa proses individu, tetapi menginstal instalasi Cacti yang penuh sesak nafas terdengar terlalu rumit untuk situasi sederhana yang ditanyakan di sini.
Stefan Lasiewski
@Stefan: Saya berasumsi saya harus menjalankan itu dari jarak jauh?
Josh K
@Josh: Ya, Anda harus menjalankan Cacti (Yang membutuhkan MySQL, Apache, dan beberapa paket lainnya) di server lain. Pada kebanyakan distro, cukup mudah untuk menginstal menggunakan Yum atau apt-get.
Stefan Lasiewski
@Stefan jika Anda ingin memeriksa dari jauh, Anda dapat melakukan ssh @ remotehost 'top -p PID> ~ hostname_pid.txt; exit'and
klerk
61

htopadalah 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 toplagi, setelah pertama kali saya gunakan htop.

Tampilkan satu proses:

htop -p PID

Denilson Sa Maia
sumber
7
+1 untuk htop. Ini adalah salah satu program pertama yang saya instal pada sistem baru. Itu membuat hidup saya jauh lebih mudah. Tampilan pohon juga sangat berguna.
Barthelemy
9
topjuga memiliki warna. Tekan z.
tshepang
2
Kamu benar! topmemiliki warna! Sayang sekali warnanya sangat tidak berguna, khususnya bila dibandingkan dengan htop(yang memudar proses pengguna lain dan menyoroti nama program).
Denilson Sá Maia
1
Dan htop -p PIDakan bekerja juga, sama seperti contoh yang diberikan oleh @Michael Mrozek.
noisebleed
1
Maka satu-satunya alasan untuk menggunakan top, adalah karena htop tidak tersedia atau tidak dapat diinstal. Itulah sebabnya htop dibuat, untuk menyediakan lebih banyak fitur.
lepe
60

psrecord

Berikut ini semacam grafik riwayat . psrecordPaket 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'

Grafik terlihat seperti: contoh psrecord

memory_profiler

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-tkexplorer grafik berbasis Tkinter ( mungkin diperlukan) yang dapat diekspor:

mprof

tumpukan grafit & statsd

Ini mungkin tampak berlebihan untuk tes satu kali yang sederhana, tetapi untuk sesuatu seperti debugging beberapa hari, itu pasti, masuk akal. raintank/graphite-stackGambar psutildan statsdklien all-in-one (dari penulis Grafana) yang praktis procmon.pymenyediakan 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:

grafik grafana

tumpukan grafit & telegraf

Alih-alih skrip Python yang mengirim metrik ke Statsd, telegraf(dan procstatmemasukkan plugin) dapat digunakan untuk mengirim metrik ke Graphite secara langsung.

telegrafKonfigurasi 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

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 ( sysdigekstensi ditulis dalam Lua).

saaj
sumber
pgrep systemd memberikan beberapa baris output, dan dengan demikian mengganggu psrecord, apa yang harus dilakukan? Saya hanya ingin menguji dengan proses apa pun.
EralpB
1
@ EralpB pgrep --helpuntuk menyelamatkan. Setidaknya ada --newestdan --oldest.
Saaj
2
Ini harus menjadi jawaban yang diterima, karena itu sebenarnya memberikan alur riwayat penggunaan memori. Catatan untuk metode psrecord, Ctrl+Cpada proses psrecord hanya berhenti tanpa menyimpan plot, Anda harus mengakhiri proses-tes.
user2561747
8

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 1234mana 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.

Aquarius Power
sumber
Uhm, 10 proses untuk memantau penggunaan cpu 1?
xebeche
@xebeche "ini akan mengukur rata - rata 10 foto" "nTimes = 10; # sesuaikan itu" :)
Aquarius Power
Maksud saya, saya tidak suka fakta bahwa Anda memanggil 10 proses untuk mengambil 1 angka ( $nPercCpu): shell, top, grep, sed, cut ... bc. Banyak jika tidak semua ini misalnya Anda bisa bergabung menjadi 1 Sed atau skrip Awk.
xebeche
@ xebeche keren, silakan edit menambahkan perintah yang lebih baik ke yang sudah ada (sebagai alternatif), Anda punya rasa ingin tahu saya :)
Aquarius Power
1
Saya telah menambahkan jawaban saya sendiri . BTW, perhatikan bahwa tidak ada gunanya dalam menghitung rata-rata karena top's keluaran adalah rata-rata lebih $delay. Lih Bagaimana cara menghitung penggunaan CPU
xebeche
5

Saya biasanya menggunakan dua berikut:

  1. 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.

  2. daemontools : koleksi alat untuk mengelola layanan UNIX

Hemant
sumber
6
Saya menggunakan daemontools selama bertahun-tahun. Ini bagus sebagai pengawas / pengawas untuk proses lainnya. Bagaimana ini membantu Anda memantau penggunaan CPU / memori untuk satu proses?
Stefan Lasiewski
3

Menggunakan topdan awkseseorang 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 $delaytertinggal karena bagaimana tophasil 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.

xebeche
sumber
2

Jika Anda tahu nama proses yang dapat Anda gunakan

top -p $(pidof <process_name>)
pengguna4757345
sumber
8
Itulah jawaban yang diterima, dari tahun lalu, dan komentar pertamanya mengatakan.
Dhag
1

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

Razan Paul
sumber
1

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)
ZettaCircl
sumber
0

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.

Kieleth
sumber
Anda mungkin ingin menambahkan rincian lebih lanjut tentang versi mana yang topsebenarnya menyediakan fitur ini. Versi saya di Fedora 19 tidak. Sama juga di Ubuntu 13.04.
slm
Anda benar !, saya sangat senang telah menemukan sesuatu yang berguna, saya lupa saya ada di mac saya di rumah.
Kieleth
0

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, psperintah tidak akan mengembalikan "sukses" dan whileloop 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
  ....
teis
sumber