it-swarm-vi.com

Làm cách nào để theo dõi việc sử dụng CPU / bộ nhớ của một tiến trình đơn?

Tôi muốn theo dõi việc sử dụng bộ nhớ/cpu của một tiến trình trong thời gian thực. Tương tự như top nhưng chỉ nhắm mục tiêu vào một quy trình, tốt nhất là với một biểu đồ lịch sử nào đó.

194
Josh K

Trên Linux, top thực sự hỗ trợ tập trung vào một quy trình, mặc dù tự nhiên nó không có biểu đồ lịch sử:

top -p PID

Điều này cũng có sẵn trên Mac OS X với một cú pháp khác:

top -pid PID
157
Michael Mrozek

psrecord

Các địa chỉ sau biểu đồ lịch sử của một số loại . Python psrecord gói thực hiện chính xác điều này.

pip install psrecord                             # local user install
Sudo apt-get install python-matplotlib python-tk # for plotting; or via pip

Đối với quy trình đơn, đó là quy trình sau (dừng bởi Ctrl+C):

psrecord $(pgrep proc-name1) --interval 1 --plot plot1.png

Đối với một số quy trình, tập lệnh sau đây rất hữu ích để đồng bộ hóa các biểu đồ:

#!/bin/bash    
psrecord $(pgrep proc-name1) --interval 1 --duration 60 --plot plot1.png &
P1=$!
psrecord $(pgrep proc-name2) --interval 1 --duration 60 --plot plot2.png &
P2=$!
wait $P1 $P2
echo 'Done'

Biểu đồ trông giống như: psrecord example

memory_profiler

gói cung cấp lấy mẫu chỉ RSS (cộng với một số tùy chọn dành riêng cho Python). Nó cũng có thể ghi lại quá trình với các tiến trình con của nó (xem mprof --help).

pip install memory_profiler
mprof run /path/to/executable
mprof plot

Theo mặc định, điều này bật lên một Tkinter dựa trên (python-tk có thể cần thiết) biểu đồ Explorer có thể được xuất:

mprof

than chì-stack & statsd

Nó có vẻ quá mức cần thiết cho một thử nghiệm một lần đơn giản, nhưng đối với một cái gì đó như gỡ lỗi vài ngày, chắc chắn, hợp lý. Một tất cả trong một tiện dụng raintank/graphite-stack (từ tác giả của Grafana) và psutilstatsd client. procmon.py cung cấp một triển khai.

$ docker run --rm -p 8080:3000 -p 8125:8125/udp raintank/graphite-stack

Sau đó, trong một thiết bị đầu cuối khác, sau khi bắt đầu quá trình mục tiêu:

$ Sudo apt-get install python-statsd python-psutil # or via pip
$ python procmon.py -s localhost -f chromium -r 'chromium.*'

Sau đó mở Grafana tại http: // localhost: 808 , xác thực là admin:admin, thiết lập nguồn dữ liệu https: // localhost , bạn có thể vẽ biểu đồ như:

grafana chart

than chì-stack & telegraf

Thay vì Python script gửi số liệu đến Statsd, telegraf (và procstat plugin đầu vào) có thể được sử dụng để gửi số liệu để than chì trực tiếp.

Cấu hình tối thiểu telegraf trông giống như:

[agent]
  interval = "1s"

[[outputs.graphite]]
  servers = ["localhost:2003"]
  prefix = "testprfx"

[[inputs.procstat]]
  pid_file = "/path/to/file/with.pid"

Sau đó chạy dòng telegraf --config minconf.conf. Phần Grafana là như nhau, ngoại trừ tên số liệu.

pidstat

pidstat (một phần của gói sysstat) có thể tạo đầu ra có thể dễ dàng phân tích cú pháp. Nó hữu ích trong trường hợp khi bạn cần thêm số liệu từ quy trình, ví dụ: 3 nhóm hữu ích nhất (CPU, bộ nhớ và đĩa) chứa: %usr, %system, %guest, %CPU, minflt/s, majflt/s, VSZ, RSS, %MEM, kB_rd/s, kB_wr/s, kB_ccwr/s. Tôi đã mô tả nó trong một câu trả lời liên quan .

87
saaj

htop là sự thay thế tuyệt vời cho top. Nó có ... Màu sắc! Phím tắt đơn giản! Cuộn danh sách bằng các phím mũi tên! Giết một quá trình mà không cần rời khỏi và không lưu ý đến PID! Đánh dấu nhiều quá trình và tiêu diệt tất cả!

Trong số tất cả các tính năng, trang này cho biết bạn có thể nhấn F để theo dõi một quy trình.

Thực sự, bạn nên thử htop. Tôi không bao giờ bắt đầu top lần nữa, sau lần đầu tiên tôi sử dụng htop.

Hiển thị một quy trình duy nhất:

htop -p PID

67
Denilson Sá Maia

Để sử dụng thông tin đó trên một tập lệnh, bạn có thể làm điều này:

calcPercCpu.sh

#!/bin/bash
nPid=$1;
nTimes=10; # customize it
delay=0.1; # customize it
strCalc=`top -d $delay -b -n $nTimes -p $nPid \
  |grep $nPid \
  |sed -r -e "s;\s\s*; ;g" -e "s;^ *;;" \
  |cut -d' ' -f9 \
  |tr '\n' '+' \
  |sed -r -e "s;(.*)[+]$;\1;" -e "s/.*/scale=2;(&)\/$nTimes/"`;
nPercCpu=`echo "$strCalc" |bc -l`
echo $nPercCpu

sử dụng như: calcPercCpu.sh 1234 trong đó 1234 là pid

