Linux / unix işleminin en yüksek bellek kullanımı


376

Komut satırı çalıştıracak ve toplam RAM kullanım toplamını bildirecek bir araç var mı?

/ Usr / bin / time ile benzer bir şey hayal ediyorum

Yanıtlar:


28

İşte herhangi bir harici komut dosyası veya yardımcı program gerektirmeyen ve işlemi Valgrind veya time gibi başka bir program aracılığıyla başlatmanızı gerektirmeyen bir astar, böylece zaten çalışan herhangi bir işlem için kullanabilirsiniz:

grep VmPeak /proc/$PID/status

( $PIDilgilendiğiniz sürecin PID'siyle değiştirin )


4
PID bilmiyorsam ne olur? Örneğin, programın az bir süre çalışması durumunda (<1s)
diralik

4
RAM kullanımını ölçmek için "VmHWM: Pik yerleşik set boyutu" daha kullanışlı olabilir (başka pek çok şey içeren VmPeak yerine).
jfs

@jfs gerçekten ne öğrenmek istediğinize bağlı. IIRC VmPeak sanal bellek dahil maksimum toplam bellek kullanımı vmHWM ise en yüksek RAM kullanımıdır. Dolayısıyla, programınızın istediği toplam bellek miktarını bilmek istiyorsanız, VmPeak kullanın; belirli bir zamanda gerçek RAM'inizin ne kadarını kullandığını öğrenmek istiyorsanız VmHWM kullanın.
erobertc

1
@diralik Eğer kendi yazdığınız bir programı kontrol ediyorsanız, "/ proc / self / status" dosyasına bakmak için bir kod satırı gömebilirsiniz.
Fileland

404

[ Düzenle : Ubuntu üzerinde çalışır 14.04: /usr/bin/time -v command Tam yolu kullandığınızdan emin olun.]

Görünüşe göre /usr/bin/timesize bu bilgileri veriyor gibi görünüyor -v(bu Ubuntu 8.10 açıktır). Maximum resident set sizeAşağıdaki örneğe bakınız:

$ / usr / bin / time -v ls /
....
        Zamanlanan komut: "ls /"
        Kullanıcı süresi (saniye): 0.00
        Sistem zamanı (saniye): 0.01
        Bu işin aldığı CPU yüzdesi: 250%
        Geçen (duvar saati) süresi (s: dd: ss veya m: ss): 0: 00.00
        Ortalama paylaşılan metin boyutu (kbyte): 0
        Ortalama paylaşılmamış veri boyutu (kbyte): 0
        Ortalama yığın boyutu (kbyte): 0
        Ortalama toplam boyut (kbyte): 0
        Maksimum yerleşik ayar boyutu (kbyte): 0
        Ortalama yerleşik set büyüklüğü (kbyte): 0
        Büyük (G / Ç gerektiren) sayfa hataları: 0
        Küçük (bir çerçeveyi geri almak) sayfa hataları: 315
        Gönüllü bağlam anahtarları: 2
        İstemsiz bağlam anahtarları: 0
        Takas: 0
        Dosya sistemi girişleri: 0
        Dosya sistemi çıktıları: 0
        Soket mesajları gönderildi: 0
        Alınan soket mesajları: 0
        Teslim edilen sinyaller: 0
        Sayfa boyutu (bayt): 4096
        Çıkış durumu: 0

4
Muhtemelen her zaman 0 döndürür çünkü ls fazla bir şey yapmaz. Daha yoğun bir CPU komutu deneyin.
Jon Ericson

17
Man sayfasından: Zamana göre gösterilen bilgilerin çoğu wait3 (2) sistem çağrısından elde edilir. Sayılar sadece wait3 (2) tarafından döndürülen rakamlar kadar iyidir. Durum bilgilerini döndüren bir wait3 (2) çağrısı olmayan sistemlerde, bunun yerine times (2) sistem çağrısı kullanılır. Bununla birlikte, wait3 (2) 'den çok daha az bilgi sağlar, bu nedenle bu sistemlerde kaynakların çoğunluğu sıfır olarak bildirilir.
lothar

79
"bash: -v: komut bulunamadı", bash engellemenin kendi kullanma zamanını ifade eder. /bin/time -vçözer.
gcb

3
Çıktının mantıklı olduğundan emin olmak için hızlı bir kontrol yapmak faydalı olacaktır. GNU zaman gerçek bellek kullanımını 4 kat rapor edecek bir hata var: stackoverflow.com/questions/10035232/…
Ian

24
@skalee MacOS'ta deneyin time -l, benzer çıktılar verir.
Volker Stolz

96

(Bu zaten cevaplanmış, eski bir soru .. ama sadece kayıt için :)

Yang'ın senaryosundan ilham aldım ve memusg adlı bu küçük aracı buldum . Kısa yaşam süreçlerinin üstesinden gelmek için örnekleme oranını 0,1'e yükselttim. Tek bir süreci izlemek yerine, süreç grubunun rss toplamını ölçtüm. (Evet, birlikte çalışan birçok ayrı program yazıyorum) Şu anda Mac OS X ve Linux'ta çalışıyor. Kullanım şuna benzer olmalıdır time:

memusg ls -alR /> / dev / null

Sadece şu an için zirveyi gösteriyor, ancak diğer (kaba) istatistikleri kaydetmek için hafif uzantılarla ilgileniyorum.

Ciddi bir profil oluşturmaya başlamadan önce sadece göz atmak için bu kadar basit bir araca sahip olmak iyidir.


1
hala PS kullanan ve sadece gözlemlenen en iyi belleği belirlemek için iyidir. gerçek üst bellek değil. her zaman bir aralık ile diğeri arasındaki bir şeyi kaçırabilirsiniz.
gcb

6
Memusg betiğinin çıktısı için birimler nelerdir? Bayt? Kilobayt?
Daniel Standage

1
@DanielStandage: muhtemelen Kilobayt cinsindendir. Sadece rss'nin BSD kılavuz sayfamdan işlemin gerçek bellek (yerleşik set) boyutu (1024 bayt biriminde)ps -o rss= olduğu ile gösterilen değerleri izler .
netj

3
@gcb Peki, örnekleri ölçerken elde ettiğiniz şey bu.
Volker Stolz

2
Cevapta verilen memusg bağlantısı kopmuş gibi görünüyor. Her neyse, / usr / bin / time bunu çok iyi yapıyor.
Tom Cornebize

65

Valgrind tek astarlı:

valgrind --tool=massif --pages-as-heap=yes --massif-out-file=massif.out ./test.sh; grep mem_heap_B massif.out | sed -e 's/mem_heap_B=\(.*\)/\1/' | sort -g | tail -n 1

Bir işlemdeki tüm belleği ölçmek için --pages-as-yığın olarak kullanıldığına dikkat edin. Daha fazla bilgi burada: http://valgrind.org/docs/manual/ms-manual.html


14
time, Senden ayrılıyorum.
jbeard4

1
Kullanışlı komut dosyası, ama Slackware sistemimde sort -g'ye ihtiyacım var (en yüksek değeri aradığınızı varsayıyorum).
Nick Coleman

3
İçin +1 valgrind --massif. ms_printBununla birlikte gelen aleti kullanışlı çıktı için de kullanabilirsiniz (zaman içinde ascii kullanım çizelgeleri dahil)
Eli Bendersky

7
Massif, daha önce olduğu gibi çok daha yüksek bir yüke sahiptir time, gibi bir komutta en az 10 kat daha fazla zaman alır ls.
Timothy Gu

8
Gerçekten çok büyük. Bu cevap yavaşlamadan bahsetmelidir. Ölçmek istediğim komutun normal olarak tamamlanması 35 saniye sürer. Bu valgrind komutunu yarım saatten fazla bir süre önce ölçmek için çalıştırdım ve hala tamamlanmadı…
unagi

35

Linux'ta:

Kullanın /usr/bin/time -v <program> <args>ve " Maksimum yerleşik ayar boyutu " için arama yapın.

(Bash timeyerleşik komutuyla karıştırılmamalıdır! Bu yüzden tam yolu kullanın , /usr/bin/time)

Örneğin:

> /usr/bin/time -v ./myapp
        User time (seconds): 0.00
        . . .
        Maximum resident set size (kbytes): 2792
        . . .

BSD'de, MacOS:

/usr/bin/time -l <program> <args>" Maksimum yerleşik ayar boyutu " araması yapın, kullanın :

>/usr/bin/time -l ./myapp
        0.01 real         0.00 user         0.00 sys
      1440  maximum resident set size
      . . .

sudo apt-get install time
Rolf

2
Bu zemin iki yıl önce eklenmiş bir cevapla kaplanmamış mı?
Charles Duffy

34

Belki (gnu) zamanı (1) zaten istediğinizi yapar. Örneğin:

$ /usr/bin/time -f "%P %M" command
43% 821248

Ancak diğer profil oluşturma araçları, aradığınız şeye bağlı olarak daha doğru sonuçlar verebilir.


Ben büyük komutlar için bile, bu her zaman sıfırlar gibi görünüyor
jes5199

Aynı programda% 400 0 ve% 0 0 gibi değişken sonuçlar elde ederim.
Liran Orevi

Ne önereceğimi bilmiyorum. Yukarıdaki kod tam olarak tarihte oldu bir lateks komutunu çalıştırmak var. Dediğim gibi, diğer araçlarla daha doğru sonuçlar elde edilebilir.
Jon Ericson

2
Bu, en azından CentOS (ve dolayısıyla bahse girerim, RHEL) sistemlerinde de çalışır. % P, zamanlayıcıya bağlı olan ve dolayısıyla oldukça değişken olan ilişkisiz istatistikler (% CPU) verir.
Blaisorblade

2
@Deleteman: timekullanırken yerleşik bir komuttur csh. Tam yolu kullanırsanız, harici komutu çalıştırmanıza izin verir. Bildiğim kadarıyla sadece GNU sürümü format seçeneğini destekliyor.
Jon Ericson

18

/ usr / bin / time aslında istediğini yapar. Gibi bir şey.

 / usr / bin / time --format = '(% Xtext +% Ddata% Mmax)'

Ayrıntılar için zamana (1) bakın ...


1
Ben büyük komutlar için bile, bu her zaman sıfırlar gibi görünüyor
jes5199

jes5199, Liran, yukarıdaki yorumları bakarak zaman (1) bazı linuxes hafıza raporlaması için kırık olabilir ...
simon

Ubuntu 16.04'te metin ve veriler sıfırdır, ancak max sıfır değildir ve anlamlı değer üretir. Bundan memnunum.
Stéphane Gourichon

Umarım Mmax orada ne demek istediğimizi ifade eder .... adam sayfası bu konuda biraz
aldatıcı

17

MacOS Sierra'da:

/usr/bin/time -l commandToMeasure

grepBelki istediğinizi almak için kullanabilirsiniz .


5
Bu! Kelimenin tam anlamıyla Instruments.app ve dtrace sistem bütünlüğü açık (kapatılamıyor) ile bir bellek profili vermek için çalışırken bir saat geçirdim, tüm gereken sadece bu basit komut oldu. Bunun command time -lyerine kullanabileceğiniz küçük bir not, /usr/bin/time -lkabuğunuzun timeyerleşik işlev yerine adlandırılmış bir ikili dosyayı çağırmasına neden olur . (Evet, commandyer tutucu değil, command timesadece farklı time.)
Jakub Arnold

16

İşlem en az birkaç saniye çalışırsa, verilen komut satırını çalıştıracak ve ardından tepe RSS (streyr) ( rssilgilendiğiniz diğer özniteliklerin yerine) yazdıracak olan aşağıdaki bash betiğini kullanabilirsiniz . Biraz hafif ve psUbuntu 9.04'e dahil olan (benim için söyleyemem time) benim için çalışıyor .

#!/usr/bin/env bash
"$@" & # Run the given command line in the background.
pid=$! peak=0
while true; do
  sleep 1
  sample="$(ps -o rss= $pid 2> /dev/null)" || break
  let peak='sample > peak ? sample : peak'
done
echo "Peak: $peak" 1>&2

1
Bu yöntemin en büyük dezavantajı, işlem kısa bir süre için çok fazla bellek ayırıyorsa (örneğin, sonuna yakın), bunun algılanamayacağıdır. Uyku süresini azaltmak biraz yardımcı olabilir.
vinc17


8

Eğer gerçekten bellek zirvesini ve bazı daha derinlemesine istatistikleri göstermek istiyorsanız, valgrind gibi bir profiler kullanmanızı öneririz . Güzel bir valgrind ön uç alleyoop .



5

İşte (diğer cevaplara dayanarak) zaten çalışan bir süreci izleyen çok basit bir komut dosyası. Sadece argüman olarak izlemek istediğiniz sürecin pidiyle çalıştırın:

#!/usr/bin/env bash

pid=$1

while ps $pid >/dev/null
do
    ps -o vsz= ${pid}
    sleep 1
done | sort -n | tail -n1

Örnek kullanım:

max_mem_usage.sh 23423


1

Heaptrack bir GUI ve metin arayüzü olan KDE aracıdır. Daha fazla ayrıntı ve alev grafiği sağladığı için bir işlemin bellek kullanımını anlamanın valgrind'ten daha uygun olduğunu düşünüyorum. Aynı zamanda daha hızlıdır, çünkü valgrind'i daha az kontrol eder. Ve size en yüksek bellek kullanımını sağlar.

Her neyse, rss ve vss'i izlemek yanıltıcıdır çünkü sayfalar paylaşılabilir, bu yüzden memusg. Ne gerçekten yapmalıyım toplamını izlemek olduğu Pssiçinde /proc/[pid]/smapsveya kullanım pmap. GNOME sistem monitörü bunu yapıyordu ama çok pahalıydı.


1

El yapımı bash betiği ile tekerleği yeniden icat etmek. Hızlı ve temiz.

Benim kullanım durumum: Daha az RAM'e sahip olan ve ağır kullanım altında çalıştığında her kap kullanımının anlık görüntüsünü almak istedim.

#!/usr/bin/env bash

threshold=$1

echo "$(date '+%Y-%m-%d %H:%M:%S'): Running free memory monitor with threshold $threshold%.."

while(true)
    freePercent=`free -m | grep Mem: | awk '{print ($7/$2)*100}'`    
  do

  if (( $(awk 'BEGIN {print ("'$freePercent'" < "'$threshold'")}') ))
  then
       echo "$(date '+%Y-%m-%d %H:%M:%S'): Free memory $freePercent% is less than $threshold%"
       free -m
       docker stats --no-stream
       sleep 60  
       echo ""  
  else
       echo "$(date '+%Y-%m-%d %H:%M:%S'): Sufficient free memory available: $freePercent%"
  fi
  sleep 30

done

Örnek çıktı:

2017-10-12 13:29:33:% 30 eşiği ile ücretsiz bellek monitörü çalışıyor ..

2017-10-12 13:29:33: Yeterli boş hafıza mevcut: 69.4567%

2017-10-12 13:30:03: Yeterli boş hafıza mevcut: 69.4567%

2017-10-12 16:47:02: Boş hafıza 18.9387% 30'dan az

özel komut çıktınız


1

MacOS'ta bunun yerine DTrace'i kullanabilirsiniz. "Instruments" uygulaması bunun için güzel bir GUI, XCode afaik ile geliyor.



-2

Lütfen soruyu cevapladığınızdan emin olun. Ayrıntıları sağlayın ve araştırmanızı paylaşın!

Üzgünüm, ilk defa buradayım ve sadece soru sorabilirim…

Kullanılan önerilen:

valgrind --tool=massif --pages-as-heap=yes --massif-out-file=massif.out ./test.sh; grep mem_heap_B massif.out | sed -e 's/mem_heap_B=\(.*\)/\1/' | sort -g | tail -n 1

sonra:

grep mem_heap_B massif.out
...
mem_heap_B=1150976
mem_heap_B=1150976
...

bu, topkomutun benzer anda gösterilenden çok farklı :

14673 gu27mox   20   0 3280404 468380  19176 R 100.0  2.9   6:08.84 pwanew_3pic_com

Valgrind ölçülen birimler nelerdir ??

/usr/bin/time -v ./test.shAsla cevap - Eğer doğrudan çalıştırılabilir beslemek gerekir /usr/bin/timegibi:

/usr/bin/time -v  pwanew_3pic_compass_2008florian3_dfunc.static  card_0.100-0.141_31212_resubmit1.dat_1.140_1.180   1.140 1.180 31212


    Command being timed: "pwanew_3pic_compass_2008florian3_dfunc.static card_0.100-0.141_31212_resubmit1.dat_1.140_1.180 1.140 1.180 31212"

    User time (seconds): 1468.44
    System time (seconds): 7.37
    Percent of CPU this job got: 99%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 24:37.14
    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): 574844
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 74
    Minor (reclaiming a frame) page faults: 468880
    Voluntary context switches: 1190
    Involuntary context switches: 20534
    Swaps: 0
    File system inputs: 81128
    File system outputs: 1264
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0
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.