Truy xuất sử dụng CPU và sử dụng bộ nhớ của một quy trình duy nhất trên Linux?


164

Tôi muốn có được mức sử dụng CPU và bộ nhớ của một quy trình duy nhất trên Linux - Tôi biết về PID. Hy vọng, tôi có thể lấy nó mỗi giây và viết nó vào CSV bằng lệnh 'xem'. Tôi có thể sử dụng lệnh nào để lấy thông tin này từ dòng lệnh Linux?


11
Thuộc về SuperUser.
Richard

Chúng ta có thể sử dụng gdb để gọi getpid và top -p <pid> đó không?
mja

Câu trả lời:


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

(Bạn có thể bỏ "cmd" nhưng điều đó có thể hữu ích trong việc gỡ lỗi).

Lưu ý rằng điều này cho phép sử dụng CPU trung bình của quá trình trong suốt thời gian nó đang chạy.


6
Giả định sẽ là nếu bạn quan tâm đến việc sử dụng bộ nhớ của một tiến trình đủ để theo dõi nó như thế này, thì việc sử dụng một lượng bộ nhớ đáng kể để thêm vài megabyte do ánh xạ được chia sẻ không phải là vấn đề.
phê

4
@Chaitanya: dẫn nó qua| tail -n +2
caf

11
Hoặc bạn có thể sử dụng --noheader
hexacyanide

45
Hãy nhớ rằng% cpu "là thời gian CPU được sử dụng chia cho thời gian quá trình đang chạy (tỷ lệ thời gian thực / thời gian thực), được biểu thị bằng phần trăm" (xem trang hướng dẫn ps). Đây không phải là thực tế chỉ trong thời gian sử dụng CPU. Nó cũng có thể rất khác với những gì tophiển thị, ví dụ.
xebeche

12
như đã nói từ Xebeche ngay phía trên, ps -e -o pcpu,argssẽ hiển thị mức trung bình cpu trong suốt vòng đời của quy trình, đây rõ ràng không phải là điều bạn muốn nếu đó là một quá trình dài
Alex F


37

Bạn có thể nhận kết quả theo tên của quy trình bằng cách sử dụng

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

các -Ctùy chọn cho phép bạn sử dụng tên quá trình mà không biết nó pid.


Làm thế nào để bao gồm cả de pid? ihave đã thử% pid $ pid pid, PID không gặp may
Arnold Roa

@ArnoldRoa pidchỉ nên hoạt động. ps -C chrome -o pid,%cpu,%mem,cmd
Muhammad Taha

28

Sử dụng pidstat (từ sysstat - Liên kết tham khảo ).

ví dụ: để giám sát hai ID tiến trình này (12345 và 11223) cứ sau 5 giây sử dụng

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

2
cảm ơn vì đã chỉ ra pidstatrằng đó là một mệnh lệnh tuyệt vời và cũng rất tiện cho việc viết kịch bản!
fduff

pidstatcũng cho một mức trung bình tốt đẹp. chỉ là một sự xấu hổ mà tôi đã không tìm thấy một cách thanh lịch hơnpidstat -u 1 10 | grep ^Average | sort -r -n -b -k 8,8
phía bắc-bradley

24

ps lệnh (không nên sử dụng):

top lệnh (nên sử dụng):

Sử dụng topđể có được mức sử dụng CPU trong thời gian thực (khoảng thời gian ngắn hiện tại):

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

sẽ lặp lại như sau: 78.6


Đây là câu trả lời chính xác nhất để có được mức sử dụng CPU hiện tại, không phải là trung bình trong suốt vòng đời của quá trình.
Ted Feng

15

Khởi chạy một chương trình và theo dõi nó

Biểu mẫu này hữu ích nếu bạn muốn điểm chuẩn một cách dễ dàng thực thi:

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

Bây giờ khi bạn nhấn Ctrl + C, nó sẽ thoát khỏi chương trình và dừng theo dõi. Đầu ra mẫu:

CPU  MEM
20.0  1.3
35.0  1.3
40.0  1.3

Liên quan: /unix/554/how-to-monitor-cpu-memory-usage-of-a-single- process

Đã thử nghiệm trên Ubuntu 16.04.


5

Bạn có thể sử dụng top -bvà grep ra pid bạn muốn (với -bđỉnh cờ chạy ở chế độ hàng loạt), hoặc cũng có thể sử dụng -pcờ và chỉ định pid mà không cần sử dụng grep.


5

Như đã nhận xét trong câu trả lời của caf ở trên, ps và trong một số trường hợp, pidstat sẽ cung cấp cho bạn mức trung bình trọn đời của pCPU. Để có được kết quả chính xác hơn sử dụng hàng đầu. Nếu bạn cần chạy hàng đầu một khi bạn có thể chạy:

top -b -n 1 -p <PID>

hoặc chỉ xử lý dữ liệu và tiêu đề:

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

không có tiêu đề:

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

hoặc mỗi quá trình

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

trong đó cột đầu tiên là PID, sử dụng CPU cột thứ hai, sử dụng bộ nhớ cột thứ ba.


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

PID - ID tiến trình

etime - Quá trình chạy / Thời lượng sống

% cpu - Sử dụng CPU

% mem - Sử dụng bộ nhớ

cmd - Lệnh

Thay thế tên quy trình bằng bất kỳ quy trình nào bạn muốn theo dõi, mysql nginx php-fpm, v.v ...


1

Tất cả các câu trả lời ở đây chỉ hiển thị phần trăm bộ nhớ cho PID.

Dưới đây là ví dụ về cách sử dụng bộ nhớ rss trong KB cho tất cả các quy trình apache, thay thế "grep apache" bằng "grep PID" nếu bạn chỉ muốn xem một PID cụ thể:

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

Bản in này:

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

Với CPU%:

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

Đầu ra:

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

Đối với những người đấu tranh trong một thời gian tự hỏi tại sao câu trả lời được chọn không hoạt động:

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

Không có không gian ib giữa %cpu,%mem.


1

Đây là một mẹo hay để theo dõi một hoặc nhiều chương trình trong thời gian thực đồng thời xem đầu ra của một số công cụ khác: watch "top -bn1 -p$(pidof foo),$(pidof bar); tool"


1

Lệnh sau lấy mức trung bình của việc sử dụng CPU và bộ nhớ cứ sau 40 giây cho một quy trình cụ thể (pid)

pidstat 40 -ru -p <pid>

Đầu ra cho trường hợp của tôi (hai dòng đầu tiên cho việc sử dụng CPU, hai dòng thứ hai cho bộ nhớ):

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

(Nếu bạn đang ở trong MacOS 10.10, hãy thử tùy chọn tích lũy -c hàng đầu:

top -c a -pid PID

(Tùy chọn này không có sẵn trong linux khác, đã thử với Science Linux el6 và RHEL6)


0

Trên danh sách ra quá trình tiêu thụ cpu và bộ nhớ hàng đầu

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

0

Dựa trên câu trả lời của @ caf, điều này làm việc tốt với tôi.

Tính trung bình cho PID đã cho:

biện pháp

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"

Sử dụng:

# send PID as argument
sh measure.sh 3282

-2

Sử dụng CPU và bộ nhớ của một quy trình duy nhất trên Linux hoặc bạn có thể nhận được 10 quy trình sử dụng cpu hàng đầu bằng cách sử dụng lệnh bên dưới

ps -aux --sort -pcpu | đầu -n 11

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.