Linux'ta tek bir işlemin CPU kullanımı ve bellek kullanımı alınsın mı?


165

Linux'ta tek bir işlemin CPU ve bellek kullanımını elde etmek istiyorum - PID'yi biliyorum. Umarım her saniye alıp 'watch' komutunu kullanarak bir CSV'ye yazabilirim. Bu bilgiyi Linux komut satırından almak için hangi komutu kullanabilirim?


11
SuperUser'a aittir.
Richard

Getpid ve top -p <bu pid> 'i çağırmak için gdb kullanabilir miyiz?
mja

Yanıtlar:


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

("Cmd" yi bırakabilirsiniz ancak hata ayıklamada yardımcı olabilir).

Bunun işlem sırasında işlemin ortalama CPU kullanımını verdiğini unutmayın.


6
Varsayım, tek bir işlemin bu şekilde izleyecek kadar bellek kullanımını önemsiyorsanız, önemli miktarda bellek kullanması, böylece paylaşılan eşlemeler nedeniyle fazladan birkaç megabaytın sorun olmamasıdır.
caf

5
@Chaitanya: içinden boru it| tail -n +2
kafeinli

11
Yoksa --noheader kullanabilirsiniz
hexacyanide

45
% Cpu "'nun kullanılan CPU süresinin, işlemin çalıştığı süreye (cputime / realtime oran), yüzde olarak ifade edildiğine" dikkat edin (bkz. Sayfa ps). Bu tam zamanında CPU kullanımı için gerçek değildir . topÖrneğin, gösterilenden çok farklı olabilir .
xebeche

12
Xebeche'den yukarıda belirtildiği gibi, ps -e -o pcpu,argsişlemin ömrü boyunca cpu ortalamasını gösterecektir, bu uzun süren bir süreçse istediğiniz şey değildir
Alex F


37

Sonuçları kullanarak işlemin adına göre alabilirsiniz

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

-Cseçenek 's pid bilmeden işlem adını kullanmasını sağlar.


de pid nasıl eklenir? ihave% pid $ PID pid'i denedi, şanssız PID
Arnold Roa

@ArnoldRoa pidsadece çalışmalıdır. ps -C chrome -o pid,%cpu,%mem,cmd
Muhammed Taha

28

Pidstat kullanın (sistemden - Bkz. Bağlantı ).

örneğin bu iki işlem kimliğini (12345 ve 11223) her 5 saniyede bir izlemek için

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

2
pidstatbunun harika bir komut olduğunu ve komut dosyası oluşturmak için de kullanışlı olduğunu belirttiğiniz için teşekkürler !
fduff

pidstatAyrıca güzel bir ortalama verir. daha zarif bir yol bulamadım sadece bir utançpidstat -u 1 10 | grep ^Average | sort -r -n -b -k 8,8
north-bradley

24

ps komutu (kullanmamalı):

top komut (kullanmalı):

topCPU kullanımını gerçek zamanlı olarak almak için kullanın (geçerli kısa aralık):

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

gibi yankılanacak: 78.6


Bu, işlemin ömrü boyunca ortalama değil, mevcut CPU kullanımını elde etmek için en doğru yanıttır.
Ted Feng

15

Bir program başlatın ve izleyin

Bu form, bir yürütülebilir dosyayı kolayca karşılaştırmak istiyorsanız kullanışlıdır:

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

Şimdi Ctrl + C tuşlarına bastığınızda programdan çıkar ve izlemeyi durdurur. Örnek çıktı:

CPU  MEM
20.0  1.3
35.0  1.3
40.0  1.3

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

Ubuntu 16.04'te test edildi.


5

İstediğiniz pid'i kullanabilir top -bve silebilirsiniz ( -büst kısım toplu modda çalışır) veya ayrıca -pbayrağı kullanabilir ve grep kullanmadan pid'i belirtebilirsiniz.


5

Yukarıdaki caf cevabında yorumlandığı gibi, ps ve bazı durumlarda pidstat size pCPU'nun ömür boyu ortalamasını verecektir. Daha doğru sonuçlar almak için üst kısmı kullanın. Bir kez üstte koşmanız gerekiyorsa koşabilirsiniz:

top -b -n 1 -p <PID>

veya yalnızca veri ve başlık işlemek için:

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

üstbilgisiz:

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

veya işlem başına

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

2

Aşağıdaki komut, belirli bir işlem için her 40 saniyede bir ortalama CPU ve bellek kullanımı alır (pid)

pidstat 40 -ru -p <pid>

Benim durumum için çıktı (CPU kullanımı için ilk iki satır, bellek için ikinci iki satır):

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


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

burada birinci sütun PID, ikinci sütun CPU kullanımı, üçüncü sütun bellek kullanımıdır.


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

PID - İşlem Kimliği

etime - Proses Koşu / Canlı Süre

% cpu - CPU kullanımı

% mem - Bellek kullanımı

cmd - Komut

İşlem adını izlemek istediğiniz işlem, mysql nginx php-fpm vb. İle değiştirin.


1

Buradaki yanıtların tümü yalnızca PID için bellek yüzdesini gösterir.

Tüm apache işlemleri için KB'de rss bellek kullanımını nasıl alacağınıza bir örnek, sadece belirli bir PID'yi izlemek istiyorsanız "grep apache" yerine "grep PID" yazın:

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

Bu yazdırır:

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

% CPU ile:

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

Çıktı:

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

Seçilen cevabın neden işe yaramadığını merak eden bir süre mücadele edenler için:

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

Hiçbir UZAY ibetween %cpu,ve %mem.


1

Bu, bir veya daha fazla programı gerçek zamanlı olarak izlemek ve aynı zamanda başka bir aracın çıktısını izlemek için güzel bir numaradır: watch "top -bn1 -p$(pidof foo),$(pidof bar); tool"


0

(MacOS 10.10'daysanız, topun birikmeli -c seçeneğini deneyin:

top -c a -pid PID

(Bu seçenek diğer linuxlarda mevcut değildir, Scientific Linux el6 ve RHEL6 ile denenmiştir)


0

Yukarıdaki liste en üst işlemci ve bellek tüketen süreci listeliyor

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

0

@ Caf'ın cevabına dayanarak, bu benim için iyi çalışıyor.

Verilen PID için ortalamayı hesapla:

measure.sh

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"

Kullanımı:

# send PID as argument
sh measure.sh 3282

-2

Linux'ta tek bir işlemin CPU ve bellek kullanımı veya aşağıdaki komutu kullanarak en iyi 10 cpu kullanılan işlemi alabilirsiniz

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.