Puncak penggunaan memori proses linux / unix

376

Apakah ada alat yang akan menjalankan baris perintah dan melaporkan total penggunaan RAM puncak?

Saya membayangkan sesuatu yang analog dengan / usr / bin / time

jes5199
sumber

Jawaban:

28

Berikut ini adalah one-liner yang tidak memerlukan skrip atau utilitas eksternal dan tidak mengharuskan Anda untuk memulai proses melalui program lain seperti Valgrind atau waktu, sehingga Anda dapat menggunakannya untuk proses apa pun yang sudah berjalan:

grep VmPeak /proc/$PID/status

(ganti $PIDdengan PID dari proses yang Anda minati)

erobertc
sumber
4
Bagaimana jika saya tidak tahu PID? Misalnya dalam kasus ketika program menjalankan sejumlah kecil waktu (<1s)
diralik
4
"VmHWM: Ukuran atur penduduk puncak" mungkin lebih dapat digunakan untuk mengukur penggunaan RAM (bukan VmPeak yang mencakup banyak hal lain juga).
jfs
@ JFS benar-benar tergantung apa yang ingin Anda ketahui. IIRC VmPeak adalah penggunaan total memori maksimum termasuk memori virtual, sedangkan VmHWM adalah penggunaan RAM puncak. Jadi, jika Anda ingin mengetahui jumlah total memori yang diminta oleh program Anda, gunakan VmPeak; jika Anda ingin tahu berapa banyak RAM Anda yang sebenarnya pernah digunakan pada waktu tertentu, gunakan VmHWM.
erobertc
1
@diralik jika Anda memeriksa program yang ditulis sendiri, Anda dapat menyematkan sederet kode untuk melihat ke file "/ proc / self / status".
Fileland
404

[ Sunting : Bekerja pada Ubuntu 14.04: /usr/bin/time -v command Pastikan untuk menggunakan path lengkap.]

Sepertinya /usr/bin/timememberi Anda informasi itu, jika Anda lulus -v(ini ada di Ubuntu 8.10). Lihat, misalnya, di Maximum resident set sizebawah:

$ / usr / bin / waktu -v ls /
....
        Perintah diatur waktunya: "ls /"
        Waktu pengguna (detik): 0,00
        Waktu sistem (detik): 0,01
        Persentase CPU dari pekerjaan ini: 250%
        Waktu yang berlalu (jam dinding) (j: mm: dd atau m: dd): 0: 00.00
        Ukuran teks rata-rata yang dibagikan (kbytes): 0
        Ukuran data rata-rata yang tidak dibagi (kbytes): 0
        Ukuran tumpukan rata-rata (kbytes): 0
        Ukuran total rata-rata (kbytes): 0
        Ukuran set penduduk maksimum (kbytes): 0
        Ukuran pengaturan penduduk rata-rata (kbytes): 0
        Kesalahan halaman utama (membutuhkan I / O): 0
        Kesalahan halaman minor (reclaiming a frame): 315
        Sakelar konteks sukarela: 2
        Sakelar konteks tidak sukarela: 0
        Swap: 0
        Input sistem file: 0
        Output sistem file: 0
        Pesan soket terkirim: 0
        Pesan soket diterima: 0
        Sinyal yang dikirim: 0
        Ukuran halaman (byte): 4096
        Status keluar: 0
Jacob Gabrielson
sumber
4
Mungkin selalu mengembalikan 0 karena ls tidak berbuat banyak. Coba perintah yang lebih intensif CPU.
Jon Ericson
17
Dari halaman manual: Sebagian besar informasi yang ditunjukkan oleh waktu berasal dari panggilan sistem wait3 (2). Jumlahnya sama baiknya dengan yang dikembalikan oleh wait3 (2). Pada sistem yang tidak memiliki panggilan wait3 (2) yang mengembalikan informasi status, kali (2) panggilan sistem digunakan sebagai gantinya. Namun, ia menyediakan informasi yang jauh lebih sedikit daripada wait3 (2), sehingga pada sistem tersebut waktu melaporkan sebagian besar sumber daya sebagai nol.
lothar
79
"bash: -v: command not found" berarti bash memotong waktu untuk menggunakannya. /bin/time -vmenyelesaikannya.
gcb
3
Sebaiknya lakukan pemeriksaan cepat untuk memastikan output masuk akal. Waktu Gnu memiliki bug di mana ia akan melaporkan 4x penggunaan memori yang sebenarnya: stackoverflow.com/questions/10035232/…
Ian
24
@skalee Coba time -ldi MacOS, berikan output yang serupa.
Volker Stolz
96

