Linux'ta bir uygulamanın en yüksek belleği sona erdiğinde nasıl ölçülür


11

Linux üzerinde çalışan bir uygulamanın tepe belleğini nasıl ölçerim?

Bu uygulamayı toplu olarak çalıştırıyorum, bu yüzden RSS kullanamıyorum, mevcut belleği bildiriyor. Ben uygulama sonunda rapor için kullanılan tepe belleğe ihtiyacım var.

Ayrılmış belleği bildirdiği ve gerçek Ram'dan değil, aynı zamanda Sabit Diskten hesapladığı için VmPeak de bir çözüm değildir.


Uygulamayı hangi işletim sisteminde çalıştırıyorsunuz?
CVn

Linux üzerinde çalışıyorum
des_user

Bu konu size yardımcı olmalı: serverfault.com/questions/387268/…
Jacob Coleman

Yanıtlar:


13

İşte bir sürecin en yüksek bellek kullanımını izlemek için 2 yöntem.

şuruplu

Bu aracı kullanmadım ama aradığınıza benziyor. Buna Şurup denir .

Açıklama

Syrupy, düzenli olarak sistem kaynaklarını kullanımlarının bir profilini dinamik olarak oluşturmak için bir veya daha fazla çalışan işlemin belleğinin ve CPU yükünün anlık görüntülerini çeken bir Python betiğidir.

Misal

$ 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

Evet, ironik bir şekilde GNU zaman komutu size bir işlemin en yüksek bellek kullanımını sağlayabilir. O kadar gibi zirve belleği bildirir: Maximum resident set size (kbytes).

Misal

$ /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

Referanslar


3

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

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

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

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

Örneğin A prosesi 10 MiB tahsis eder ve 20 MiB tahsis eden bir B çocuğunu çatallar ve 30 MiB tahsis eden bir çocuk C'yi çatallar. Her üç işlem de tahsislerinin karşılık gelen RSS (yerleşik set boyutu) bellek kullanımına yol açtığı bir zaman penceresini paylaşır.

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

Yanıt: 60 MiB

cgmemtime bu tür soruları cevaplamak için bir araçtır.

Kullanım örnekleri:

$ 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

Peki, bu araç , bir program çıktıktan sonra bir programın en yüksek RAM kullanımını bildirmek için nasıl kullanılabilir ?
terdon

@terdon Mantıklı gibi görünen wait4cgroups ( memory.max_usage_in_bytes) ile kombinasyon halinde işlem çıkışını yakalamak için kullanılır. Daha fazla ayrıntı github'daki README'de mevcuttur.
Vlad Frolov

Teşekkürler, ama benim cevabım daha çok cevabınızdı. Haliyle, soruyu cevaplamıyor, sadece yapabileceği bazı dış kaynaklara işaret ediyor. Ayrıca, aynı cevabı başka bir yerde otomatik bir bayrak açan başka bir yere gönderdiniz . Lütfen yanıtınızı düzenleyin ve bu programın OP'nin istediklerini nasıl yapabileceğini gösteren bir örnek ekleyin.
terdon

2
@terdon Evet, yaptım! Çünkü aynı soruyu araştırdım ve sorular hemen hemen aynı ve cevaplar aynı: 'ps çıktısını ayrıştır', ki bu çılgınca! Bir hafta önce yanlışlıkla yorumladığım tüm bu sorular için mükemmel bir eşleşme olan cgmemtime projesine çarptım!
Vlad Frolov

1
Yeterince adil. Nasıl kullanılabileceğine dair bir örnek verebilirseniz harika olur. Cevabınızı geliştirir. Her durumda, bunu göndermek için zaman ayırdığınız için teşekkürler, eminim başkaları yararlı bulacaktır.
terdon
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.