Pertanyaan ini dibahas di sini dengan sangat rinci.
Bagaimana Anda mengukur penggunaan memori suatu aplikasi atau proses di Linux?
Dari artikel blog Memahami penggunaan memori di Linux , ps
bukan alat yang akurat untuk digunakan untuk maksud ini.
Kenapa
ps
"salah"Tergantung pada bagaimana Anda melihatnya,
ps
tidak melaporkan penggunaan proses memori nyata. Apa yang sebenarnya dilakukannya adalah menunjukkan berapa banyak memori nyata setiap proses akan mengambil jika itu adalah satu-satunya proses yang berjalan . Tentu saja, mesin Linux tipikal memiliki beberapa lusin proses yang berjalan pada waktu tertentu, yang berarti bahwa nomor VSZ dan RSS yang dilaporkanps
hampir pasti salah .
ps
tidak menunjukkan bahkan itu - itu menunjukkan nomor memori virtual dan penduduk, di mana virtual adalah jumlah maksimum memori proses secara teoritis dapat menggunakannya itu adalah satu-satunya proses (tidak pernah begitu), digunakan setiap halaman yang dialokasikan (tidak pernah terjadi) dan tidak memetakan atau menghapus peta halaman mana pun (tidak mungkin). Sementara resident menunjukkan berapa banyak memori virtual yang dipetakan ke fisik saat ini.virt > usage > res
Namun biasanya pada sistem 64-bitvirt ~= res*10
itu jangkauannya sangat luas.Jawaban:
Dengan
ps
atau alat serupa Anda hanya akan mendapatkan jumlah halaman memori yang dialokasikan oleh proses itu. Jumlah ini benar, tetapi:tidak mencerminkan jumlah sebenarnya dari memori yang digunakan oleh aplikasi, hanya jumlah memori yang disediakan untuk itu
dapat menyesatkan jika halaman dibagikan, misalnya oleh beberapa utas atau dengan menggunakan pustaka yang terhubung secara dinamis
Jika Anda benar-benar ingin tahu jumlah memori yang digunakan aplikasi Anda, Anda harus menjalankannya di dalam profiler. Misalnya,
valgrind
dapat memberi Anda wawasan tentang jumlah memori yang digunakan, dan, yang lebih penting, tentang kemungkinan kebocoran memori di program Anda. Alat heap profiler valgrind disebut 'massif':Seperti yang dijelaskan dalam dokumentasi valgrind , Anda perlu menjalankan program melalui valgrind:
Massif menulis dump snapshots penggunaan memori (misalnya
massif.out.12345
). Ini memberikan, (1) garis waktu penggunaan memori, (2) untuk setiap foto, catatan di mana memori program Anda dialokasikan. Alat grafis yang hebat untuk menganalisis file-file ini adalah massif-visualizer . Tapi saya menemukanms_print
, alat sederhana berbasis teks yang dikirimkan dengan valgrind, sudah sangat membantu.Untuk menemukan kebocoran memori, gunakan
memcheck
alat valgrind (default) .sumber
Coba perintah pmap :
sumber
gnome-system-monitor
Sulit dipastikan, tetapi di sini ada dua hal "dekat" yang dapat membantu.
akan memberi Anda Ukuran Virtual (VSZ)
Anda juga bisa mendapatkan statistik terperinci dari / proc-sistem file dengan masuk ke
/proc/$pid/status
Yang paling penting adalah VmSize, yang harus dekat dengan apa yang
ps aux
memberi.sumber
gnome-system-monitor
Dalam versi terbaru linux, gunakan subsistem smaps . Misalnya, untuk proses dengan PID 1234:
Ini akan memberi tahu Anda dengan tepat berapa banyak memori yang digunakan pada saat itu. Lebih penting lagi, ini akan membagi memori menjadi pribadi dan dibagi, sehingga Anda dapat mengetahui berapa banyak memori yang digunakan oleh instance program Anda, tanpa menyertakan memori yang dibagi antara beberapa instance program.
sumber
pmap
antarmuka yang lebih sederhana.Tidak ada cara mudah untuk menghitung ini. Tetapi beberapa orang telah mencoba mendapatkan jawaban yang bagus:
sumber
ps_mem
dansmem
sangat berguna untuk tindakan pengguna akhir, sementara misalnya.pmap
Keluaran yang sangat terperinci diarahkan untuk devs ... memungkinkan untuk mengambil kembali penggunaan Memori Firefox untuk setiap font, addons, libs untuk ex. Terima kasih semua exp. @Bash, @thomasruther.gnome-system-monitor
Gunakan smem , yang merupakan alternatif untuk ps yang menghitung USS dan PSS per proses. Yang Anda inginkan mungkin PSS.
USS - Ukuran Set Unik. Ini adalah jumlah memori yang tidak dibagi yang unik untuk proses itu (anggap sebagai U untuk memori unik ). Itu tidak termasuk memori bersama. Dengan demikian akan ini di bawah -Laporan jumlah memori proses penggunaan, tetapi membantu ketika Anda ingin mengabaikan memori bersama.
PSS - Ukuran Set Proporsional. Ini yang kamu inginkan. Itu menambah bersama memori unik (USS), bersama dengan proporsi memori bersama dibagi dengan jumlah proses berbagi memori itu. Dengan demikian itu akan memberi Anda representasi akurat tentang berapa banyak memori fisik aktual yang digunakan per proses - dengan memori bersama benar-benar direpresentasikan sebagai dibagi. Pikirkan P sedang untuk memori fisik .
Bagaimana ini dibandingkan dengan RSS seperti yang dilaporkan oleh ps dan utilties lainnya:
Perhatikan: smem juga dapat (secara opsional) menampilkan grafik seperti diagram lingkaran dan sejenisnya. IMO Anda tidak memerlukan semua itu. Jika Anda hanya ingin menggunakannya dari baris perintah seperti Anda mungkin menggunakan ps -A v, maka Anda tidak perlu menginstal dependensi yang disarankan python-matplotlib.
sumber
Gunakan ini sebagai root dan Anda bisa mendapatkan output yang jelas untuk penggunaan memori oleh setiap proses.
CONTOH OUTPUT:
sumber
x=2
juga output pid dan pengguna.Bagaimana dengan
time
?Bukan Bash bawaan
time
tetapi yang bisa Anda temukanwhich time
, misalnya/usr/bin/time
Inilah yang dibahas, secara sederhana
ls
:sumber
brew install gnu-time
kemudian gunakangtime
jika Anda menggunakan MacOS.Ini adalah ringkasan yang sangat baik dari alat dan masalah: tautan archive.org
Saya akan mengutipnya, sehingga lebih banyak devs akan membacanya.
sumber
Di samping solusi yang tercantum dalam jawaban Anda, Anda dapat menggunakan perintah Linux "top"; Ini memberikan tampilan real-time dinamis dari sistem yang sedang berjalan, ini memberikan penggunaan CPU dan Memori, untuk seluruh sistem dan untuk setiap program, dalam persentase:
untuk menyaring oleh pid program:
untuk menyaring berdasarkan nama program:
"top" juga menyediakan beberapa bidang seperti:
VIRT - Virtual Image (kb): Jumlah total memori virtual yang digunakan oleh tugas
RES - Ukuran penduduk (kb): Memori fisik yang tidak ditukar dengan tugas yang telah digunakan; RES = KODE + DATA.
DATA - Data + Ukuran tumpukan (kb): Jumlah memori fisik yang dikhususkan untuk selain kode yang dapat dieksekusi, juga dikenal sebagai ukuran 'data resident set' atau DRS.
SHR - Shared Mem size (kb): Jumlah memori bersama yang digunakan oleh suatu tugas. Ini hanya mencerminkan memori yang berpotensi dibagikan dengan proses lain.
Rujukan di sini .
sumber
Tidak ada jawaban tunggal untuk ini karena Anda tidak bisa menunjukkan secara tepat jumlah memori yang digunakan proses. Sebagian besar proses di linux menggunakan shared library. Misalnya, katakanlah Anda ingin menghitung penggunaan memori untuk proses 'ls'. Apakah Anda hanya menghitung memori yang digunakan oleh 'ls' yang dapat dieksekusi (jika Anda dapat mengisolasinya)? Bagaimana dengan libc? Atau semua lib lain yang diperlukan untuk menjalankan 'ls'?
Anda bisa berpendapat bahwa mereka dibagikan oleh proses lain, tetapi 'ls' tidak dapat dijalankan pada sistem tanpa mereka dimuat.
Juga, jika Anda perlu tahu berapa banyak memori yang dibutuhkan suatu proses untuk melakukan perencanaan kapasitas, Anda harus menghitung berapa banyak setiap salinan tambahan dari proses yang digunakan. Saya pikir / proc / PID / status mungkin memberi Anda informasi yang cukup tentang penggunaan memori pada satu waktu. Di sisi lain, valgrind akan memberi Anda profil yang lebih baik dari penggunaan memori sepanjang masa program
sumber
pmap
Jika kode Anda dalam C atau C ++ Anda mungkin dapat menggunakan
getrusage()
yang mengembalikan Anda berbagai statistik tentang memori dan penggunaan waktu proses Anda.Tidak semua platform mendukung ini dan akan mengembalikan 0 nilai untuk opsi penggunaan memori.
Sebagai gantinya Anda dapat melihat file virtual yang dibuat di
/proc/[pid]/statm
( di mana[pid]
diganti oleh id proses Anda. Anda dapat memperoleh ini darigetpid()
).File ini akan terlihat seperti file teks dengan 7 bilangan bulat. Anda mungkin paling tertarik dengan angka pertama (semua penggunaan memori) dan keenam (penggunaan memori data) dalam file ini.
sumber
getpid()
, karena saya tidak tahugetprocessid()
fungsi di C / C ++ di Linux.Valgrind dapat menampilkan informasi terperinci tetapi memperlambat aplikasi target secara signifikan, dan sebagian besar waktu mengubah perilaku aplikasi.
Exmap adalah sesuatu yang belum saya ketahui, tetapi tampaknya Anda membutuhkan modul kernel untuk mendapatkan informasi, yang dapat menjadi penghambat.
Saya berasumsi apa yang semua orang ingin tahu WRT "penggunaan memori" adalah sebagai berikut ...
Di linux, jumlah memori fisik yang mungkin digunakan oleh satu proses dapat secara kasar dibagi menjadi beberapa kategori berikut.
Ma memetakan memori anonim
Mn bernama memory yang dipetakan
Utilitas yang termasuk dalam Android disebut showmap cukup berguna
sumber
Tiga metode lagi untuk dicoba:
ps aux --sort pmem
Ini mengurutkan output dengan
%MEM
.ps aux | awk '{print $2, $4, $11}' | sort -k2r | head -n 15
Ini semacam menggunakan pipa.
top -a
Itu mulai menyortir berdasarkan
%MEM
(Diekstrak dari sini )
sumber
top
dan mungkin yang lain tidak memberikan representasi akurat dari memori yang sebenarnya digunakan oleh proses. Sebagai contoh, saya memiliki 64GiB RAM, dan saya memiliki 10postgres
proses, masing-masing melaporkan 16GiB RES dan 25% MEM. Tentu saja, mereka tidak dapat menggunakan 25% ... Masing-masing juga memiliki 15GiB SHR, dan sepertinya mereka berbagi itu.sumber
sed | awk
dan bekerja di Busybox v1.23.2:sed -n 's/^Size:\s\+\(\S\+\) .*/\1/p' /proc/$1/smaps | awk '{s+=$1} END {print s}'
Saya menggunakan
htop
; ini adalah program konsol yang sangat bagus mirip dengan Windows Task Manager.sumber
htop
dan lebih baik dari atas tetapi tetap akan menampilkan semua utas dari aplikasi yang berbeda tanpa mengelompokkannya sehingga hampir sama tidak berguna dengan atas.Jika proses ini tidak menggunakan terlalu banyak memori (baik karena Anda mengharapkan hal ini terjadi, atau perintah lain telah memberikan indikasi awal ini), dan proses dapat menahan dihentikan untuk waktu yang singkat, Anda dapat mencoba untuk gunakan perintah gcore.
Periksa ukuran file inti yang dihasilkan untuk mendapatkan ide bagus berapa banyak memori yang digunakan proses tertentu.
Ini tidak akan bekerja dengan baik jika proses menggunakan ratusan MB, atau pertunjukan, karena generasi inti bisa memakan waktu beberapa detik atau menit untuk dibuat tergantung pada kinerja I / O. Selama pembuatan inti, proses dihentikan (atau "dibekukan") untuk mencegah perubahan memori. Jadi berhati-hatilah.
Pastikan juga titik pemasangan di mana inti dihasilkan memiliki banyak ruang disk dan bahwa sistem tidak akan bereaksi negatif terhadap file inti yang dibuat dalam direktori tertentu.
sumber
Saya menggunakan Arch Linux dan ada paket yang luar biasa ini
ps_mem
Contoh Output
sumber
Baris perintah di bawah ini akan memberi Anda total memori yang digunakan oleh berbagai proses yang berjalan di mesin Linux dalam MB
sumber
Tes yang bagus untuk penggunaan yang lebih "dunia nyata" adalah membuka aplikasi, kemudian jalankan
vmstat -s
dan periksa statistik "memori aktif". Tutup aplikasi, tunggu beberapa detik dan jalankanvmstat -s
lagi. Namun banyak memori aktif yang dibebaskan ternyata digunakan oleh aplikasi.sumber
Dapatkan valgrind. berikan program Anda untuk dijalankan, dan itu akan memberi tahu Anda banyak tentang penggunaan memorinya.
Ini hanya berlaku untuk kasus program yang berjalan selama beberapa waktu dan berhenti. Saya tidak tahu apakah valgrind bisa mendapatkan proses yang sudah berjalan atau proses yang tidak boleh berhenti seperti daemon.
sumber
Sunting: ini hanya berfungsi 100% saat konsumsi memori meningkat
Jika Anda ingin memantau penggunaan memori dengan proses yang diberikan (atau grup nama umum berbagi yang diproses, misalnya
google-chrome
, Anda dapat menggunakan skrip bash saya:ini akan terus mencari perubahan dan mencetaknya.
sumber
Jika Anda menginginkan sesuatu yang lebih cepat daripada membuat profil dengan Valgrind dan kernel Anda lebih tua dan Anda tidak dapat menggunakan tamparan, ps dengan opsi untuk menunjukkan rangkaian proses (dengan
ps -o rss,command
) penduduk dapat memberikan Anda jumlah yang cepat dan masuk akal_aproximation_
dari jumlah sebenarnya memori non-swap sedang digunakan.sumber
Saya menyarankan agar Anda menggunakan atas. Anda dapat menemukan semuanya tentang hal ini di halaman ini . Itu mampu memberikan semua KPI yang diperlukan untuk proses Anda dan juga dapat menangkap ke file.
sumber
atop -R
. Untuk menampilkan dorongan ringkasan per penggunap
, untuk mengurutkan berdasarkan dorongan penggunaan memori 'M' dari dalam atas. Ini memberikan angka yang sama dari smem.Periksa skrip shell untuk memeriksa penggunaan memori oleh aplikasi di linux . Juga tersedia di github dan dalam versi tanpa paste dan bc .
sumber
Satu lagi suara untuk Valgrinddi sini, tetapi saya ingin menambahkan bahwa Anda dapat menggunakan alat seperti Alleyoop untuk membantu Anda menafsirkan hasil yang dihasilkan oleh valgrind.
Saya menggunakan dua alat sepanjang waktu dan selalu memiliki kode ramping, tidak bocor untuk dengan bangga menunjukkannya;)
sumber
Sementara pertanyaan ini tampaknya tentang memeriksa proses yang sedang berjalan, saya ingin melihat memori puncak yang digunakan oleh aplikasi dari awal hingga selesai. Selain valgrind, Anda dapat menggunakan tstime , yang jauh lebih sederhana. Ini mengukur penggunaan memori "highwater" (RSS dan virtual). Dari jawaban ini .
sumber
Berdasarkan jawaban untuk terkait pertanyaan .
Anda dapat menggunakan SNMP untuk mendapatkan memori dan penggunaan CPU dari suatu proses di perangkat tertentu dalam jaringan :)
Persyaratan:
Catatan:
HOST-RESOURCES-MIB :: hrSWRunPerfCPU adalah jumlah centi-detik dari total sumber daya sistem CPU yang dikonsumsi oleh proses ini. Perhatikan bahwa pada sistem multi-prosesor, nilai ini dapat meningkat lebih dari satu senti detik dalam satu senti detik waktu nyata (jam dinding).
HOST-RESOURCES-MIB :: hrSWRunPerfMem adalah jumlah total memori sistem nyata yang dialokasikan untuk proses ini.
**
Skrip pemantauan proses:
**
sumber
/ prox / xxx / numa_maps memberikan beberapa info di sana: N0 = ??? N1 = ???. Tetapi hasil ini mungkin lebih rendah dari hasil yang sebenarnya, karena hanya menghitung yang telah disentuh.
sumber
Gunakan alat GUI ' monitor sistem ' built-in yang tersedia di ubuntu
sumber