(Ini adalah pertanyaan lama yang sudah dijawab .. tetapi hanya untuk catatan :)

Saya terinspirasi oleh naskah Yang, dan muncul dengan alat kecil ini, bernama memusg . Saya hanya meningkatkan laju sampling menjadi 0,1 untuk menangani banyak proses kehidupan pendek. Alih-alih memantau satu proses, saya membuatnya mengukur jumlah grup proses. (Ya, saya menulis banyak program terpisah yang bekerja bersama-sama) Saat ini berfungsi pada Mac OS X dan Linux. Penggunaannya harus serupa dengan time:

memusg ls -alR /> / dev / null

Ini hanya menunjukkan puncak untuk saat ini, tetapi saya tertarik pada sedikit ekstensi untuk merekam statistik (kasar) lainnya.

Adalah baik untuk memiliki alat sederhana seperti itu hanya untuk melihatnya sebelum kita memulai pembuatan profil yang serius.

netj
sumber
1
semua yang masih menggunakan PS dan hanya baik untuk menentukan memori teratas yang diamati. bukan top memory nyata. Anda selalu dapat melewatkan sesuatu antara satu interval dengan interval lainnya.
gcb
6
Apa unit untuk hasil skrip memusg? Bytes? Kilobyte?
Daniel Standage
1
@DanielStandage: mungkin di Kilobytes. Ini hanya menonton nilai-nilai yang ditunjukkan oleh di ps -o rss=mana rss adalah memori nyata (resident set) ukuran proses (dalam 1024 byte unit) dari halaman manual BSD saya.
netj
3
@ gcb Jadi apa, itu yang Anda dapatkan ketika Anda mengukur sampel.
Volker Stolz
2
Tautan ke memusg yang diberikan dalam jawaban tampaknya rusak. Bagaimanapun, / usr / bin / waktu melakukan ini dengan sangat baik.
Tom Cornebize
65

Valgrind one-liner:

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

Perhatikan penggunaan - halaman-sebagai-tumpukan untuk mengukur semua memori dalam suatu proses. Info lebih lanjut di sini: http://valgrind.org/docs/manual/ms-manual.html

jbeard4
sumber
14
time, Saya meninggalkan anda.
jbeard4
1
Skrip praktis, tetapi saya perlu mengurutkan -g pada sistem Slackware saya (saya kira Anda mencari nilai tertinggi).
Nick Coleman
3
+1 untuk valgrind --massif. Anda juga dapat menggunakan ms_printalat yang menyertainya untuk keluaran praktis (termasuk grafik penggunaan ascii dari waktu ke waktu)
Eli Bendersky
7
Massif memiliki overhead jauh lebih tinggi daripada timesekalipun, mengambil setidaknya 10 kali lebih banyak waktu pada perintah seperti ls.
Timothy Gu
8
Memang terlalu besar. Jawaban ini harus menyebutkan perlambatan. Perintah yang ingin saya ukur biasanya membutuhkan waktu 35 detik untuk selesai. Saya telah menjalankan perintah valgrind ini untuk mengukurnya lebih dari setengah jam yang lalu, dan masih belum selesai ...
unagi
35

Di Linux:

Gunakan /usr/bin/time -v <program> <args>dan cari " Ukuran set penduduk maksimum ".

(Jangan bingung dengan perintah timebuilt-in Bash ! Jadi gunakan path lengkap , /usr/bin/time)

