Jawaban:
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 $PID
dengan PID dari proses yang Anda minati)
[ Sunting : Bekerja pada Ubuntu 14.04: /usr/bin/time -v command
Pastikan untuk menggunakan path lengkap.]
Sepertinya /usr/bin/time
memberi Anda informasi itu, jika Anda lulus -v
(ini ada di Ubuntu 8.10). Lihat, misalnya, di Maximum resident set size
bawah:
$ / 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
/bin/time -v
menyelesaikannya.
time -l
di MacOS, berikan output yang serupa.
(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.
ps -o rss=
mana rss adalah memori nyata (resident set) ukuran proses (dalam 1024 byte unit) dari halaman manual BSD saya.
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
time
, Saya meninggalkan anda.
valgrind --massif
. Anda juga dapat menggunakan ms_print
alat yang menyertainya untuk keluaran praktis (termasuk grafik penggunaan ascii dari waktu ke waktu)
time
sekalipun, mengambil setidaknya 10 kali lebih banyak waktu pada perintah seperti ls
.
Di Linux:
Gunakan /usr/bin/time -v <program> <args>
dan cari " Ukuran set penduduk maksimum ".
(Jangan bingung dengan perintah time
built-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
. . .
sudo apt-get install time
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.
time
adalah 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.
/ usr / bin / waktu mungkin melakukan apa yang Anda inginkan, sebenarnya. Sesuatu seperti.
/ usr / bin / time --format = '(% Xtext +% Ddata% Mmax)'
Lihat waktu (1) untuk detail ...
Di MacOS Sierra, gunakan:
/usr/bin/time -l commandToMeasure
Anda dapat menggunakan grep
untuk mengambil apa yang Anda inginkan.
command time -l
alih-alih /usr/bin/time -l
yang akan menyebabkan shell Anda benar-benar memanggil biner yang disebut time
alih-alih fungsi builtin. (Ya, command
bukan pengganti, command time
berbeda dari adil time
.)
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 rss
atribut lain yang Anda minati). Ini agak ringan, dan bekerja untuk saya dengan yang ps
termasuk 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
Anda dapat menggunakan alat seperti Valgrind untuk melakukan ini.
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
Gunakan Massif: http://valgrind.org/docs/manual/ms-manual.html
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 Pss
di /proc/[pid]/smaps
atau penggunaan pmap
. Monitor sistem GNOME biasa melakukannya tetapi terlalu mahal.
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
Di macOS, Anda bisa menggunakan DTrace. Aplikasi "Instrumen" adalah GUI yang bagus untuk itu, ia datang dengan XCode afaik.
'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
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 top
diperlihatkan 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.sh
tidak pernah dijawab - Anda harus langsung memberi makan executable agar /usr/bin/time
menyukai:
/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