Mengambil penggunaan CPU dan penggunaan memori dari satu proses di Linux?


165

Saya ingin mendapatkan penggunaan CPU dan memori dari satu proses di Linux - Saya tahu PID. Mudah-mudahan, saya bisa mendapatkannya setiap detik dan menuliskannya ke CSV menggunakan perintah 'watch'. Perintah apa yang dapat saya gunakan untuk mendapatkan info ini dari baris perintah Linux?


11
Milik SuperUser.
Richard

Bisakah kita menggunakan gdb untuk memanggil getpid dan top -p <pid itu>
mja

Jawaban:


226
ps -p <pid> -o %cpu,%mem,cmd

(Anda dapat meninggalkan "cmd" tetapi itu mungkin membantu dalam debugging).

Perhatikan bahwa ini memberikan rata-rata penggunaan CPU dari proses selama waktu berjalan.


6
Asumsinya adalah bahwa jika Anda peduli tentang penggunaan memori proses tunggal yang cukup untuk memantaunya seperti ini, ia menggunakan sejumlah besar memori sehingga beberapa megabyte tambahan akibat pemetaan bersama tidak menjadi masalah.
caf

5
@ Chaitanya: pipa melalui| tail -n +2
caf

11
Atau Anda bisa menggunakan --noheader
hexacyanide

45
Perlu diingat bahwa% cpu "adalah waktu CPU yang digunakan dibagi dengan waktu proses telah berjalan (cputime / rasio waktu-nyata), dinyatakan sebagai persentase" (lihat halaman manual ps). Ini bukan penggunaan CPU tepat waktu yang sebenarnya. Ini juga bisa sangat berbeda dari toppertunjukan apa , misalnya.
xebeche

12
seperti yang dikatakan dari Xebeche tepat di atas, ps -e -o pcpu,argsakan menunjukkan rata-rata CPU selama masa proses, yang jelas bukan yang Anda inginkan jika itu adalah proses yang berjalan lama
Alex F

65

Varian dari jawaban kafe : top -p <pid>

Ini secara otomatis memperbarui penggunaan CPU sehingga bagus untuk pemantauan.


2
Bekerja dengan baik dengan pgrep:top -p $(pgrep process_name)
Matthias Braun

37

Anda bisa mendapatkan hasilnya dengan nama proses menggunakan

ps -C chrome -o %cpu,%mem,cmd

yang -Cpilihan memungkinkan Anda untuk menggunakan nama proses tanpa mengetahui pid itu.


bagaimana cara memasukkan juga de pid? Saya sudah mencoba% pid $ PID pid, PID tidak berhasil
Arnold Roa

@ArnoldRoa pidhanya berfungsi. ps -C chrome -o pid,%cpu,%mem,cmd
Muhammad Taha

28

Gunakan pidstat (dari sysstat - Refer Link ).

misalnya untuk memonitor kedua ID proses ini (12345 dan 11223) setiap 5 detik digunakan

$ pidstat -h -r -u -v -p 12345,11223 5

2
terima kasih telah menunjukkan pidstatbahwa itu adalah perintah yang hebat, dan juga berguna untuk scripting!
fduff

pidstatjuga memberikan rata-rata yang bagus. Sayang saya belum menemukan cara yang lebih eleganpidstat -u 1 10 | grep ^Average | sort -r -n -b -k 8,8
north-bradley

24

ps perintah (tidak boleh digunakan):

top perintah (harus digunakan):

Gunakan topuntuk mendapatkan penggunaan CPU secara real time (interval pendek saat ini):

top -b -n 2 -d 0.2 -p 6962 | tail -1 | awk '{print $9}'

akan bergema seperti: 78.6


Ini adalah jawaban yang paling akurat untuk mendapatkan penggunaan CPU saat ini, bukan rata-rata selama masa proses.
Ted Feng

15

Luncurkan program dan pantau

Formulir ini berguna jika Anda ingin membuat tolok ukur yang dapat dieksekusi dengan mudah:

topp() (
  $* &>/dev/null &
  pid="$!"
  trap ':' INT
  echo 'CPU  MEM'
  while sleep 1; do ps --no-headers -o '%cpu,%mem' -p "$pid"; done
  kill "$pid"
)
topp ./myprog arg1 arg2

Sekarang ketika Anda menekan Ctrl + C itu keluar dari program dan berhenti memantau. Output sampel:

CPU  MEM
20.0  1.3
35.0  1.3
40.0  1.3

Terkait: /unix/554/how-to-monitor-cpu-memory-usage-of-a-single-process

Diuji pada Ubuntu 16.04.


5

Anda bisa menggunakan top -bdan mengeluarkan pid yang Anda inginkan (dengan -bflag top berjalan dalam mode batch), atau juga menggunakan -pflag dan menentukan pid tanpa menggunakan grep.


5

