Jawaban ini menjelaskan tindakan yang diambil oleh kernel ketika situasi OOM ditemukan berdasarkan nilai sysctl vm.overcommit_memory
.
Ketika overcommit_memory
diatur ke 0 atau 1, overcommit
diaktifkan, dan program diizinkan untuk mengalokasikan lebih banyak memori daripada yang sebenarnya tersedia.
Sekarang apa yang terjadi ketika kita kehabisan memori dalam situasi ini? Bagaimana pembunuh OOM memutuskan proses mana yang harus dibunuh terlebih dahulu?
Jawaban yang Diterima:
Jika memori habis-habisan digunakan oleh proses, sejauh yang mungkin dapat mengancam stabilitas sistem, maka pembunuh OOM muncul.
CATATAN: Ini adalah tugas OOM Killer untuk melanjutkan mematikan proses hingga memori yang cukup dibebaskan untuk kelancaran fungsi proses lainnya yang coba dijalankan oleh Kernel.
Pembunuh OOM harus memilih yang terbaik proses untuk membunuh. Terbaik di sini mengacu pada proses yang akan membebaskan memori maksimum setelah membunuh dan juga yang paling tidak penting bagi sistem.
Tujuan utamanya adalah untuk mematikan proses paling sedikit yang meminimalkan kerusakan yang terjadi dan pada saat yang sama memaksimalkan jumlah memori yang dibebaskan.
Untuk memfasilitasi ini, kernel memelihara oom_score
untuk masing-masing proses. Anda dapat melihat oom_score
dari setiap proses di /proc
sistem file di bawah pid
direktori.
$ cat /proc/10292/oom_score
Semakin tinggi nilai oom_score
dari proses apa pun, semakin tinggi kemungkinannya terbunuh oleh OOM Killer dalam situasi kehabisan memori.
Bagaimana OOM_Score
dihitung?
Dalam set tambalan David, heuristik badness() lama hampir seluruhnya
hilang. Sebagai gantinya, perhitungan berubah menjadi pertanyaan sederhana tentang berapa
persentase memori yang tersedia yang digunakan oleh proses. Jika
sistem secara keseluruhan kekurangan memori, maka “memori yang tersedia” adalah
jumlah semua RAM dan ruang swap yang tersedia untuk sistem.Jika sebaliknya, situasi OOM disebabkan oleh kehabisan memori yang diizinkan
ke cpuset/grup kontrol tertentu, maka "memori yang tersedia" adalah jumlah
total yang dialokasikan untuk grup kontrol tersebut. Perhitungan serupa dilakukan
jika batas yang ditetapkan oleh kebijakan memori telah terlampaui. Dalam setiap kasus,
penggunaan memori dari proses dianggap sebagai jumlah dari kumpulan
penduduknya (jumlah halaman RAM yang digunakannya) dan penggunaan swapnya.Perhitungan ini menghasilkan angka persen-kali-sepuluh sebagai hasilnya; a
proses yang menggunakan setiap byte dari memori yang tersedia akan
mendapat skor 1000, sedangkan proses yang tidak menggunakan memori sama sekali akan mendapatkan
skor nol. Ada sedikit penyesuaian heuristik untuk skor ini,
tetapi kode masih mengurangi sejumlah kecil (30) dari skor
proses yang dimiliki root dengan anggapan bahwa mereka sedikit lebih
berharga daripada proses yang dimiliki pengguna.Salah satu tweak lain yang diterapkan adalah dengan menambahkan nilai yang tersimpan di setiap
variabel oom_score_adj proses, yang dapat disesuaikan melalui /proc.
Tombol ini memungkinkan penyesuaian daya tarik setiap proses ke
OOM pembunuh di ruang pengguna; menyetelnya ke -1000 akan menonaktifkan OOM
membunuh seluruhnya, sedangkan menyetel ke +1000 sama dengan mengecat
target besar pada proses terkait.
Referensi
Terkait:Kelemahan saat menggunakan chroot dalam komputasi kinerja tinggi?http://www.queryhome.com/15491/whats-happening-kernel-starting-killer-choose-which-process https://serverfault.com/a/571326