Saya memiliki mesin Linux yang agak tua dengan ram 2GB, tanpa swap, dan bekerja dengan sangat baik, dengan sistem menggunakan setiap bagian memori yang tidak digunakan untuk melakukan caching dengan efek yang luar biasa.
Namun, ketika saya hampir menekankan memori (mis., Dialokasikan> 1950MB), itu melambat untuk merangkak; Saya menduga itu karena tidak ada buffer disk yang tersisa. Saya tahu bahwa pembunuh OOM akan segera berlaku, tetapi biasanya tidak sampai di sana - itu menjadi sangat lambat sehingga beban menembak hingga 30-40, tidak ada proses membuat kemajuan (sehingga tidak mengalokasikan lebih banyak memori), dan Saya harus me-restart itu.
Ketika saya mencoba untuk hanya mematikan satu proses untuk membuat mesin merespons, misalnya dengan masuk ke konsol (melalui Alt-F1, masuk, dan hanya melakukan "proses killall bad",) biasanya berfungsi, kecuali bahwa saya harus menunggu ~ 10 menit antara pengguna / kata sandi dan mendapatkan prompt - semua saat ada aktivitas disk.
Sekali lagi, tidak ada swap, jadi tidak bertukar - itu hanya meronta-ronta karena tidak ada buffer yang tersisa.
Saya akan memiliki 100MB atau lebih yang didedikasikan khusus untuk buffer disk, yang akan memicu pembunuh OOM lebih awal (bagaimanapun, lebih sedikit memori untuk program) tetapi di sisi lain akan membuat mesin responsif setiap saat.
Apakah ada cara untuk melakukan itu? Saya belum dapat menemukan entri / proc / kernel atau / sys / vm yang melakukan hal semacam ini.
Jawaban:
Lihatlah / proc / sys / vm / min_free_kbytes . Ini adalah batas kbytes gratis yang memicu oom-killer. Juga akan baik untuk memeriksa di log untuk kata kunci oom-pembunuh untuk mengetahui apa yang sedang dibunuh {propably Anda tidak ingin membunuh ssh , Anda lebih baik untuk Renice itu}
sumber
Menunggu oom-killer untuk membebaskan memori sama seperti menunggu mesin berhenti di mobil Anda untuk memberi tahu Anda kapan saatnya mengisi tangki bensin Anda. Oom-killer adalah alat berat dari upaya terakhir dan keputusasaan untuk mesin yang kekurangan sumber daya. Itu membunuh program berikutnya yang disentuhnya tanpa mempertimbangkan bagaimana ini akan mempengaruhi aplikasi Anda, jangkauan, keandalan, dan sebagainya. Ketika oom-killer dipanggil, server Anda terengah-engah dan dalam kondisi kritis.
Sebaliknya, Anda jauh lebih baik mengambil pendekatan aktif dalam mengelola penggunaan memori Anda dalam lingkungan aplikasi Anda. Anda dapat memonitor / proc / meminfo untuk masalah dan mengambil tindakan yang tepat dan mempercepat kembali beban kerja Anda sebelum situasi serius menjadi buruk.
sumber
oom_adj
dengan benar, Anda dapat memiliki sistem desktop Anda bekerja sedikit seperti Android di mana sistem praktis selalu berjalan melawan pembunuh OOM (secara teknis ada "pembunuh memori rendah" dan disetel melalui/sys/module/lowmemorykiller
). Logikanya adalah untuk terus menandai proses latar belakang non-kritis sebagai korban potensial untuk pembunuh OOM dan mencari proses yang terbunuh dan secara perlahan memulai kembali program yang diperlukan untuk menghindari terbebani sistem. Pastikan saja bahwa proses yang terus meluncurkan kembali proses lain ditandai di luar batas untuk pembunuh OOM.