Pembunuh OOM tidak bekerja?

41

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:

  1. Apakah perilaku ini normal? Aneh bahwa aplikasi yang dijalankan sebagai pengguna biasa bisa saja merusak sistem dengan cara ini ...
  2. 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
    
Salem
sumber
Saya tidak yakin mengapa itu tidak berhasil. Coba tail -n+1 /proc/sys/vm/overcommit_*dan tambahkan hasilnya. Lihat di sini juga: Bagaimana Saya mengonfigurasi oom-killer
kiri
Jadi apa yang terjadi dengan ruang swap Anda? Bisakah Anda memposting beberapa output vmstat seperti #vmstat 1 100 atau sesuatu seperti itu? dan tunjukkan juga kepada kami cat / etc / fstab Apa yang harus terjadi adalah penggunaan memori dalam jumlah tertentu, Anda harus mulai menulis untuk swap. Proses pembunuhan tidak boleh terjadi sampai memori dan ruang swap "penuh".
j0h
coba juga #swapon -a
j0h
@ j0h Dengan swap sepertinya berfungsi dengan baik (setelah beberapa waktu proses macet dengan sesuatu seperti Allocation failed). Tetapi tanpa swap itu hanya membekukan komputer. Seharusnya berfungsi seperti ini (hanya membunuh saat menggunakan swap)?
Salem
2
Dengan SysRq Anda juga dapat memanggil OOM (SysRq + F iirc)
Lekensteyn

Jawaban:

36

Dari dokumentasi resmi/proc/sys/vm/* :

oom_kill_allocating_task

Ini memungkinkan atau menonaktifkan membunuh tugas pemicu OOM dalam situasi kehabisan memori.

Jika ini disetel ke nol, pembunuh OOM akan memindai seluruh daftar tugas dan memilih tugas berdasarkan heuristik untuk dibunuh. Ini biasanya memilih tugas memonopoli memori jahat yang membebaskan sejumlah besar memori ketika terbunuh.

Jika ini diatur ke non-nol, pembunuh OOM hanya membunuh tugas yang memicu kondisi kehabisan memori. Ini menghindari pemindaian daftar tugas yang mahal.

Jika panic_on_oom dipilih, ia lebih diutamakan daripada nilai apa pun yang digunakan dalam oom_kill_allocating_task.

Nilai standarnya adalah 0.

Untuk meringkas, ketika mengatur oom_kill_allocating_taskuntuk 1, 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 0secara default.

Untuk pengujian, Anda bisa menulis ke file pseudo yang tepat /proc/sys/vm/, yang akan dibatalkan pada reboot berikutnya:

echo 1 | sudo tee /proc/sys/vm/oom_kill_allocating_task

Untuk perbaikan permanen, tulis yang berikut ini ke /etc/sysctl.confatau ke file baru di bawah /etc/sysctl.d/, dengan .confekstensi ( /etc/sysctl.d/local.confmisalnya):

vm.oom_kill_allocating_task = 1
Teresa e Junior
sumber
2
Apakah selalu diatur ke 0 di Ubuntu? Karena saya ingat itu digunakan untuk membunuh secara otomatis, tetapi karena beberapa versi berhenti melakukannya.
skerit
1
@ skerit Ini saya tidak benar-benar tahu, tetapi diset ke 0 di kernel yang saya gunakan pada tahun 2010 (Debian, Liquorix dan GRML).
Teresa e Junior
"Juga, akan lebih jelas hanya dengan membunuh tugas yang menyebabkan masalah, jadi saya gagal untuk memahami mengapa itu diatur 0secara 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 .
Mark Amery
1
@MarkAmery Masalah sebenarnya adalah bahwa Linux, bukannya hanya membunuh proses yang diperlukan, mulai meronta-ronta seperti retard, bahkan jika vm.admin_reserve_kbytesditingkatkan menjadi, katakanlah, 128 MB . Pengaturan vm.oom_kill_allocating_task = 1tampaknya mengurangi masalah, tidak benar-benar menyelesaikannya (dan Ubuntu sudah menangani bom fork secara default).
Teresa e Junior
1
Mungkin lebih elegansudo sysctl -w vm.oom_kill_allocating_task=1
Pablo A
9

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.

int_ua
sumber
Saya tidak tahu mengapa Anda downvoted, tetapi itu juga terdengar seperti bug kernel bagi saya. Saya telah menabrak server universitas besar hari ini dengan itu dan membunuh beberapa proses yang berjalan selama berminggu-minggu ... Terima kasih telah mengajukan laporan bug itu!
shapecatcher
7
Mungkin telah diperbaiki pada tahun 2014, pada tahun 2018 (dan 18,04) pembunuh OOM lagi-lagi tidak melakukan apa-apa.
skerit
0

Anda dapat mencoba earlyoom , pembunuh OOM yang beroperasi di ruang pengguna dan mencoba membunuh proses terbesar dalam situasi OOM.

qwr
sumber
-1

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.

Brask
sumber
2
Saya bukan orang yang menurunkan Anda, tetapi secara umum, menurunkan vm.swappinesslebih banyak ruginya daripada baik, bahkan lebih pada sistem yang menderita masalah memori rendah.
Teresa e Junior
Tidak ketika Anda mengompresi ram terlebih dahulu dan Anda kemudian menghindari penggunaan disk yang jauh lebih lambat dan dapat membuat komputer Anda membeku.
Brask
Secara teori, zRAM adalah hal yang baik, tetapi CPU lapar, dan umumnya tidak sepadan dengan biayanya. Memori umumnya jauh lebih murah daripada listrik. Dan, pada laptop, di mana meningkatkan RAM lebih mahal, penggunaan CPU sebagian besar tidak diinginkan.
Teresa e Junior
Apa yang dia minta adalah untuk memiliki sistem zRAM yang lebih stabil dan mengubah swappiness akan membuat sistemnya menggunakan lebih banyak sumber daya CPU, tapi apa yang dia terbatas dan memiliki kesalahan dengan memori, dia ingin memperbaiki masalahnya bukan pelajaran teori dari apa yang terjadi ketika Anda menginstal zRAM.
Brask
Jelas dari pertanyaannya bahwa ia dapat menulis naskah yang tidak benar yang memakan lebih dari yang seharusnya (dan saya sudah melakukannya sendiri). Dalam situasi seperti ini, Anda dapat menonton script mengambil RAM gigabytes dalam beberapa detik, dan zRAM tidak akan datang untuk menyelamatkan, karena script tidak akan pernah cukup puas.
Teresa e Junior