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?
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?
Câu trả lời:
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.
| tail -n +2
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ì top
hiển thị, ví dụ.
ps -e -o pcpu,args
sẽ 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
Một biến thể của câu trả lời của quán cà phê :
top -p <pid>
Điều này tự động làm mới việc sử dụng CPU để theo dõi.
pgrep
:top -p $(pgrep process_name)
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 -C
tùy chọn cho phép bạn sử dụng tên quá trình mà không biết nó pid.
pid
chỉ nên hoạt động. ps -C chrome -o pid,%cpu,%mem,cmd
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
pidstat
rằ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!
pidstat
cũ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
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
-b
: Chế độ hàng loạt-n 2
: Số lần lặp, sử dụng 2
vì: Khi bạn chạy lần đầu tiên, nó không có mẫu trước đó để so sánh, vì vậy các giá trị ban đầu này là tỷ lệ phần trăm kể từ khi khởi động.-d 0.2
: Thời gian trễ (tính bằng giây, ở đây là 200ms)-p 6962
: Màn hình-PIDtail -1
: hàng cuối cùngawk '{print $9}'
: cột thứ 9 (số sử dụng cpu)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.
Bạn có thể sử dụng top -b
và 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 -p
cờ và chỉ định pid mà không cần sử dụng grep.
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
Để có được mức sử dụng bộ nhớ của ứng dụng của bạn (trái ngược với các thư viện dùng chung mà nó sử dụng, bạn cần sử dụng giao diện smaps Linux). Câu trả lời này giải thích nó tốt .
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.
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
Đố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,
và %mem
.
Đâ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"
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
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
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
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