Seperti yang dikomentari dalam jawaban caf di atas, ps dan dalam beberapa kasus pidstat akan memberi Anda rata-rata seumur hidup pCPU. Untuk mendapatkan hasil yang lebih akurat, gunakan top. Jika Anda perlu menjalankan top sekali Anda dapat menjalankan:

top -b -n 1 -p <PID>

atau hanya untuk memproses data dan tajuk:

top -b -n 1 -p <PID> | tail -3 | head -2

tanpa tajuk:

top -b -n 1 -p <PID> | tail -2 | head -1

3
ps aux | awk '{print $4"\t"$11}' | sort | uniq -c | awk '{print $2" "$1" "$3}' | sort -nr

atau per proses

ps aux | awk '{print $4"\t"$11}' | sort | uniq -c | awk '{print $2" "$1" "$3}' | sort -nr |grep mysql


1
ps aux|awk  '{print $2,$3,$4}'|grep PID

di mana kolom pertama adalah PID, penggunaan CPU kolom kedua, penggunaan memori kolom ketiga.


1
ps axo pid,etime,%cpu,%mem,cmd | grep 'processname' | grep -v grep

PID - ID Proses

etime - Proses Menjalankan / Durasi Langsung

% cpu - Penggunaan CPU

% mem - Penggunaan memori

cmd - Perintah

Ganti processname dengan proses apa pun yang ingin Anda lacak, mysql nginx php-fpm dll ...


1

Semua jawaban di sini hanya menampilkan persentase memori untuk PID.

Berikut adalah contoh cara mendapatkan penggunaan memori rss di KB untuk semua proses apache, ganti "grep apache" dengan "grep PID" jika Anda hanya ingin menonton PID tertentu:

watch -n5 "ps aux -y | grep apache | awk '{print \$2,\$6}'"

Ini mencetak:

Every 5.0s: ps aux -y | grep apache | awk '{print $2,$6}'                                                                                                                                                                                                          
Thu Jan 25 15:44:13 2018

12588 9328
12589 8700
12590 9392
12591 9340
12592 8700
12811 15200
15453 9340
15693 3800
15694 2352
15695 1352
15697 948
22896 9360

Dengan CPU%:

watch -n5 "ps aux -y | grep apache | awk '{print \$2,\$3,\$6}'"

Keluaran:

Every 5.0s: ps aux -y | grep apache | awk '{print $2,$3,$6}'                                                                                                                                                                                                       
Thu Jan 25 15:46:00 2018

12588 0.0 9328
12589 0.0 8700
12590 0.0 9392
12591 0.0 9340
12592 0.0 8700
12811 0.0 15200
15453 0.0 9340
15778 0.0 3800
15779 0.0 2352
15780 0.0 1348
15782 0.0 948
22896 0.0 9360

1

Bagi mereka yang berjuang untuk sementara bertanya-tanya mengapa jawaban yang dipilih tidak bekerja:

ps -p <pid> -o %cpu,%mem

Tidak ada spasi antara %cpu,dan %mem.


1

Ini adalah trik yang bagus untuk mengikuti satu atau lebih program secara real time sambil juga menonton keluaran beberapa alat lain: watch "top -bn1 -p$(pidof foo),$(pidof bar); tool"


1

Perintah berikut mendapatkan rata-rata penggunaan CPU dan memori setiap 40 detik untuk proses tertentu (pid)

pidstat 40 -ru -p <pid>

Output untuk kasus saya (dua baris pertama untuk penggunaan CPU, dua baris kedua untuk memori):

02:15:07 PM       PID    %usr %system  %guest    %CPU   CPU  Command
02:15:47 PM     24563    0.65    0.07    0.00    0.73     3  java

02:15:07 PM       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
02:15:47 PM     24563      6.95      0.00 13047972 2123268   6.52  java

0

(Jika Anda menggunakan MacOS 10.10, coba opsi akumulatif -c dari atas:

top -c a -pid PID

(Opsi ini tidak tersedia di linux lain, dicoba dengan Scientific Linux el6 dan RHEL6)


0

Di atas daftar keluar cpu atas dan proses memakan memori

        ps axo %cpu,%mem,command | sort -nr | head

0

Berdasarkan jawaban @ caf, ini bekerja dengan baik untuk saya.

Hitung rata-rata untuk PID yang diberikan:

mengukur

times=100
total=0
for i in $(seq 1 $times)
do
   OUTPUT=$(top -b -n 1 -d 0.1 -p $1 | tail -1 | awk '{print $9}')
   echo -n "$i time: ${OUTPUT}"\\r
   total=`echo "$total + $OUTPUT" | bc -l`
done
#echo "Average: $total / $times" | bc

average=`echo "scale=2; $total / $times" | bc`
echo "Average: $average"

Pemakaian:

# send PID as argument
sh measure.sh 3282

-2

Penggunaan CPU dan memori dari satu proses di Linux atau Anda bisa mendapatkan 10 proses CPU yang paling banyak digunakan dengan menggunakan perintah di bawah ini

ps -aux --sort -pcpu | kepala -n 11

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.