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?

Supertux
sumber
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.

kaf
sumber
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.

Manki
sumber
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.

ya
sumber
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
Neon
sumber
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

vikyd
sumber
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.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
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.

Alberto Zaccagni
sumber
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
aviranh
sumber
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
Patel95
sumber
1

Untuk mendapatkan penggunaan memori hanya dari aplikasi Anda (tidak seperti perpustakaan bersama yang digunakannya, Anda perlu menggunakan antarmuka Linux smaps). Jawaban ini menjelaskannya dengan baik .

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

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

Osama Al-Banna
sumber
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 ...

Siva KR
sumber
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
pisang
sumber
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.

ZhaoGang
sumber
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"

Tom Wocken
sumber
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
Celik
sumber
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)

Kieleth
sumber
0

Di atas daftar keluar cpu atas dan proses memakan memori

        ps axo %cpu,%mem,command | sort -nr | head
pengguna8854776
sumber
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
Val
sumber
-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

Reddy jyothish
sumber