Bagaimana mengukur di Linux memori puncak aplikasi setelah berakhir


11

Bagaimana cara mengukur memori puncak aplikasi yang berjalan di Linux?

Saya menjalankan aplikasi ini dalam batch sehingga saya tidak dapat menggunakan RSS karena, itu melaporkan memori saat ini. Saya membutuhkan memori puncak bahwa aplikasi telah digunakan untuk dilaporkan pada akhirnya.

VmPeak juga bukan solusi, karena melaporkan memori yang dialokasikan dan juga tidak menghitung dari Ram asli tetapi juga dari Hard Disk.


OS apa yang Anda jalankan aplikasi?
CVn

Saya bekerja di Linux
des_user

Utas ini seharusnya dapat membantu Anda: serverfault.com/questions/387268/…
Jacob Coleman

Jawaban:


13

Berikut adalah 2 metode untuk melacak penggunaan memori puncak suatu proses.

Seperti sirop

Saya belum pernah menggunakan alat ini, tetapi kedengarannya seperti yang Anda cari. Itu disebut Syrupy .

Deskripsi

Syrupy adalah skrip Python yang secara teratur mengambil snapshot dari memori dan beban CPU dari satu atau lebih proses yang berjalan, sehingga secara dinamis membangun profil penggunaan sumber daya sistem mereka.

Contoh

$ syrupy.py myprog

  PID DATE        TIME     ELAPSED  CPU   MEM    RSS   VSIZE
14634 2008-10-10  20:45:25   00:00  0.0   0.0   2996    6680
14634 2008-10-10  20:45:26   00:01  105   0.2   7804   12592
14634 2008-10-10  20:45:27   00:02  103   0.2   8996   13776
14634 2008-10-10  20:45:28   00:03  103   0.2  10468   15348
14634 2008-10-10  20:45:29   00:04  103   0.3  11412   16396
14634 2008-10-10  20:45:30   00:05  104   0.3  12492   17444

/usr/bin/time -v

Ya ironisnya perintah waktu GNU dapat memberi Anda penggunaan memori puncak suatu proses. Ini laporan memori puncak seperti: Maximum resident set size (kbytes).

Contoh

$ /usr/bin/time -v ~/projects/prime_numbers/eratosthenes_prime_sieve.pl 10 1000000
...

    Command being timed: "/home/saml/projects/prime_numbers/eratosthenes_prime_sieve.pl 10 1000000"
    User time (seconds): 1.12
    System time (seconds): 0.05
    Percent of CPU this job got: 54%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.19
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 79304
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 20014
    Voluntary context switches: 83
    Involuntary context switches: 274
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

Referensi


3

Meskipun topiknya sudah cukup lama, saya ingin berbagi proyek lain yang muncul dari fitur cgroups Linux kernel.

https://github.com/gsauthof/cgmemtime :

cgmemtime mengukur penggunaan air dari RSS + CACHE proses dan proses turunannya.

Untuk dapat melakukannya, ia menempatkan proses ke dalam grup sendiri.

Misalnya proses A mengalokasikan 10 MiB dan memotong anak B yang mengalokasikan 20 MiB dan yang memotong anak C yang mengalokasikan 30 MiB. Ketiga proses berbagi jendela waktu di mana alokasi mereka menghasilkan penggunaan memori RSS (resident set size) yang sesuai.

Pertanyaannya sekarang adalah: Berapa banyak memori yang sebenarnya digunakan sebagai hasil dari menjalankan A?

Jawab: 60 MiB

cgmemtime adalah alat untuk menjawab pertanyaan seperti itu.

Contoh penggunaan adalah:

$ sudo ./cgmemtime --setup -g <myusergroup> --perm 775

$ ./cgmemtime ./testa x 10 20 30
Parent PID is 27189
Allocating 10 MiBs
New Child: 27193
Allocating 20 MiBs
New Child: 27194
Allocating 30 MiBs
Child user:    0.000 s
Child sys :    0.005 s
Child wall:    6.006 s
Child high-water RSS                    :      11648 KiB
Recursive and acc. high-water RSS+CACHE :      61840 KiB

$ ./cgmemtime python -c 'print range(100000)[48517]'
48517
Child user:    0.014 s
Child sys :    0.014 s
Child wall:    0.029 s
Child high-water RSS                    :       9948 KiB
Recursive and acc. high-water RSS+CACHE :       5724 KiB

Jadi, bagaimana alat ini dapat digunakan untuk melaporkan penggunaan RAM puncak suatu program setelah program itu keluar ?
terdon

@terdon Ini digunakan wait4untuk menangkap proses keluar dalam kombinasi dengan cgroups ( memory.max_usage_in_bytes), yang tampaknya masuk akal. Rincian lebih lanjut tersedia di README di github.
Vlad Frolov

Terima kasih, tetapi poin saya lebih pada jawaban Anda. Seperti berdiri, itu tidak menjawab pertanyaan, hanya menunjuk ke beberapa sumber daya eksternal yang mungkin bisa. Selain itu, Anda telah memposting jawaban yang sama persis di tempat lain yang menimbulkan bendera otomatis. Harap edit jawaban Anda dan sertakan contoh yang menunjukkan bagaimana program ini dapat melakukan apa yang diminta OP.
terdon

2
@terdon Ya, saya lakukan! Karena saya telah mencari pertanyaan yang sama dan pertanyaannya hampir sama, dan jawabannya semua sama: 'parse ps output', yang gila! Saya menghabiskan seminggu sebelum secara tidak sengaja bertemu dengan proyek cgmemtime, yang merupakan pasangan sempurna untuk semua pertanyaan itu, yang telah saya komentari!
Vlad Frolov

1
Cukup adil. Akan sangat bagus jika Anda bisa memberikan contoh bagaimana itu bisa digunakan. Itu akan meningkatkan jawaban Anda. Bagaimanapun, terima kasih telah meluangkan waktu untuk memposting ini, saya yakin orang lain akan merasa berguna.
terdon
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.