Pobrać użycie procesora i pamięci przez pojedynczy proces w systemie Linux?


165

Chcę uzyskać wykorzystanie procesora i pamięci przez pojedynczy proces w systemie Linux - znam PID. Mam nadzieję, że uda mi się go pobrać co sekundę i zapisać w pliku CSV za pomocą polecenia „obserwuj”. Jakiego polecenia mogę użyć, aby uzyskać te informacje z wiersza poleceń systemu Linux?


11
Należy do SuperUser.
Richard,

Czy możemy użyć gdb do wywołania getpid i top -p <ten pid>?
mja

Odpowiedzi:


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

(Możesz pominąć "cmd", ale może to być pomocne przy debugowaniu).

Zauważ, że daje to średnie użycie procesora przez proces w czasie, gdy był on uruchomiony.


6
Założenie byłoby takie, że jeśli zależy Ci na zużyciu pamięci przez pojedynczy proces na tyle, aby go monitorować w ten sposób, zużywa on znaczną ilość pamięci, więc dodatkowe kilka megabajtów z powodu współdzielonych mapowań nie stanowi problemu.
kawiarnia

5
@Chaitanya: przepuść go| tail -n +2
kawiarnia

11
Albo można użyć --noheader
hexacyanide

45
Pamiętaj, że% cpu "to wykorzystany czas procesora podzielony przez czas trwania procesu (stosunek cputime / realtime), wyrażony w procentach" (zobacz stronę podręcznika ps). To nie jest rzeczywiste użycie procesora w czasie. Może się też bardzo różnić od tego top, co na przykład pokazuje.
xebeche

12
jak powiedziano z Xebeche tuż powyżej, ps -e -o pcpu,argspokaże średnią cpu przez cały czas trwania procesu, co oczywiście nie jest tym, czego chcesz, jeśli jest to długotrwały proces
Alex F

65

Wariant odpowiedzi kawiarni : top -p <pid>

To automatycznie odświeża użycie procesora, więc jest dobre do monitorowania.


2
Ładnie współpracuje z pgrep:top -p $(pgrep process_name)
Matthiasem Braunem,

37

Możesz uzyskać wyniki według nazwy procesu za pomocą

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

-Copcja pozwala na użycie nazwy procesu, nie wiedząc, że to PID.


jak uwzględnić również de pid? Próbowałem% pid $ PID pid, PID bez powodzenia
Arnold Roa

pidTylko @ArnoldRoa powinno działać. ps -C chrome -o pid,%cpu,%mem,cmd
Muhammad Taha

28

Użyj pidstat (z sysstat - refer Link ).

np. do monitorowania tych dwóch identyfikatorów procesów (12345 i 11223) co 5 sekund użyj

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

2
dzięki za wskazanie, pidstatże to świetne polecenie, a także przydatne do tworzenia skryptów!
fduff

pidstatdaje również niezłą średnią. szkoda tylko, że nie znalazłem bardziej eleganckiego sposobupidstat -u 1 10 | grep ^Average | sort -r -n -b -k 8,8
north-bradley

24

ps polecenie (nie należy używać):

top polecenie (należy użyć):

Służy topdo sprawdzania użycia procesora w czasie rzeczywistym (bieżący krótki interwał):

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

będzie wyglądać jak: 78.6


Jest to najdokładniejsza odpowiedź na bieżące wykorzystanie procesora, a nie średnią z całego czasu trwania procesu.
Ted Feng,

15

Uruchom program i monitoruj go

Ten formularz jest przydatny, jeśli chcesz łatwo przetestować plik wykonywalny:

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

Teraz po naciśnięciu Ctrl + C zamyka program i zatrzymuje monitorowanie. Przykładowe dane wyjściowe:

CPU  MEM
20.0  1.3
35.0  1.3
40.0  1.3

Powiązane: /unix/554/how-to-monitor-cpu-memory-usage-of-a-single-process

Testowane na Ubuntu 16.04.


5

Możesz użyć top -bi grepować pid, który chcesz (z -bflagą top działa w trybie wsadowym) lub też użyć -pflagi i określić pid bez używania grep.


5

Jak skomentowano w powyższej odpowiedzi caf , ps, aw niektórych przypadkach pidstat poda średnią długość procesora pCPU przez cały okres użytkowania. Aby uzyskać dokładniejsze wyniki, użyj top. Jeśli chcesz biec na górze, gdy już możesz biegać:

top -b -n 1 -p <PID>

lub tylko do przetwarzania danych i nagłówka:

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

bez nagłówków:

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

lub na proces

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

gdzie pierwsza kolumna to PID, druga kolumna użycie procesora, trzecia kolumna użycie pamięci.


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

PID - identyfikator procesu

etime - Trwanie procesu / Czas trwania

% cpu - użycie procesora

% mem - użycie pamięci

cmd - Command

Zastąp nazwę procesu dowolnym procesem, który chcesz śledzić, mysql nginx php-fpm itp ...


1

Wszystkie odpowiedzi tutaj pokazują tylko procent pamięci dla PID.

Oto przykład, jak uzyskać użycie pamięci rss w KB dla wszystkich procesów Apache, zamień „grep apache” na „grep PID”, jeśli chcesz tylko oglądać określony PID:

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

To drukuje:

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

Z procesorem%:

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

Wynik:

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

Dla tych, którzy przez chwilę walczyli i zastanawiali się, dlaczego wybrana odpowiedź nie działa:

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

Brak PRZESTRZENI między %cpu,a %mem.


1

To fajna sztuczka do śledzenia jednego lub więcej programów w czasie rzeczywistym, jednocześnie obserwując wyjście innego narzędzia: watch "top -bn1 -p$(pidof foo),$(pidof bar); tool"


1

Następujące polecenie pobiera średnie użycie procesora i pamięci co 40 sekund dla określonego procesu (pid)

pidstat 40 -ru -p <pid>

Dane wyjściowe dla mojego przypadku (pierwsze dwa wiersze dotyczące wykorzystania procesora, drugie dwa wiersze pamięci):

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

(Jeśli używasz systemu MacOS 10.10, wypróbuj opcję kumulatywną -c top:

top -c a -pid PID

(Ta opcja nie jest dostępna w innych systemach Linux, wypróbowana z Scientific Linux el6 i RHEL6)


0

Powyższa lista zawiera najważniejsze procesy pochłaniające procesor i pamięć

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

0

Opierając się na odpowiedzi @ caf, to działa dobrze dla mnie.

Oblicz średnią dla danego PID:

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"

Stosowanie:

# send PID as argument
sh measure.sh 3282

-2

Wykorzystanie procesora i pamięci przez pojedynczy proces w systemie Linux lub możesz uzyskać 10 najczęściej wykorzystywanych procesów przez procesor, używając poniższego polecenia

ps -aux --sort -pcpu | głowa -n 11

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.