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ự top
như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 đó.
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ự top
như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 đó.
Câu trả lời:
Trên Linux, top
thự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
top -p `pgrep -f /usr/bin/kvm`
.
hostname
_pid.txt; exit'and
htop
là 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 top
lạ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
top
cũng có màu sắc. Nhấn z
.
top
có 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).
htop -p PID
cũng sẽ hoạt động, giống như ví dụ được đưa ra bởi @Michael Mrozek.
Các biểu đồ lịch sử địa chỉ sau đây của một số loại . psrecord
Gó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'
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-tk
thám hiểm biểu đồ dựa trên Tkinter ( có thể cần thiết) có thể được xuất:
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-stack
Hình ảnh psutil
và statsd
ứng dụng khách tất cả trong một (từ tác giả của Grafana) . procmon.py
cung 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ư:
Thay vì tập lệnh Python 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 trực tiếp đến Graphite.
telegraf
Cấ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.
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 sysdig
phần mở rộng được viết bằng Lua).
pgrep --help
đến giải cứu. Có ít nhất --newest
và --oldest
.
Ctrl+C
trê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.
Để 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 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.
$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.
top
sản lượng của nó là trung bình hơn $delay
. Cf. Cách tính mức sử dụng CPU
Tôi thường sử dụng hai:
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.
daemontools : tập hợp các công cụ để quản lý các dịch vụ UNIX
Việc sử dụng top
và awk
ngườ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 $delay
vì dấu thời gian được in thực sự bị $delay
chậm lại do cách top
hoạ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
.
Nếu bạn biết tên quy trình, bạn có thể sử dụng
top -p $(pidof <process_name>)
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
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)
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.
top
thự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.
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, ps
lệnh sẽ không trả về "thành công" và while
vò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
....