Đối với $ nPid được chỉ định, nó sẽ đo trung bình trong số 10 ảnh chụp nhanh của việc sử dụng cpu trong toàn bộ 1 giây (độ trễ 0,1 giây mỗi * nTimes = 10); cung cấp một kết quả chính xác và nhanh chóng về những gì đang xảy ra trong thời điểm này.

Tinh chỉnh các biến theo nhu cầu của bạn.

8
Aquarius Power

Tôi thường sử dụng hai:

  1. HP caliper : công cụ rất tốt để theo dõi các quy trình, bạn cũng có thể kiểm tra biểu đồ cuộc gọi và các thông tin cấp thấp khác. Nhưng xin lưu ý rằng nó chỉ miễn phí cho sử dụng cá nhân.

  2. daemontools : tập hợp các công cụ để quản lý các dịch vụ UNIX

5
Hemant

Sử dụng topawk người ta có thể dễ dàng tạo ví dụ: một bản ghi được phân tách bằng dấu phẩy của% CPU ($9) +% MEM ($10) việc sử dụng mà sau này có thể được đưa vào bất kỳ công cụ thống kê và đồ thị nào.

top -b -d $delay -p $pid | awk -v OFS="," '$1+0>0 {
print strftime("%Y-%m-%d %H:%M:%S"),$1,$NF,$9,$10; fflush() }'

Đầu ra sẽ như thế nào

2019-03-26 17:43:47,2991,firefox,13.0,5.2
2019-03-26 17:43:48,2991,firefox,4.0,5.2
2019-03-26 17:43:49,2991,firefox,64.0,5.3
2019-03-26 17:43:50,2991,firefox,71.3,5.4
2019-03-26 17:43:51,2991,firefox,67.0,5.4

Điều này sẽ không cho kết quả tốt cho lớn $delay, mặc dù, vì dấu thời gian được in thực sự là $delay phía sau do cách hoạt động của đầu ra top '. Không cần đi sâu vào chi tiết, 1 cách đơn giản xung quanh việc này là ghi nhật ký thời gian được cung cấp bởi top:

top -b -d $delay -p $pid | awk -v OFS="," '$1=="top"{ time=$3 }
$1+0>0 { print time,$1,$NF,$9,$10; fflush() }'

Sau đó, dấu thời gian là chính xác, nhưng đầu ra vẫn sẽ bị trì hoãn bởi $delay.

5
xebeche

Nếu bạn biết tên quy trình, bạn có thể sử dụng

top -p $(pidof <process_name>)
2
user4757345

Tôi đến hơi muộn ở đây nhưng tôi sẽ chia sẻ thủ thuật dòng lệnh của mình bằng cách chỉ sử dụng mặc định ps

WATCHED_PID=$({ command_to_profile >log.stdout 2>log.stderr & } && echo $!);
while ps -p $WATCHED_PID --no-headers --format "etime pid %cpu %mem rss"; do 
   sleep 1 
done

Tôi sử dụng nó như là một lót. Ở đây, dòng đầu tiên kích hoạt lệnh và lưu trữ PID trong biến. Sau đó, ps sẽ in thời gian đã trôi qua, bộ vi xử lý phần trăm CPU sử dụng, bộ nhớ phần trăm và bộ nhớ RSS. Bạn có thể thêm các lĩnh vực khác là tốt.

Ngay khi quá trình kết thúc, lệnh ps sẽ không trả về "thành công" và vòng lặp while sẽ kết thúc.

Bạn có thể bỏ qua dòng đầu tiên nếu PID bạn muốn cấu hình đang chạy. Chỉ cần đặt id mong muốn trong biến.

Bạn sẽ nhận được một đầu ra như thế này:

  00:00  7805  0.0  0.0  2784
  00:01  7805 99.0  0.8 63876
  00:02  7805 99.5  1.3 104532
  00:03  7805  100  1.6 129876
  00:04  7805  100  2.1 170796
  00:05  7805  100  2.9 234984
  00:06  7805  100  3.7 297552
  00:07  7805  100  4.0 319464
  00:08  7805  100  4.2 337680
  00:09  7805  100  4.5 358800
  00:10  7805  100  4.7 371736
  ....
2
theist

Không đủ danh tiếng để bình luận, nhưng đối với psrecord, bạn cũng có thể gọi nó trực tiếp, theo cách lập trình, trực tiếp bằng Python:

from psrecord.main import monitor
monitor(<pid number>, logfile = "./test.log", plot="./fig.png", include_children=True)
2
ZettaCircl

Nếu bạn có một bản phân phối Linux bị cắt giảm trong đó tùy chọn hàng đầu không có tùy chọn (-p) hoặc các tùy chọn liên quan, bạn có thể phân tích đầu ra của lệnh hàng đầu cho tên quy trình của bạn để lấy thông tin sử dụng CPU cho mỗi quy trình.

while true;  do top -bn1 | awk '/your_process_name/ {print  $8}' ; sleep 1; done

8 đại diện cho mức sử dụng CPU trên mỗi quy trình trong đầu ra của lệnh cao nhất trong bản phân phối Linux nhúng của tôi

1
Razan Paul
pidstat -p 7994 2 

03:54:43 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
03:54:45 PM     0      7994    1.50    1.50    0.00    3.00     1  AliYunDun
03:54:47 PM     0      7994    1.00    1.00    0.00    2.00     0  AliYunDun

cứ sau 2 giây lại sử dụng 7994 cpu

0
赵宝磊

Nếu bạn cần mức trung bình trong một khoảng thời gian của một quy trình cụ thể, hãy thử tùy chọn tích lũy -c hàng đầu:

top -c a -pid PID

"-C a" được tìm thấy trong đầu cho Mac 10.8.5.

Đối với Khoa học Linux, tùy chọn là -S, có thể được đặt tương tác.

0
Kieleth