Untuk apa yang saya mengerti, ketika sistem hampir tidak memiliki memori bebas, kernel harus mulai mematikan proses untuk mendapatkan kembali beberapa memori. Tetapi dalam sistem saya ini tidak terjadi sama sekali.
Misalkan skrip sederhana yang hanya mengalokasikan lebih banyak memori daripada yang tersedia di sistem (sebuah array dengan jutaan string, misalnya). Jika saya menjalankan skrip seperti ini (sebagai pengguna normal), ia hanya mendapatkan semua memori sampai sistem benar-benar macet (hanya SysRQ REISUB yang berfungsi).
Bagian yang aneh di sini adalah ketika komputer macet, led hard drive menyala dan tetap seperti itu sampai komputer di-boot ulang, baik jika saya memiliki partisi swap terpasang atau tidak!
Jadi pertanyaan saya adalah:
- Apakah perilaku ini normal? Aneh bahwa aplikasi yang dijalankan sebagai pengguna biasa bisa saja merusak sistem dengan cara ini ...
- Apakah ada cara saya bisa membuat Ubuntu langsung mematikan aplikasi itu ketika mereka mendapatkan terlalu banyak (atau paling banyak) memori?
Informasi tambahan
- Ubuntu 12.04.3
- Kernel 3.5.0-44
RAM: ~ 3.7GB dari 4GB (dibagi dengan kartu grafis). *
$ tail -n+1 /proc/sys/vm/overcommit_* ==> /proc/sys/vm/overcommit_memory <== 0 ==> /proc/sys/vm/overcommit_ratio <== 50 $ cat /proc/swaps Filename Type Size Used Priority /dev/dm-1 partition 4194300 344696 -1
tail -n+1 /proc/sys/vm/overcommit_*
dan tambahkan hasilnya. Lihat di sini juga: Bagaimana Saya mengonfigurasi oom-killerAllocation failed
). Tetapi tanpa swap itu hanya membekukan komputer. Seharusnya berfungsi seperti ini (hanya membunuh saat menggunakan swap)?Jawaban:
Dari dokumentasi resmi
/proc/sys/vm/*
:Untuk meringkas, ketika mengatur
oom_kill_allocating_task
untuk1
, bukannya memindai sistem Anda mencari proses untuk membunuh, yang merupakan tugas yang mahal dan lambat, kernel hanya akan membunuh proses yang menyebabkan sistem keluar dari memori.Dari pengalaman saya sendiri, ketika OOM dipicu, kernel tidak memiliki "kekuatan" yang cukup untuk melakukan pemindaian, membuat sistem benar-benar tidak dapat digunakan.
Selain itu, akan lebih jelas hanya mematikan tugas yang menyebabkan masalah, jadi saya gagal untuk memahami mengapa ini diatur
0
secara default.Untuk pengujian, Anda bisa menulis ke file pseudo yang tepat
/proc/sys/vm/
, yang akan dibatalkan pada reboot berikutnya:Untuk perbaikan permanen, tulis yang berikut ini ke
/etc/sysctl.conf
atau ke file baru di bawah/etc/sysctl.d/
, dengan.conf
ekstensi (/etc/sysctl.d/local.conf
misalnya):sumber
0
secara default." - karena proses yang meminta memori belum tentu yang "menyebabkan masalah". Jika memproses A babi 99% dari memori sistem, tetapi proses B, yang menggunakan 0,9%, kebetulan menjadi salah satu yang memicu pembunuh OOM oleh nasib buruk, B tidak "menyebabkan masalah" dan tidak masuk akal untuk kill B. Memiliki hal itu karena kebijakan berisiko proses memori rendah yang benar-benar tidak bermasalah terbunuh secara kebetulan karena penggunaan memori proses yang berbeda .vm.admin_reserve_kbytes
ditingkatkan menjadi, katakanlah, 128 MB . Pengaturanvm.oom_kill_allocating_task = 1
tampaknya mengurangi masalah, tidak benar-benar menyelesaikannya (dan Ubuntu sudah menangani bom fork secara default).sudo sysctl -w vm.oom_kill_allocating_task=1
Pembaruan: Bug diperbaiki.
Jawaban Teresa sudah cukup untuk menyelesaikan masalah dan baik.
Selain itu, saya sudah mengajukan laporan bug karena itu pasti perilaku yang rusak.
sumber
Anda dapat mencoba earlyoom , pembunuh OOM yang beroperasi di ruang pengguna dan mencoba membunuh proses terbesar dalam situasi OOM.
sumber
Pertama-tama saya merekomendasikan pembaruan ke 13.10 (instal bersih, simpan data Anda).
Jika Anda tidak ingin memperbarui, ubah vm.swappiness menjadi 10 dan jika Anda menemukan masalah dengan ram Anda, instal zRAM.
sumber
vm.swappiness
lebih banyak ruginya daripada baik, bahkan lebih pada sistem yang menderita masalah memori rendah.