Mengukur penggunaan RAM suatu program

46

time adalah perintah yang brilian jika Anda ingin mengetahui berapa banyak waktu CPU yang diberikan perintah.

Saya mencari sesuatu yang serupa yang dapat mengukur penggunaan maksimal RAM program dan setiap anak. Lebih disukai itu harus membedakan antara memori yang dialokasikan yang digunakan dan yang tidak digunakan. Mungkin bahkan bisa memberikan penggunaan memori median (jadi penggunaan memori yang Anda harapkan saat berjalan untuk waktu yang lama).

Jadi saya ingin melakukan:

rammeassure my_program my_args

dan dapatkan output yang mirip dengan:

Max memory allocated: 10233303 Bytes
Max memory used: 7233303 Bytes
Median memory allocation: 5233303 Bytes

Saya telah melihat memusg https://gist.github.com/526585/590293d6527c91e48fcb08edb8de9fd6c88a6d82 tapi saya menganggapnya sebagai peretasan.

Ole Tange
sumber

Jawaban:

24

Anda dapat menggunakan tstime untuk mengukur penggunaan memori highwater (RSS dan virtual) dari suatu proses.

Sebagai contoh:

$ tstime date       
Tue Aug 16 21:35:02 CEST 2011

Exit status: 0

pid: 31169 (date) started: Tue Aug 16 21:35:02 2011
        real   0.017 s, user   0.000 s, sys   0.000s
        rss      888 kb, vm     9764 kb

Ini juga mendukung mode keluaran yang lebih mudah diurai ( -t).

maxschlepzig
sumber
Saya suka itu. Bahkan melakukan The Right Thing with./tstime -t bash -c 'perl -e "\$a=\"x\"x100000000;\$b=\$a.\$a;\$b=\"\";\$a=\"\";sleep 10;"'
Ole Tange
3
"Penggunaan RAM oleh proses" bukan nilai yang didefinisikan dengan baik: Jika ada beberapa contoh dari program yang sama berjalan, mereka berbagi yang dapat dieksekusi. Sebagian besar program berbagi glibc(dan berbagai perpustakaan lainnya, mereka disebut "dibagikan" untuk sesuatu). Banyak daemon yang memuat konfigurasi ke dalam memori dan fork (2) anak-anak, yang kemudian membagikan data konfigurasi. Lalu ada data di buffer readahead / writebehind yang dikelola oleh kernel. Dan kemudian ada layanan yang merupakan kawanan proses longgar digabungkan (pikirkan lingkungan desktop Anda dan semua applet dan hal-hal latar belakang).
vonbrand
@vonbrand, bagaimana Linux-Kernel menghitung nilai-nilai RSS / VSS didefinisikan dengan baik.
maxschlepzig
@maxschlepzig, mungkin menghitung beberapa nilai acak, itu tidak berarti mereka berarti apa yang Anda pikirkan: Set penduduk hanya halaman di ruang alamat proses yang saat ini ada dalam memori. Itu bukan "memori yang digunakan oleh proses ini", itu termasuk apa pun yang dibagikan.
vonbrand
@vonbrand Sebagian besar kasus penggunaan untuk mengukur penggunaan memori suatu proses ingin mengukur halaman anonim yang tidak dibagikan, yang seharusnya sangat dapat diprediksi dengan input yang sama.
Vladimir Panteleev
28

timeadalah built-in dari shell Anda. Jika Anda suka timetetapi memerlukan informasi lebih lanjut, coba GNU timedalam -vmode verbose ( ):

/usr/bin/time -v sleep 5               
    Command being timed: "sleep 5"
    User time (seconds): 0.00
    System time (seconds): 0.00
    Percent of CPU this job got: 0%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:05.00
    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): 2144
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 179
    Voluntary context switches: 2
    Involuntary context switches: 1
    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

Cari paket "waktu" atau "gnutime" di manajer paket Anda.

