Tôi muốn theo dõi việc sử dụng bộ nhớ của một quá trình và tôi muốn dữ liệu này được ghi lại. Liệu một công cụ như vậy tồn tại?
Tôi muốn theo dõi việc sử dụng bộ nhớ của một quá trình và tôi muốn dữ liệu này được ghi lại. Liệu một công cụ như vậy tồn tại?
Câu trả lời:
Tôi đã viết một kịch bản để làm chính xác điều này . Về cơ bản, nó lấy mẫu ps
theo các khoảng thời gian cụ thể, để xây dựng một hồ sơ của một quy trình cụ thể. Quá trình có thể được khởi chạy bởi chính công cụ giám sát hoặc nó có thể là một quá trình độc lập (được chỉ định bởi pid hoặc mẫu lệnh).
Thỉnh thoảng khi có nhu cầu, tôi chỉ cần làm:
$ top -d 1 -b |grep <process> >>somefile
Đó không phải là một giải pháp tao nhã, nhưng sẽ hoàn thành công việc nếu bạn muốn giá trị thô nhanh chóng để xác minh giả thuyết của bạn.
grep --line-buffered <process> >>somefile
để buộc grep xuất ra từng dòng mà không cần đệm
sar
(Trình báo cáo hoạt động hệ thống ) từ gói sysstat là bạn của bạn trong trường hợp như thế này.
Một cách khác là theo dõi kết hợp với dữ liệu lịch sử, ví dụ Munin, pnp4nagios, rrdtools, ...
sar
thể tập trung vào chỉ một quá trình? chủ yếu là nó dường như giám sát toàn bộ hệ thống
pidstat
lệnh cũng từ gói sysstat cung cấp một giao diện khá đẹp cho báo cáo thống kê về quá trình duy nhất.
Bạn có thể thử Valgrind .
Valgrind là một khung công cụ để xây dựng các công cụ phân tích động. Có các công cụ Valgrind có thể tự động phát hiện nhiều lỗi quản lý bộ nhớ và luồng, và cấu hình chi tiết các chương trình của bạn. Bạn cũng có thể sử dụng Valgrind để xây dựng các công cụ mới.
Phân phối Valgrind hiện bao gồm sáu công cụ chất lượng sản xuất: trình phát hiện lỗi bộ nhớ , hai trình phát hiện lỗi luồng, trình tạo bộ đệm dự đoán nhánh và bộ đệm, trình tạo biểu đồ cuộc gọi và trình lược tả dự đoán nhánh và trình lược tả heap .
Tôi thích câu trả lời đơn giản của Sridhar nhưng tôi tự lăn lộn trước khi thử:
import json, psutil, datetime, time
with open('log.txt', 'w') as f:
while True:
json.dump((datetime.datetime.now().isoformat(),
psutil.Process(7274).memory_info()._asdict()), f)
f.write('\n')
f.flush()
time.sleep(1)
Về cơ bản nó chỉ hữu ích nếu bạn muốn đầu ra có cấu trúc. Thay đổi 7274 cho phù hợp. Ngoài ra Python 3.5.s Something đã bị hỏng _asdict()
, vì vậy hãy sử dụng Python 2.
Tệp đầu ra trông như:
["2019-03-19T11:21:53.784670", {"rss": 220389376, "vms": 538984448, "shared": 15724544, "text": 303104, "lib": 0, "data": 221364224, "dirty": 0}]
["2019-03-19T11:21:54.786136", {"rss": 220438528, "vms": 539119616, "shared": 15724544, "text": 303104, "lib": 0, "data": 221499392, "dirty": 0}]
["2019-03-19T11:21:55.787555", {"rss": 220495872, "vms": 539119616, "shared": 15724544, "text": 303104, "lib": 0, "data": 221499392, "dirty": 0}]
["2019-03-19T11:21:56.788754", {"rss": 220528640, "vms": 539119616, "shared": 15724544, "text": 303104, "lib": 0, "data": 221499392, "dirty": 0}]