Sebagai contoh:

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

Di BSD, MacOS:

Gunakan /usr/bin/time -l <program> <args>, cari " ukuran set penduduk maksimum ":

>/usr/bin/time -l ./myapp
        0.01 real         0.00 user         0.00 sys
      1440  maximum resident set size
      . . .
rustyx
sumber
sudo apt-get install time
Rolf
2
Bukankah tanah ini sudah dicakup oleh jawaban yang ditambahkan dua tahun sebelumnya ?
Charles Duffy
34

Mungkin (gnu) waktu (1) sudah melakukan apa yang Anda inginkan. Contohnya:

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

Tetapi alat profil lain mungkin memberikan hasil yang lebih akurat tergantung pada apa yang Anda cari.

Jon Ericson
sumber
Saya sepertinya selalu mendapatkan nol dengan ini, bahkan untuk perintah besar
jes5199
Saya mendapatkan hasil variabel, seperti 400% 0, dan 0% 0 pada program yang sama .. mungkin harus dijalankan untuk periode waktu yang lebih besar tepatnya?
Liran Orevi
Saya tidak tahu harus menyarankan apa. Kode di atas adalah persis apa yang saya dapatkan menjalankan perintah lateks yang kebetulan ada dalam sejarah. Seperti yang saya katakan, hasil yang lebih akurat dapat diperoleh dengan alat lain.
Jon Ericson
2
Itu bekerja pada setidaknya sistem CentOS (dan dengan demikian, saya yakin, juga RHEL). % P memberikan statistik yang tidak terkait (% CPU) yang tergantung pada penjadwal dan karenanya cukup variabel.
Blaisorblade
2
@Deleteman: timeadalah perintah bawaan saat menggunakan csh. Jika Anda menggunakan jalur yang tepat, itu akan memungkinkan Anda untuk menjalankan perintah eksternal. Sejauh yang saya tahu, hanya versi GNU yang mendukung opsi format.
Jon Ericson
18

/ usr / bin / waktu mungkin melakukan apa yang Anda inginkan, sebenarnya. Sesuatu seperti.

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

Lihat waktu (1) untuk detail ...

simon
sumber
1
Saya sepertinya selalu mendapatkan angka nol dengan ini, bahkan untuk perintah besar
jes5199
jes5199, Liran, melihat komentar di atas tampaknya waktu (1) mungkin rusak untuk pelaporan memori pada beberapa linuxes ...
simon
Pada Ubuntu 16.04, teks dan data adalah nol, tetapi maks bukan nol dan menghasilkan nilai yang berarti. Saya senang dengan itu.
Stéphane Gourichon
Saya harap Mmax ada artinya yang kita inginkan .... halaman manual sedikit singkat tentang hal itu
matanster
17

Di MacOS Sierra, gunakan:

/usr/bin/time -l commandToMeasure

Anda dapat menggunakan grepuntuk mengambil apa yang Anda inginkan.

gsamaras
sumber
5
Ini! Saya benar-benar menghabiskan satu jam mencoba untuk mendapatkan Instruments.app dan dtrace untuk memberi saya profil memori dengan integritas sistem dihidupkan (tidak dapat mematikannya), sedangkan yang saya butuhkan hanyalah perintah sederhana ini. Sebuah catatan kecil, Anda dapat menggunakan command time -lalih-alih /usr/bin/time -lyang akan menyebabkan shell Anda benar-benar memanggil biner yang disebut timealih-alih fungsi builtin. (Ya, commandbukan pengganti, command timeberbeda dari adil time.)
Jakub Arnold
16

Jika proses berjalan setidaknya beberapa detik, maka Anda dapat menggunakan skrip bash berikut, yang akan menjalankan baris perintah yang diberikan kemudian mencetak ke stderr RSS puncak (pengganti untuk rssatribut lain yang Anda minati). Ini agak ringan, dan bekerja untuk saya dengan yang pstermasuk dalam Ubuntu 9.04 (yang saya tidak bisa mengatakannya time).

