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?


170

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ự topnhưng chỉ nhắm mục tiêu vào một quá trình, tốt nhất là với một biểu đồ lịch sử nào đó.


Bạn muốn thống kê bộ nhớ nào? Chúng có rất nhiều.
vwduder

Sử dụng bộ nhớ trong một khung thời gian nhất định, mức sử dụng hiện tại, mức sử dụng tối đa, trung bình.
Josh K

Câu trả lời:


139

Trên Linux, topthực sự hỗ trợ tập trung vào một quy trình duy nhất, 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

9
Và vì bạn có thể không muốn tìm kiếm PID mỗi lần, hãy thử một cái gì đó như thế top -p `pgrep -f /usr/bin/kvm`.
Stefan Lasiewski

Tôi sử dụng Cacti để giám sát một số quy trình riêng lẻ, nhưng việc cài đặt toàn bộ cài đặt Cacti có vẻ quá phức tạp đối với tình huống đơn giản được hỏi ở đây.
Stefan Lasiewski

@Stefan: Tôi cho rằng tôi sẽ phải chạy nó từ xa?
Josh K

@Josh: Có, bạn sẽ cần chạy Cacti (Yêu cầu MySQL, Apache và một số gói khác) trên một máy chủ khác. Trên hầu hết các bản phát hành, việc cài đặt bằng Yum hoặc apt-get khá đơn giản.
Stefan Lasiewski

@Stefan nếu bạn muốn kiểm tra từ xa, bạn có thể thực hiện ssh @ remotehost 'top -p PID> ~ hostname_pid.txt; exit'and
klerk

61

htoplà một 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 web nói rằng bạn có thể nhấn Fđể làm theo một quy trình.

Thực sự, bạn nên thử htop. Tôi không bao giờ bắt đầu toplại, 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


7
+1 cho htop. Đây là một trong những chương trình đầu tiên tôi cài đặt trên một hệ thống mới. Nó làm cho cuộc sống của tôi dễ dàng hơn nhiều. Chế độ xem cây cũng rất tiện dụng.
Barthelemy

9
topcũng có màu sắc. Nhấn z.
tshepang

2
Bạn đúng! topcó màu sắc! Quá tệ, màu sắc của nó khá vô dụng, đặc biệt khi so sánh với htop(làm mờ dần các quá trình người dùng khác và làm nổi bật tên cơ sở của chương trình).
Denilson Sá Maia

1
htop -p PIDcũng sẽ hoạt động, giống như ví dụ được đưa ra bởi @Michael Mrozek.
ồn ào

1
Sau đó, lý do duy nhất để sử dụng hàng đầu, là vì htop không có sẵn hoặc không thể được cài đặt. Đó là lý do tại sao htop được tạo ra, để cung cấp nhiều tính năng hơn.
lepe

59

psrecord

Các biểu đồ lịch sử địa chỉ sau đây của một số loại . psrecordGói Python 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 như: ví dụ psrecord

memory_profiler

Các gói cung cấp RSS-chỉ lấy mẫu (cộng với một số tùy chọn Python cụ thể). 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 trình python-tkthám hiểm biểu đồ dựa trên Tkinter ( có thể cần thiết) có thể được xuất:

mprof

than chì-stack & statsd

Nó có vẻ quá mức 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ý. raintank/graphite-stackHình ảnh psutilstatsdứng dụng khách tất cả trong một (từ tác giả của Grafana) . procmon.pycung cấp một thực hiện.

$ 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: 8080 , xác thực dưới dạng admin:admin, thiết lập nguồn dữ liệu https: // localhost , bạn có thể vẽ biểu đồ như:

biểu đồ grafana

than chì-stack & telegraf

Thay vì tập lệnh Python gửi số liệu đến Statsd, telegraf(và procstatplugin đầu vào) có thể được sử dụng để gửi số liệu trực tiếp đến Graphite.

telegrafCấu hình tối thiểu trô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.

hệ thống

