Làm thế nào để ghi nhật ký bộ nhớ và sử dụng cpu của một ứng dụng?


16

Tương tự như câu hỏi Làm thế nào để đăng nhập tải CPU? , Tôi muốn ghi lại bộ nhớ của một quá trình.

Quá trình tôi muốn đăng nhập, bị giết trên một máy chủ từ xa và tôi muốn tìm hiểu tải CPU và việc sử dụng bộ nhớ ngay trước khi nó bị giết.

[cập nhật]

Cả kịch bản con trăn nhỏ gọn gàng của Stefano Palazzo và

Các giá trị đầu ra một dòng của Michał nhỏ hơn so topvới CPU và Mem. Bạn có một ý tưởng tại sao?

đầu ra:

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 
2312 schXX     20   0 1241m 328m  58m S  100  0.3  11:56.68 MATLAB 

đầu ra kịch bản python của Stefano Palazzo:

python memlogger.py 2312
%CPU    %MEM
76.00   0.20
76.00   0.20

Rất tiếc, tôi không thể bình luận ở đây nhưng bạn có thể tìm thấy bài đăng quan tâm này tại sao pscó thể khác với top: stackoverflow.com/questions/131303/iêu
PM

Câu trả lời:


16

Bạn có thể tạo một lớp lót trong vỏ:

logpid() { while sleep 1; do  ps -p $1 -o pcpu= -o pmem= ; done; }

để đăng nhập quá trình với pid = 123 chỉ:

logpid 123

hoặc để xem và ghi nhật ký vào tập tin:

logpid $$ | tee /tmp/pid.log

Nếu bạn muốn dữ liệu khác được ghi lại, sửa đổi -o {this}các tùy chọn. Xem man psphần "THÔNG SỐ KỸ THUẬT TIÊU CHUẨN" để biết các thông số khả dụng. Nếu bạn muốn độ phân giải thời gian khác nhau, thay đổi sleep {this}chức năng logpid().


Đơn giản và làm công việc!
rafaelbattesti

3

Nếu bạn chính xác sau các topsố liệu thống kê, bạn có thể chạy toptrong chế độ hàng loạt chỉ định pid của quá trình mà bạn đang theo dõi. Lấy ví dụ từ trang này ( http://www.dedoimedo.com/computers/linux-cool-hacks.html ) nếu bạn đã nhập

top -b -d 10 -n 3 >> top-file

Bạn sẽ "chạy hàng đầu trong chế độ hàng loạt (-b). Nó sẽ làm mới cứ sau 10 giây, như được chỉ định bởi cờ trì hoãn (-d), với tổng số 3 lần lặp (-n). Đầu ra sẽ được gửi vào một tập tin. " Bao gồm -pbạn có thể chỉ định pidquá trình mà bạn đang theo đuổi. Điều này tất nhiên sẽ trả về nhiều hơn cpu và ram đơn thuần nhưng nó sẽ chứa các trường thos. Trong trường hợp của tôi chẳng hạn, tôi sẽ nhận được những điều sau đây khi theo dõi pid 9189 bằng cách sử dụng top -b -d 10 -n 3 -p 9189 >> ~/top-file:

PID  USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
9189 pmj27     20   0 1617016 808112  27916 S   0.0  0.3   1:36.63 gedit

Trang này, mặc dù nó không chuyển hướng đến một tệp, nhưng thực hiện một số sửa đổi phức tạp hơn cho phép bạn chỉ lấy CPU được in ra. Nếu bạn có ai đó biết một cách hay để chuyển hướng đầu ra sang tệp và cập nhật định kỳ theo định kỳ thì tôi muốn biết. watchđối với tôi điều này dường như không lý tưởng: superuser.com/questions/281347/filtering-top-command-output
PM

2

Kịch bản python đơn giản này sẽ làm những gì bạn muốn:

import time
import string
import sys
import commands

def get_cpumem(pid):
    d = [i for i in commands.getoutput("ps aux").split("\n")
        if i.split()[1] == str(pid)]
    return (float(d[0].split()[2]), float(d[0].split()[3])) if d else None

if __name__ == '__main__':
    if not len(sys.argv) == 2 or not all(i in string.digits for i in sys.argv[1]):
        print("usage: %s PID" % sys.argv[0])
        exit(2)
    print("%CPU\t%MEM")
    try:
        while True:
            x,y = get_cpumem(sys.argv[1])
            if not x:
                print("no such process")
                exit(1)
            print("%.2f\t%.2f" % (x,y))
            time.sleep(0.5)
    except KeyboardInterrupt:
        print
        exit(0)

Trước tiên bạn cần tìm ra id tiến trình của chương trình bạn muốn theo dõi, sau đó bạn có thể chạy tập lệnh với PID làm đối số:

python log.py 3912

Nó sẽ in mức sử dụng cpu và sử dụng ram theo phần trăm hai lần một giây:

%CPU    %MEM
0.90    0.40
1.43    0.40
8.21    0.40
...

Sau đó, bạn có thể chuyển hướng đầu ra của nó thành một tệp để nhập nó vào bảng tính sau ( python log.py 9391 > firefox_log.txt) và nhập dữ liệu vào bảng tính chọn Tablàm dấu phân cách của bạn.

Chương trình thoát khi bạn nhấn Ctrl + C hoặc khi quá trình bị hủy.


Stefano thân mến, cảm ơn bạn rất nhiều vì kịch bản của bạn. Thật không may, nó dường như đầu ra kết quả sai. Bạn có biết tại sao không? Xin vui lòng xem câu hỏi cập nhật của tôi.
Framester

Từ trang man man man7.org/linux/man-pages/man1/ps.1.html , ps xuất ra "thời gian CPU được sử dụng chia cho thời gian quá trình đang chạy (tỷ lệ thời gian thực / thời gian thực), được biểu thị bằng phần trăm "- vì vậy bạn có được mức trung bình của việc sử dụng CPU kể từ khi nó bắt đầu
Nicolas Charles
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.