Di cluster kami, kami membatasi sumber daya proses kami, misalnya memori ( memory.limit_in_bytes
).
Saya pikir, pada akhirnya, ini juga ditangani melalui pembunuh OOM di kernel Linux (sepertinya itu dengan membaca kode sumber ).
Apakah ada cara untuk mendapatkan sinyal sebelum proses saya terbunuh? (Sama seperti -notify
opsi untuk SGEqsub
, yang akan mengirim SIGUSR1
sebelum prosesnya terbunuh.)
Saya membaca di /dev/mem_notify
sini tapi saya tidak memilikinya - apakah ada sesuatu yang lain saat ini? Saya juga membaca ini yang sepertinya agak relevan.
Saya ingin setidaknya dapat membuang jejak stack kecil dan mungkin beberapa info debug berguna lainnya - tapi mungkin saya bahkan dapat memulihkan dengan membebaskan beberapa memori.
Satu solusi yang saat ini saya gunakan adalah skrip kecil ini yang sering memeriksa apakah saya tutup (95%) hingga batasnya dan jika demikian, ia mengirimkan proses a SIGUSR1
. Di Bash, saya memulai skrip ini di latar belakang ( cgroup-mem-limit-watcher.py &
) sehingga ia mengawasi procs lain di cgroup yang sama dan berhenti secara otomatis ketika proses induk Bash mati.
sumber
Jawaban:
Mungkin untuk mendaftar pemberitahuan ketika penggunaan memori cgroup melampaui ambang batas. Pada prinsipnya, menetapkan ambang pada titik yang sesuai di bawah batas yang sebenarnya akan membiarkan Anda mengirim sinyal atau mengambil tindakan lain.
Lihat:
https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt
sumber
Pembunuh OOM memang mengirimkan SIGKILL karena jika tidak demikian akan menjadi kontraproduktif untuk membiarkan program yang bermasalah menjadi pilihan untuk melanjutkan.
Ini berarti bahwa sama sekali tidak ada cara bagi proses untuk mengetahui kapan akan terbunuh olehnya.
Mengelola masalah seperti itu biasanya menyiratkan membuat koreksi ke program atau konfigurasinya. Kadang-kadang, tergantung pada konfigurasi sistem, hanya menambah ruang swap dapat memberikan OS lebih banyak fleksibilitas manajemen memori untuk menghindari tindakan drastis tersebut.
sumber