Bagaimana cara mencatat memori dan menggunakan aplikasi?

16

Mirip dengan pertanyaan Bagaimana cara memuat CPU? , Saya ingin mencatat memori suatu proses.

Proses yang saya ingin log, terbunuh di server jauh, dan saya ingin mengetahui beban CPU dan penggunaan memori sebelum itu terbunuh.

[memperbarui]

Baik skrip python kecil Stefano Palazzo dan

Nilai output satu baris Michał yang lebih kecil dari pada topuntuk CPU dan Mem. Apakah Anda punya ide mengapa?

Output atas:

 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 

tampilkan skrip python Stefano Palazzo:

python memlogger.py 2312
%CPU    %MEM
76.00   0.20
76.00   0.20
Framester
sumber
Sayangnya saya belum bisa berkomentar di sini, tetapi Anda mungkin menemukan postingan menarik ini menjelaskan mengapa psmungkin berbeda dari top: stackoverflow.com/questions/131303/…
PM

Jawaban:

16

Anda dapat membuat satu-liner di shell:

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

untuk login proses dengan pid = 123 saja:

logpid 123

atau untuk melihat dan menulis log ke file:

logpid $$ | tee /tmp/pid.log

Jika Anda ingin data lain dicatat, ubah -o {this}opsi. Lihat man psbagian "SPESIFIKASI FORMAT STANDAR" untuk parameter yang tersedia untuk digunakan. Jika Anda menginginkan resolusi waktu yang berbeda, ubah sleep {this}fungsinya logpid().

Michał Šrajer
sumber
Sederhana dan berhasil!
rafaelbattesti
3

Jika Anda tepat setelah topstatistik, Anda bisa menjalankan topdalam mode batch menentukan pid dari proses yang Anda cari. Mengambil contoh dari halaman ini ( http://www.dedoimedo.com/computers/linux-cool-hacks.html ) jika Anda mengetik

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

Anda akan "memiliki top running dalam mode batch (-b). Ini akan di-refresh setiap 10 detik, sebagaimana ditentukan oleh flag delay (-d), untuk jumlah total 3 iterasi (-n). Output akan dikirim ke file. " Termasuk -pAnda dapat menentukan pidproses yang Anda inginkan. Ini tentu saja akan mengembalikan lebih dari cpu dan ram murni tetapi akan berisi bidang-bidang itu. Dalam kasus saya misalnya saya akan mendapatkan yang berikut saat memantau pid 9189 menggunakan 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
SORE
sumber
Halaman ini, meskipun tidak melakukan pengalihan ke file, melakukan beberapa modifikasi yang lebih canggih yang memungkinkan Anda untuk mendapatkan hanya CPU yang dicetak. Jika Anda seseorang mengetahui cara yang baik untuk mengarahkan output ke file dan memperbaruinya secara berkala, saya akan tertarik untuk mengetahuinya. watchsepertinya tidak ideal untuk saya untuk ini: superuser.com/questions/281347/filtering-top-command-output
PM
2

Skrip python sederhana ini harus melakukan apa yang Anda inginkan:

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)

Pertama-tama Anda perlu mengetahui id proses dari program yang ingin Anda pantau, kemudian Anda dapat menjalankan skrip dengan PID sebagai argumen:

python log.py 3912

Ini akan mencetak penggunaan CPU dan penggunaan ram dalam persen dua kali per detik:

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

Anda kemudian dapat mengarahkan outputnya ke file untuk mengimpornya ke spreadsheet nanti ( python log.py 9391 > firefox_log.txt) dan mengimpor data ke dalam spreadsheet yang dipilih Tabsebagai pemisah Anda.

Program berhenti ketika Anda menekan Ctrl + C atau ketika prosesnya dimatikan.

Stefano Palazzo
sumber
Dear Stefano, terima kasih banyak untuk skripmu. Sayangnya sepertinya menghasilkan hasil yang salah. Apakah Anda tahu mengapa? Silakan lihat pertanyaan saya yang diperbarui.
Framester
Dari halaman manual ps man7.org/linux/man-pages/man1/ps.1.html , ps menampilkan "waktu CPU yang digunakan dibagi dengan waktu proses berjalan (rasio cputime / realtime), dinyatakan sebagai persentase "- jadi Anda mendapatkan rata-rata penggunaan CPU sejak dimulai
Nicolas Charles