sysdig(có sẵn trong repos của Debian và Ubuntu) với giao diện người dùng kiểm tra sysdig trông rất hứa hẹn, cung cấp các chi tiết cực kỳ chi tiết cùng với việc sử dụng CPU và RSS, nhưng tiếc là UI không thể kết xuất chúng và sysdig không thể lọc procinfo sự kiện theo quy trình tại thời gian viết. Mặc dù, điều này nên có thể với một cái đục tùy chỉnh (một sysdigphần mở rộng được viết bằng Lua).


pgrep systemd đang đưa ra nhiều dòng đầu ra, và do đó làm hỏng psrecord, nên làm gì? Tôi chỉ muốn thử nghiệm với bất kỳ quá trình.
EralpB

1
@EralpB pgrep --helpđến giải cứu. Có ít nhất --newest--oldest.
saaj

2
Đây phải là câu trả lời được chấp nhận, vì nó thực sự mang lại một âm mưu lịch sử sử dụng bộ nhớ. Lưu ý đối với phương thức psrecord, Ctrl+Ctrên quy trình psrecord chỉ thoát mà không lưu một âm mưu, bạn cần kết thúc quá trình kiểm tra dưới quy trình.
dùng2561747

8

Để 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 1234trong đó 1234 là pid

Đối với $ nPid được chỉ định, nó sẽ đo trung bình 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.


Uhm, 10 quy trình để giám sát việc sử dụng cpu của 1?
xebeche

@xebeche "nó sẽ đo trung bình 10 ảnh chụp nhanh" "nTimes = 10; # tùy chỉnh nó" :)
Sức mạnh của Bảo Bình

Ý tôi là tôi không thích việc bạn gọi 10 quy trình để lấy 1 số ( $nPercCpu): shell, top, grep, sed, cut ... bc. Ví dụ, nếu không phải tất cả những thứ này bạn có thể hợp nhất thành 1 tập lệnh Sed hoặc Awk.
xebeche

@xebeche tuyệt vời, vui lòng chỉnh sửa thêm một lệnh tốt hơn vào lệnh hiện có (thay thế), bạn có được sự tò mò của tôi :)
Aquarius Power

1
Tôi đã thêm câu trả lời của riêng mình . BTW, lưu ý rằng không có điểm nào trong việc tính trung bình vì topsản lượng của nó là trung bình hơn $delay. Cf. Cách tính mức sử dụng CPU
xebeche

5

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


6
Tôi đã sử dụng daemontools trong nhiều năm. Thật tuyệt vời khi là người giám sát / giám sát cho các quy trình khác. Làm thế nào nó giúp bạn theo dõi việc sử dụng CPU / bộ nhớ cho một quá trình?
Stefan Lasiewski

3

Việc sử dụng topawkngười ta có thể dễ dàng tạo ra một bản ghi nhật ký được phân tách bằng dấu phẩy của việc sử dụng % CPU ( $9) +% MEM ( $10) mà sau này có thể được đưa vào bất kỳ công cụ thống kê và biểu đồ 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

Tuy nhiên, điều này sẽ không mang lại kết quả tốt $delayvì dấu thời gian được in thực sự bị $delaychậm lại do cách tophoạt động của đầu ra. Không đi sâu vào chi tiết, 1 cách đơn giản để làm điều này là ghi lại 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.


2

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

top -p $(pidof <process_name>)

8
Đó là khá nhiều những gì câu trả lời được chấp nhận, từ nhiều năm trước, và bình luận đầu tiên của nó nói.
dhag

1

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 trên 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

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)

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 -c tích lũy 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 Science Linux, tùy chọn là -S, có thể được đặt tương tác.


Bạn có thể muốn thêm thông tin chi tiết xung quanh phiên bản nào topthực sự cung cấp tính năng này. Phiên bản của tôi trên Fedora 19 thì không. Tương tự trên Ubuntu 13.04.
slm

Bạn nói đúng! Tôi rất vui vì đã tìm thấy thứ gì đó hữu ích, tôi quên mất tôi đang ở trong máy mac ở nhà.
Kieleth

0

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 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, pslệnh sẽ không trả về "thành công" và whilevòng lặp 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
  ....
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.