Bir işlemin bellek kullanımını çağırın ve izleyin


14

Bellek tüketen bir program çalıştırmak ve zaman içinde bellek kullanımını izlemek istiyorum. Program çağrıldıktan sonra birkaç saniye içinde sona erer.

Bu önceki soru sysstat paketini önerdi . Onun ederken pidstatyarar kısmen ne istiyorum yapar, benim 2 ihtiyaçlarını karşılamak için başarısız:

  • Minimum bir aralığı kabul eder 1s, ancak daha kısa ayrıntı düzeyinde ölçmek istiyorum. (iyi 0.1solmalı)
  • Yalnızca mevcut bir işlemi izler, ancak pid'i kopyalayıp yapıştırmak için her zaman hazır olamam.

Çağırma ve ölçme işini daha iyi yapmak için alternatif komut dosyaları / yardımcı programlar var mı?


1
İşlemin bellek kullanımını boşaltmak için kendinize basit bir küçük Python veya Bash betiği yazmanız gerekir (sadece ilk tamsayıyı görüntüleyebilirsiniz /proc/$PID/statm) ve sonra 100 ms uyku ve tekrarlayın. Neden sadece PID en ilişkili atma devam edemez statmyoluyla cat, belki ekstra / gereksiz değerlere kapalı filtreye bazı normal ifadeler kullanabilirsiniz ve sadece bunu sleep 0.01? Bazı işletim sistemleri ikinci saniyeden daha düşük sleepdeğerlere izin vermez , bu durumda Python yolunu kullanmanız gerekir (ve timebunun yerine uyumak için Python'un yerleşik kitaplığını kullanmanız gerekir).
Atılım

Yanıtlar:


11

Bu ihtiyacınız olanı yapmalı. Bilgileri alır /proc/$PID/statmve yazdırır man procfs:

              size       total program size
                         (same as VmSize in /proc/[pid]/status)
              resident   resident set size
                         (same as VmRSS in /proc/[pid]/status)
              share      shared pages (from shared mappings)
              data       data + stack

Senaryo:

#!/usr/bin/env bash 

## Print header
 echo -e "Size\tResid.\tShared\tData\t%"
 while [ 1 ]; do
    ## Get the PID of the process name given as argument 1
     pidno=`pgrep $1`
    ## If the process is running, print the memory usage
     if [ -e /proc/$pidno/statm ]; then
     ## Get the memory info
      m=`awk '{OFS="\t";print $1,$2,$3,$6}' /proc/$pidno/statm`
     ## Get the memory percentage
      perc=`top -bd .10 -p $pidno -n 1  | grep $pidno | gawk '{print \$10}'`
     ## print the results
      echo -e "$m\t$perc";
    ## If the process is not running
     else
      echo "$1 is not running";
     fi
 done

Daha sonra komut dosyasını girdi olarak bir işlem adı vererek çağırabilirsiniz. Örneğin:

$ memusage.sh firefox
Size    Resid.  Shared  Data    %
517193  261902  9546    400715  12.8
517193  261902  9546    400715  12.8
517193  261902  9546    400715  12.8
517193  262100  9546    400715  12.8
517193  262100  9546    400715  12.8
517193  262100  9546    400715  12.8
517209  261899  9546    400731  12.8
517209  261899  9546    400731  12.8

NOTLAR:

  • Bu, belirtilen adla yalnızca tek bir çalışan işlem olduğunu varsayar .

@ björnen düzenleme için teşekkür ederim. Çok haklısın, manorada yanlış yaptım, düzenlemenin neden reddedildiğini bilmiyorum.
terdon

1

Yıllar sonra valgrind (ayrıca) bunun için bir araç buldum:

# record memory usage

$ valgrind --tool=massif bash -c "sleep 5; echo hey";
==5281== Massif, a heap profiler
==5281== Copyright (C) 2003-2015, and GNU GPL'd, by Nicholas Nethercote
==5281== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==5281== Command: bash -c sleep\ 5;\ echo\ hey
==5281==
hey
==5281==

# print the usage (5281 was the pid of bash, your filename will be different)
$ ms_print massif.out.4682

Not: valgrind gözlemlemekten daha fazlasını yapar: bazı kodlar enjekte etmeli ve belleğin anlık görüntüsünü almalıdır. Bu istatistiklerin kesinliğine zarar verebilir.

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.