Saya menemukan itu pidstat
akan menjadi alat yang baik untuk memantau proses. Saya ingin menghitung penggunaan memori rata-rata dari proses tertentu. Berikut adalah beberapa contoh output:
02:34:36 PM PID minflt/s majflt/s VSZ RSS %MEM Command
02:34:37 PM 7276 2.00 0.00 349212 210176 7.14 scalpel
(Ini adalah bagian dari output dari pidstat -r -p 7276
.)
Haruskah saya menggunakan informasi Resident Set Size (RSS) atau Virtual Size (VSZ) untuk menghitung konsumsi memori rata-rata? Saya telah membaca beberapa hal di Wikipedia dan di forum, tetapi saya tidak yakin untuk sepenuhnya memahami perbedaannya. Plus, tampaknya tidak satupun dari mereka yang dapat diandalkan. Jadi, bagaimana saya bisa memonitor suatu proses untuk mendapatkan penggunaan memorinya?
Bantuan apa pun tentang hal ini akan bermanfaat.
Jawaban:
RSS adalah berapa banyak memori yang dimiliki proses ini saat ini dalam memori utama (RAM). VSZ adalah jumlah total memori virtual yang dimiliki proses. Ini termasuk semua jenis memori, baik dalam RAM dan bertukar. Angka-angka ini dapat miring karena mereka juga termasuk perpustakaan bersama dan jenis memori lainnya. Anda dapat memiliki lima ratus contoh
bash
berjalan, dan ukuran total jejak memori mereka tidak akan menjadi jumlah nilai RSS atau VSZ mereka.Jika Anda perlu mendapatkan ide yang lebih rinci tentang jejak memori suatu proses, Anda memiliki beberapa opsi. Anda dapat melewati
/proc/$PID/map
dan menyingkirkan hal-hal yang tidak Anda sukai. Jika itu adalah pustaka bersama, perhitungannya bisa menjadi rumit tergantung pada kebutuhan Anda (yang saya pikir saya ingat).Jika Anda hanya peduli tentang ukuran tumpukan proses, Anda selalu bisa menguraikan
[heap]
entri dalammap
file. Ukuran kernel yang dialokasikan untuk tumpukan proses mungkin atau mungkin tidak mencerminkan jumlah byte yang tepat yang diminta dialokasikan oleh proses. Ada detail kecil, kernel internal dan optimisasi yang dapat membuang ini. Di dunia yang ideal, ini akan sebanyak yang dibutuhkan proses Anda, dibulatkan ke kelipatan terdekat dari ukuran halaman sistem (getconf PAGESIZE
akan memberi tahu Anda apa itu - pada PC, mungkin 4.096 byte).Jika Anda ingin melihat berapa banyak memori yang telah dialokasikan oleh suatu proses , salah satu cara terbaik adalah melepaskan metrik sisi kernel. Sebagai gantinya, Anda instrumen fungsi tumpukan memori (de) alokasi perpustakaan C dengan
LD_PRELOAD
mekanisme. Secara pribadi, saya sedikit menyalahgunakanvalgrind
untuk mendapatkan informasi tentang hal semacam ini. (Perhatikan bahwa menerapkan instrumentasi akan membutuhkan memulai kembali proses.)Harap dicatat, karena Anda mungkin juga menjadi benchmark runtimes, yang
valgrind
akan membuat program Anda sedikit lebih lambat (tapi mungkin dalam toleransi Anda).sumber
/proc/$PID/maps
apakah itu perbedaan ketik atau distro?Contoh runnable minimal
Agar ini masuk akal, Anda harus memahami dasar-dasar paging: https://stackoverflow.com/questions/18431261/how-does-x86-paging-work dan khususnya bahwa OS dapat mengalokasikan memori virtual melalui tabel halaman / penyimpanan buku memori internal (memori virtual VSZ) sebelum benar-benar memiliki penyimpanan dukungan pada RAM atau disk (memori residen RSS).
Sekarang untuk mengamati ini dalam tindakan, mari kita buat program yang:
mmap
main.c
GitHub hulu .
Kompilasi dan jalankan:
dimana:
echo 1 | sudo tee /proc/sys/vm/overcommit_memory
: diperlukan untuk Linux agar kami dapat membuat panggilan mmap lebih besar dari RAM fisik: https://stackoverflow.com/questions/2798330/maximum-memory-which-malloc-can-allocate/57687432#57687432Output program:
Status keluar:
yang dengan aturan nomor sinyal 128+ berarti kami mendapat nomor sinyal
9
, yangman 7 signal
mengatakan adalah SIGKILL , yang dikirim oleh Linux out-of-memory killer .Interpretasi keluaran:
printf '0x%X\n' 0x40009A4 KiB ~= 64GiB
(ps
nilai-nilai dalam KiB) setelah mmap.extra_memory_committed 0
, yang berarti kita belum menyentuh halaman mana pun. RSS adalah kecil1648 KiB
yang telah dialokasikan untuk startup program normal seperti area teks, global, dll.8388608 KiB == 8GiB
senilai halaman. Akibatnya, RSS meningkat hingga 8GIB menjadi8390256 KiB == 8388608 KiB + 1648 KiB
Lihat juga: Perlu penjelasan tentang Resident Set Size / Ukuran Virtual
Log pembunuh OOM
dmesg
Perintah kami telah menunjukkan log pembunuh OOM.Penafsiran yang tepat dari mereka telah ditanyakan di:
Baris pertama dari log adalah:
Jadi kita melihat bahwa yang menarik adalah daemon MongoDB yang selalu berjalan di laptop saya di latar belakang yang pertama kali memicu pembunuh OOM, mungkin ketika hal yang buruk itu mencoba mengalokasikan beberapa memori.
Namun, pembunuh OOM tidak harus membunuh orang yang membangunkannya.
Setelah doa, kernel mencetak tabel atau proses termasuk
oom_score
:dan lebih jauh ke depan kita melihat bahwa anak kita sendiri
main.out
benar - benar terbunuh pada doa sebelumnya:Log ini menyebutkan proses
score 865
mana yang memiliki, mungkin skor pembunuh OOM tertinggi (terburuk) sebagaimana disebutkan di: Bagaimana pembunuh OOM memutuskan proses pembunuhan mana yang lebih dulu?Yang menarik, segala sesuatu tampaknya terjadi begitu cepat sehingga sebelum ingatan yang bebas dicatat,
oom
dibangunkan kembali olehDeadlineMonitor
proses:dan kali ini yang membunuh beberapa proses Chromium, yang biasanya komputer saya memori normal babi:
Diuji di Ubuntu 19.04, kernel Linux 5.0.0.
sumber