Bir programın RAM kullanımını ölçme


46

time Belirli bir komutun ne kadar zaman harcadığını hesaplamak istiyorsanız mükemmel bir komuttur.

Programın ve herhangi bir çocuğun maksimum RAM kullanımını ölçebilecek benzer bir şey arıyorum. Tercihen, kullanılmış ve kullanılmamış olan ayrılmış bellek arasında ayrım yapması gerekir. Belki medyan hafıza kullanımını bile verebilir (bu yüzden uzun süre çalıştırırken beklemeniz gereken hafıza kullanımı).

Bu yüzden yapmak istiyorum:

rammeassure my_program my_args

ve çıktı benzer olsun:

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

memusg Https://gist.github.com/526585/590293d6527c91e48fcb08edb8de9fd6c88a6d82 adresine baktım ama bunu biraz kesmek olarak görüyorum.

Yanıtlar:


24

Bir işlemin yüksek su belleği kullanımını (RSS ve sanal) ölçmek için tstime kullanabilirsiniz .

Örneğin:

$ 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

Ayrıca çıkış modunun ayrıştırılması daha kolay ( -t).


Bunu sevdim. Hatta Doğru Şey yaptı./tstime -t bash -c 'perl -e "\$a=\"x\"x100000000;\$b=\$a.\$a;\$b=\"\";\$a=\"\";sleep 10;"'
Ole Tange

3
"İşlem tarafından RAM kullanımı" iyi tanımlanmış bir değer değildir: Çalışan aynı programın birkaç örneği varsa, çalıştırılabilir dosyayı paylaşırlar. Çoğu program paylaşır glibc(ve diğer çeşitli kütüphanelere, bir şey için "paylaşılan" denir). Birçok servis çalışanı konfigürasyonu hafızaya ve çatal (2) çocuğa yükler ve daha sonra konfigürasyon verilerini paylaşır. Daha sonra, çekirdek tarafından yönetilen okuma / yazma yazma tamponlarında veri var. Ve sonra gevşek bir şekilde birbirine bağlanmış işlemlerin sürüsü olan hizmetler var (masaüstü ortamınızı ve tüm uygulamalarını ve arka planını düşünün).
vonbrand

@ vonbrand, Linux-Kernel'in RSS / VSS değerlerini nasıl hesapladığı iyi tanımlanmıştır.
maxschlepzig

@ maxschlepzig, bazı rasgele değerleri hesaplayabilir, bu da demek istediklerini kastettikleri anlamına gelmez: Yerleşik küme, yalnızca şu anda bellekte olan işlem adres adresleridir. Bu, "bu işlem tarafından kullanılan bellek" değildir , ne paylaştığını içerir.
von 23.03

@ vonbrand Bir işlemin bellek kullanımını ölçme durumlarının çoğu, aynı girdiyle çok öngörülebilen, paylaşılmayan anonim sayfaları ölçmek isteyecektir.
Vladimir Panteleev

28

timeKabuğunuzun yerleşik bir parçasıdır. İsterseniz timeama daha fazla bilgiye ihtiyacınız varsa , GNU'yu timeverbose ( -v) modunda deneyin :

/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

Paket yöneticinizde "time" veya "gnutime" paketini arayın.


3
GNU tarafından bildirilen bazı bilgilerin yanlış olabileceğini unutmayın. Örn: Ubuntu 10.04 altında: Man sayfası "sayılar sadece wait3 (2) 'de döndürülenler kadar iyidir" şeklinde yazmaktadır. Yani wait3açıklanan bir yapı doldurur getrusage(2): 'Bütün alanları Linux altında anlamlıdır. [..]'.
maxschlepzig

4
Örneğin, tam olarak 10 MB tahsis eden (ve her sayfaya değen) bir test programında - GNU süresi maksimum 42608 KiB tstimerapor eder - ve 10652 KiB rapor eder. Yine 10.04 Ubuntu altında.
maxschlepzig

Bu kadar basit olsaydı sevebilirdim. Ubuntu yüklü kendi Denedim: /usr/bin/time -v perl -e '$a="x"x100000000;$b=$a.$a;sleep 10;'. top 570 MB civarında olduğunu söylüyor, ancak zaman 2.3 GB diyor. Uygulamada bu numara benim için kullanılamaz.
Ole Tange,

4 faktörü GNU süresi 1.7'de sabittir ve bu nedenle beklendiği gibi çalışır.
Ole Tange

Önemli not: "Maksimum yerleşik küme boyutu" yalnızca Linux 2.6.32'den beri çalışır.
Jan Hudec

17

Belki fazla öldürmek, ama ben sadece valgrindadında güzel bir araç olduğunu buldum massif. Üzerinde test ettim xterm:

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

Ve güzel bir hafıza kullanım grafiği elde edersiniz:

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

aşırı detaylı bellek kullanım bilgisi ile birlikte. Ayrıntılar valgrind kılavuzuna .

Programlar yaklaşık 20 kat daha yavaş çalışacaktır. Ayrıca, içinde bazı komutlar koştum xterm. --trace-children=yesSeçenek orada olduğu için onların bellek ayak izi dikkate alınmıştır !


1
20x hız cezası durumum için uygun değil. Aksi takdirde çok güzel grafik!
Ole Tange,

1
Öyle görünüyor ki, en azından kullandığım valgrind'ün 3.8.1 sürümünde, boolean'ler yalnızca "evet / hayır" şeklinde ve "doğru / yanlış" olarak kabul ediliyorlar. Mine şikayet etti! :-)
MakisH

6

Konu oldukça eski olsa da, grupların Linux çekirdeği özelliğinden ortaya çıkan başka bir projeyi paylaşmak istiyorum.

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

cgmemtime, bir işlemin ve onun soyundan gelen işlemlerin yüksek su RSS + CACHE bellek kullanımını ölçer.

Bunu yapabilmek için süreci kendi grubuna koyar.

Örneğin, A süreci 10 MiB tahsis eder ve 20 MiB tahsis eden ve 30 MiB tahsis eden bir C çocuğunu çatallayan bir B çocuğunu çatallar. Üç işlemin tümü, tahsislerinin karşılık gelen RSS (yerleşik set büyüklüğü) bellek kullanımına neden olduğu bir zaman penceresini paylaşır.

Şimdi soru şu: A çalıştırmanın sonucu olarak gerçekte ne kadar bellek kullanılıyor?

Cevap: 60 MiB

cgmemtime bu tür soruları cevaplama aracıdır.


3

Görünüşe göre tstime artık Linux> = 3.0 altında root dışı çalışmaz. İşte bu soruna yanıt vermek için yazdığım bir yoklama programı: https://github.com/jhclark/memusg/blob/master/memusg


/usr/bin/time -vdaha yeni sürümlerde doğru çıktıyı verir. Eski versiyonlarda, doğru miktarı alabilmeniz için 4'e bölmeniz yeterlidir.
Ole Tange

Ancak, zamanın -v'nin tepe boyutsal büyüklüğü desteklediğini sanmıyorum (sadece RSS). Birisi bunu en son sürümde onaylayabilir mi?
jhclark
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.