#!/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
Yang
sumber
1
Kelemahan utama dari metode ini adalah bahwa jika proses mengalokasikan banyak memori untuk waktu yang singkat (misalnya menjelang akhir), ini mungkin tidak terdeteksi. Mengurangi waktu tidur mungkin sedikit membantu.
vinc17
11
time -f '%M' <run_program>
Jason
sumber
8

Nah, jika Anda benar-benar ingin menunjukkan puncak memori dan beberapa statistik yang lebih mendalam saya sarankan menggunakan profiler seperti valgrind . Front-end valgrind yang bagus adalah alleyoop .

Alex
sumber
5

Anda dapat menggunakan alat seperti Valgrind untuk melakukan ini.

Dana the Sane
sumber
5

Berikut ini (berdasarkan jawaban lain) naskah yang sangat sederhana yang mengawasi proses yang sudah berjalan. Anda cukup menjalankannya dengan pid dari proses yang ingin Anda tonton sebagai argumen:

#!/usr/bin/env bash

pid=$1

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

Contoh penggunaan:

max_mem_usage.sh 23423
static_rtti
sumber
1

Heaptrack adalah alat KDE yang memiliki antarmuka GUI dan teks. Saya merasa lebih cocok daripada valgrind untuk memahami penggunaan memori dari suatu proses karena memberikan lebih banyak detail dan flamegraf. Ini juga lebih cepat karena kurang memeriksa valgrind itu. Dan itu memberi Anda penggunaan memori puncak.

Bagaimanapun, melacak rss dan vss adalah menyesatkan karena halaman dapat dibagikan, itu sebabnya memusg. Apa yang Anda benar-benar harus Anda lakukan adalah melacak jumlah Pssdi /proc/[pid]/smapsatau penggunaan pmap. Monitor sistem GNOME biasa melakukannya tetapi terlalu mahal.

Benoît
sumber
1

Menemukan kembali roda, dengan skrip bash buatan tangan. Cepat dan bersih.

Kasus penggunaan saya: Saya ingin memantau mesin linux yang memiliki RAM lebih sedikit dan ingin mengambil snapshot dari penggunaan per kontainer ketika itu berjalan di bawah penggunaan yang berat.

#!/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

Output sampel:

2017-10-12 13:29:33: Menjalankan monitor memori bebas dengan ambang 30% ..

2017-10-12 13:29:33: Memori bebas yang cukup tersedia: 69,4567%

2017-10-12 13:30:03: Cukup tersedia memori gratis: 69,4567%

2017-10-12 16:47:02: Memori bebas 18.9387% kurang dari 30%

output perintah khusus Anda

Sankarganesh Eswaran
sumber
1

Di macOS, Anda bisa menggunakan DTrace. Aplikasi "Instrumen" adalah GUI yang bagus untuk itu, ia datang dengan XCode afaik.

Michael Böckling
sumber
0

'htop' adalah perintah terbaik untuk melihat proses mana yang menggunakan berapa banyak RAM .....

untuk lebih detail http://manpages.ubuntu.com/manpages/precise/man1/htop.1.html

Sanket
sumber
3
htop tidak mencantumkan penggunaan PEAK. Hanya penggunaan SAAT INI. (Kecuali Anda tahu sesuatu yang saya tidak tahu. Seperti yang saya lihat kemarin di htop untuk skenario yang tepat ini.)
Katastic Voyage
-2

Pastikan untuk menjawab pertanyaan. Berikan detail dan bagikan penelitian Anda!

Maaf, saya pertama kali di sini dan hanya bisa bertanya ...

Disarankan disarankan:

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

kemudian:

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

ini sangat berbeda dari yang topdiperlihatkan oleh perintah pada saat yang sama:

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

apa yang diukur unit dari Valgrind ??

Yang /usr/bin/time -v ./test.shtidak pernah dijawab - Anda harus langsung memberi makan executable agar /usr/bin/timemenyukai:

/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
ryabchik
sumber