Rufo El Magufo
sumber
3
Perhatikan bahwa beberapa informasi yang dilaporkan oleh waktu GNU mungkin tidak akurat. Misalnya di bawah Ubuntu 10.04: Halaman manual menyatakan 'Angka-angkanya hanya sebagus yang dikembalikan oleh wait3 (2)'. Yaitu wait3mengisi struktur yang dijelaskan dalam getrusage(2): 'Tidak semua bidang bermakna di Linux. [..] '.
maxschlepzig
4
Misalnya pada program pengujian yang mengalokasikan 10 MB (dan menyentuh setiap halaman) dengan tepat - waktu GNU melaporkan maksRSS sebesar 42608 KiB - dan tstimemelaporkan 10652 KiB. Lagi di bawah Ubuntu 10,04.
maxschlepzig
Saya akan senang jika sesederhana ini. Pada mesin Ubuntu saya mencoba: /usr/bin/time -v perl -e '$a="x"x100000000;$b=$a.$a;sleep 10;'. top mengatakan butuh sekitar 570 MB, tetapi waktu mengatakan 2.3 GB. Dalam praktiknya angka itu tidak bisa saya gunakan.
Ole Tange
Faktor 4 diperbaiki dalam waktu GNU 1,7 dan dengan demikian berfungsi seperti yang diharapkan.
Ole Tange
Catatan penting: "Ukuran set penduduk maksimum" hanya berfungsi sejak Linux 2.6.32.
Jan Hudec
17

Mungkin berlebihan, tetapi saya baru saja menemukan yang valgrindmemiliki alat bagus bernama massif. Saya mengujinya pada xterm:

valgrind --trace-children=yes --tool=massif xterm
ms_print massif.out.* | less

Dan Anda mendapatkan grafik penggunaan memori yang bagus:

    MB
4.230^                     #                    :::::::  :::      @@:     ::: 
     |   @                 #:::@::@@:::::@::::::: :: : ::: :::::::@ ::::::: ::
     |   @               ::#:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::::@@:::::::::: #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
     |   @::: @ :: ::: : : #:: @: @ ::: :@: :: :: :: : ::: ::: : :@ :: : :: ::
   0 +----------------------------------------------------------------------->Mi
     0                                                                   292.4

bersama dengan info penggunaan memori yang terlalu rinci. Detail dalam manual valgrind .

Program akan berjalan sekitar 20x lebih lambat. Juga, saya menjalankan beberapa perintah di dalam xterm. Jejak memori mereka telah diperhitungkan karena --trace-children=yesopsinya ada!

Stéphane Gimenez
sumber
1
Penalti kecepatan 20x membuatnya tidak cocok untuk situasi saya. Kalau tidak, grafik yang sangat cantik!
Ole Tange
1
Sepertinya, setidaknya dalam versi 3.8.1 dari valgrind yang saya gunakan, boolean hanya diterima dalam bentuk "ya / tidak" dan bukan "benar / salah". Punyaku mengeluh! :-)
MakisH
6

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 RSS + CACHE air-tinggi dari suatu 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 (ukuran penduduk) yang sesuai.

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

Jawab: 60 MiB

cgmemtime adalah alat untuk menjawab pertanyaan seperti itu.

Vlad Frolov
sumber
3

Sepertinya tstime tidak berfungsi lagi di bawah non-root di Linux> = 3.0. Inilah utilitas polling yang saya tulis untuk meretas masalah ini: https://github.com/jhclark/memusg/blob/master/memusg

jhclark
sumber
/usr/bin/time -vmemberikan hasil yang benar dalam versi yang lebih baru. Dalam versi yang lebih lama Anda hanya perlu membagi dengan 4 untuk mendapatkan jumlah yang benar.
Ole Tange
Namun, saya tidak berpikir waktu -v mendukung ukuran puncak vmemory (hanya RSS). Adakah yang bisa mengkonfirmasi ini pada versi terbaru?
jhclark