it-swarm-id.com

Bagaimana memonitor penggunaan CPU / memori dari satu proses?

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

194
Josh K

Di Linux, top sebenarnya mendukung pemfokusan pada satu proses, walaupun secara alami tidak memiliki grafik histori:

top -p PID

Ini juga tersedia di Mac OS X dengan sintaks yang berbeda:

top -pid PID
157
Michael Mrozek

psrecord

Alamat berikut grafik sejarah semacam . Python psrecord paket 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: psrecord example

memory_profiler

The paket memberikan sampel RSS-only (ditambah beberapa opsi khusus Python). 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 muncul berbasis Tkinter (python-tk mungkin diperlukan) bagan Explorer yang dapat diekspor:

mprof

tumpukan grafit & statsd

Ini mungkin tampak berlebihan untuk tes satu kali yang sederhana, tetapi untuk sesuatu seperti debugging beberapa hari, tentu saja, masuk akal. All-in-one berguna raintank/graphite-stack (dari penulis Grafana) gambar dan psutil dan statsd klien. procmon.py memberikan 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 buka Grafana di http: // localhost: 808 , otentikasi sebagai admin:admin, menyiapkan sumber data https: // localhost , Anda dapat membuat grafik seperti:

grafana chart

tumpukan grafit & telegraf

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

Konfigurasi telegraf minimal terlihat seperti:

[agent]
  interval = "1s"

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

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

Kemudian jalankan baris telegraf --config minconf.conf. Bagian Grafana sama, kecuali nama metrik.

pidstat

pidstat (bagian dari paket sysstat) dapat menghasilkan output yang dapat dengan mudah diurai. Ini berguna jika Anda membutuhkan metrik tambahan dari proses, mis. 3 kelompok paling berguna (CPU, memori dan disk) berisi: %usr, %system, %guest, %CPU, minflt/s, majflt/s, VSZ, RSS, %MEM, kB_rd/s, kB_wr/s, kB_ccwr/s. Saya jelaskan di jawaban terkait .

87
saaj

htop adalah pengganti yang bagus untuk top. Ini memiliki ... Warna! Pintasan keyboard sederhana! Gulir daftar menggunakan tombol panah! Matikan proses tanpa meninggalkan dan tanpa memperhatikan PID! Tandai beberapa proses dan bunuh semuanya!

Di antara semua fitur, halaman manual mengatakan Anda dapat menekan F untuk ikuti suatu proses.

Sungguh, Anda harus mencoba htop. Saya tidak pernah memulai top lagi, setelah pertama kali saya menggunakan htop.

Tampilkan satu proses:

htop -p PID

67

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 like: calcPercCpu.sh 1234 di mana 1234 adalah pid

Untuk $ nPid yang ditentukan, itu akan mengukur rata-rata dari 10 snapshot dari penggunaan cpu dalam keseluruhan 1 detik (penundaan masing-masing 0,1 * nTimes = 10); yang memberikan hasil akurat dan baik dari apa yang terjadi pada saat itu.

Tweak variabel sesuai kebutuhan Anda.

8
Aquarius Power

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

5
Hemant

Menggunakan top dan awk seseorang dapat dengan mudah membuat mis. log yang dipisahkan koma dari% CPU ($9) +% MEM ($10) penggunaan 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 besar $delay, karena cap waktu yang dicetak sebenarnya $delay di belakang karena cara kerja top. Tanpa terlalu banyak detail, satu cara sederhana untuk ini adalah 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 stempel waktu akurat, tetapi output masih akan ditunda oleh $delay.

5
xebeche

Jika Anda tahu nama proses yang dapat Anda gunakan

top -p $(pidof <process_name>)
2
user4757345

Saya agak terlambat di sini, tetapi saya akan membagikan trik baris perintah saya hanya dengan menggunakan 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 persentase CPU menggunakan, memori persen, dan memori RSS. Anda dapat menambahkan bidang lain juga.

Segera setelah proses berakhir, perintah ps tidak akan mengembalikan "sukses" dan loop while 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
  ....
2
theist

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)
2
ZettaCircl

Jika Anda memiliki distribusi Linux cut-down di mana top tidak memiliki opsi per proses (-p) atau opsi terkait, Anda dapat mem-parsing 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

1
Razan Paul
pidstat -p 7994 2 

03:54:43 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
03:54:45 PM     0      7994    1.50    1.50    0.00    3.00     1  AliYunDun
03:54:47 PM     0      7994    1.00    1.00    0.00    2.00     0  AliYunDun

setiap 2 detik proses cetak 7994 penggunaan cpu

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.

0
Kieleth