Saya memiliki laptop Linux standar (pengujian Debian), dengan partisi swap.
Saya melakukan banyak percobaan dengannya. Beberapa dari mereka benar-benar kehabisan memori dan cara Linux berperilaku secara default adalah masalah bagi saya ... Mari kita berikan contoh bodoh:
- Duduk di depan laptop
- Buka terminal
- Ketikkan
python
, lalua = [0]*100000000
Sekarang kemungkinan besar bahwa Anda tidak akan memiliki cukup RAM untuk menangani daftar besar itu. Linux akan mengisi RAM, kemudian swap dan, beberapa menit kemudian, pembunuh OOM akan dipicu dan membunuh (hampir) layanan acak dan mudah-mudahan, jika Anda menekan Ctrl + C pada waktu yang tepat python
,, dan jika terminal masih fokus, komputer akan menjadi responsif lagi.
Saya ingin menerapkan beberapa batasan memori untuk menghindari pertukaran yang tidak diinginkan dan menolak proses yang tepat untuk mengalokasikan lebih banyak memori daripada yang saya miliki (dalam RAM). Jika permintaan memori di bawah batas tertentu atau diminta oleh root, maka matikan saja proses yang paling membutuhkan memori dari semua pengguna kecuali root.
ulimit -Sv [mem]
Saya mendengar di belakang!
Ho Ho! "Gunakan cgroups
via cgexec
!" seseorang berkata di baris pertama!
Ya, Anda benar: ini memang solusi yang sangat bagus. Tapi:
- Mereka tidak menerapkan sistem secara luas
- Batas ditetapkan per proses
- Batasannya statis, mengabaikan jumlah nyata RAM gratis (AFAIK)
- Di sana - sini , mereka mengatakan ini bukan solusi yang baik untuk menegakkan batasan keras.
Yang saya suka adalah bahwa kernel mengatakan: "Anda milik pengguna foo (bukan root), Anda menggunakan banyak memori dan kami akan kehabisan memori. Maaf Bung ... mati sekarang!"
Atau: "Apa yang kamu lakukan Anda perlu x MB dan hanya ada y MB tersedia Ya, SWAP kosong, tapi Anda tidak berniat untuk menggunakan SWAP untuk melakukan pekerjaan kotor Anda, apakah Anda Tidak, saya.? bilang tidak! Tidak ada memori untukmu! Jika kamu bersikeras, kamu akan mati! "
/proc/sys/vm/overcommit_memory
mempengaruhi perilaku kernel pada memori rendah.overcommit_memory
file khusus menggunakan RAM + SWAP sebagai memori yang dapat digunakan. Saya masih akan bertukar :)ulimits
adalah ide buruk seperti yang ditunjukkan hampir di mana-mana karena ini adalah batasan per proses ... Saya tahu Anda tahu :) Tentangcgroups
, ini jelas lebih baik tetapi tidak memiliki sesuatu yang lebih umum: Saya berbicara tentang laptop saya tetapi saya juga memiliki server "kalkulasi" yang kami bagi tiga. Jika saya memberlakukan batas per pengguna seperti itu, saya akan dibatasi oleh skenario terburuk, bukan?Jawaban:
Seseorang menyarankan Anda mendengarkan
cgroups
. Nah, cobalah mencari arah itu karena dapat memberi Anda:Sesuatu seperti itu dapat membawa Anda lebih dekat ke tujuan Anda :
Ini memberitahukan bahwa tugas-tugas di bawah cgroup ini hanya dapat digunakan pada maksimum 50M memori dan 50M memori + swap, jadi ketika memori penuh, itu tidak akan bertukar, tetapi jika memori tidak penuh dan beberapa data dapat dipetakan dalam swap, ini bisa diizinkan.
Berikut adalah kutipan dari dokumentasi memori cgroup :
sumber
overcommit_memory
variabel kernel. Terima kasih semua.Saya sering mengalami masalah yang sama. Alur kerja umum saya melibatkan perhitungan berat di MATLAB. Kadang-kadang saya secara tidak sengaja akan mencoba mengalokasikan variabel baru yang melebihi jumlah memori yang tersedia. Sistem hang, dan saya biasanya harus me-reboot mesin untuk kembali bekerja. : P
Dalam kasus saya, dan kedengarannya seperti milik Anda juga, saya tidak begitu peduli dengan membatasi jumlah memori yang digunakan MATLAB ke jumlah statis - Saya tertarik untuk tidak memiliki mesin beku, dan saya bersedia mengorbankan proses MATLAB saya untuk menjaga respon sistem.
Terinspirasi oleh tanggapan terhadap posting ini , saya menulis skrip berikut (saya menyebutnya watch_memory.sh):
Script ini memeriksa setiap detik untuk jumlah persentase memori bebas. Ketika sistem habis, pid "kambing hitam" Anda (diteruskan sebagai argumen ke skrip) terbunuh.
Tanpa menyesuaikan prioritas (kebaikan) naskah, butuh sekitar 10-20 detik bagi kambing hitam untuk terbunuh, tetapi tetap berhasil. Menjalankan skrip dengan prioritas negatif menghasilkan pembunuhan instan setelah pelanggaran (11916 dalam contoh ini adalah pid yang ingin saya bunuh jika saya kehabisan memori):
sumber