Selama bertahun-tahun, pembunuh OOM sistem operasi saya tidak berfungsi dengan benar dan mengarah ke sistem beku.
Ketika penggunaan memori sangat tinggi, seluruh sistem cenderung "membeku" (pada kenyataannya: menjadi sangat lambat) selama berjam - jam atau bahkan berhari - hari , alih-alih mematikan proses untuk membebaskan memori.
Maksimum yang saya rekam adalah 7 hari sebelum mengundurkan diri untuk mengoperasikan reset.
Ketika OOM akan dicapai, iowait sangat sangat tinggi (~ 70%), sebelum menjadi tidak terukur.
Alat: iotop
telah menunjukkan bahwa setiap program membaca pada throughput yang sangat tinggi (per puluhan MB / detik) dari hard drive saya.
Program apa yang sedang dibaca?
- Hirarki direktori?
- Kode yang dapat dieksekusi itu sendiri?
Saya tidak tahu persis sekarang.
[diedit] Pada saat saya menulis pesan ini (pada 2017) saya menggunakan ArchLinux uptodate (4.9.27-1-lts), tetapi sudah mengalami masalah ini selama bertahun-tahun sebelumnya.
Saya telah mengalami masalah yang sama dengan berbagai distribusi Linux dan konfigurasi perangkat keras yang berbeda.
Saat ini (2019), saya menggunakan Debian 9.6 (4.9.0) yang uptodate. Saya memiliki ram fisik 16 GB , SSD tempat OS saya dipasang, dan bukan partisi swap .
Karena jumlah ram yang saya miliki, saya tidak ingin mengaktifkan partisi swap, karena itu hanya akan menunda kemunculan masalah.
Juga, dengan menukar SSD terlalu sering berpotensi mengurangi masa pakai disk.
By the way, saya sudah mencoba dengan dan tanpa partisi swap, itu terbukti hanya menunda kemunculan masalah, tetapi tidak menjadi solusi.
Bagi saya masalah ini disebabkan oleh fakta bahwa Linux menjatuhkan data penting dari cache , yang mengarah ke sistem beku karena harus membaca semuanya, setiap saat dari hard drive.
Saya bahkan bertanya-tanya apakah Linux tidak akan menjatuhkan halaman kode yang dapat dijalankan dari program yang sedang berjalan, yang akan menjelaskan mengapa program yang biasanya tidak membaca banyak data, berperilaku seperti ini dalam situasi ini.
Saya telah mencoba beberapa hal dengan harapan dapat memperbaiki masalah ini.
Salah satunya adalah mengatur /proc/sys/vm/min_free_kbytes
ke 1000000
(1 GB).
Karena 1 GB ini harus tetap gratis, saya pikir memori ini akan dicadangkan oleh Linux untuk menyimpan data penting.
Tapi itu tidak berhasil.
Juga, saya pikir berguna untuk menambahkan bahwa bahkan jika itu bisa terdengar besar secara teori, membatasi ukuran memori virtual dengan ukuran memori fisik, dengan mendefinisikan /proc/sys/vm/overcommit_memory
untuk 2
tidak sopan teknis mungkin dalam situasi saya, karena jenis aplikasi yang saya gunakan, membutuhkan lebih banyak memori virtual daripada yang mereka gunakan secara efektif untuk beberapa alasan.
Menurut file tersebut /proc/meminfo
, Commited_AS
nilainya sering lebih tinggi dari dua kali lipat ram fisik pada sistem saya (16 GB, Commited_AS sering> 32 GB).
Saya telah mengalami masalah ini dengan /proc/sys/vm/overcommit_memory
nilai defaultnya:, 0
dan untuk sementara saya telah mendefinisikannya sebagai:, 1
karena saya lebih suka program untuk dibunuh oleh pembunuh OOM daripada berperilaku salah karena mereka tidak memeriksa nilai pengembalian malloc
ketika alokasi ditolak.
Ketika saya berbicara tentang masalah ini di IRC , saya telah bertemu dengan pengguna Linux lain yang telah mengalami masalah yang sama ini, jadi saya rasa banyak pengguna yang khawatir dengan hal ini.
Bagi saya ini tidak dapat diterima karena bahkan Windows lebih baik berurusan dengan penggunaan memori yang tinggi.
Jika Anda memerlukan informasi lebih lanjut, mintalah saran, tolong beri tahu saya.
Dokumentasi:
https://en.wikipedia.org/wiki/Thrashing_%28computer_science%29
https://en.wikipedia.org/wiki/Memory_overcommitment
https://www.kernel.org/doc/Documentation/sysctl/vm. txt
https://www.kernel.org/doc/Documentation/vm/overcommit-accounting
https://lwn.net/Articles/317814/
Mereka membicarakannya:
Mengapa killer out-of-memory (OOM) linux tidak berjalan secara otomatis, tetapi bekerja pada sysrq-key?
Mengapa OOM-killer terkadang gagal membunuh babi sumber daya?
Preloading the OOM Killer
Apakah mungkin untuk memicu OOM-killer di swapping paksa?
Bagaimana cara menghindari latensi tinggi di dekat situasi OOM?
https://lwn.net/Articles/104179/
https://bbs.archlinux.org/viewtopic.php?id=233843
min_free_kbytes
tidak relevan, ini bukan cadangan untuk halaman yang di-cache. AFAICT tidak satu pun dari vm sysctls yang memungkinkan pemesanan memori apa pun secara khusus untuk halaman yang di-cache, yaitu membatasi alokasi MAP_ANONYMOUS :(.Jawaban:
Saya telah menemukan dua penjelasan (dari hal yang sama) tentang mengapa
kswapd0 melakukanpembacaan disk konstan terjadi jauh sebelum OOM-killer membunuh proses yang menyinggung:Saya akan mengutip di sini komentar dari 1. yang benar-benar membuka mata saya mengapa saya terus membaca disk saat semuanya membeku :
Jika ada yang memiliki cara untuk menonaktifkan perilaku ini (mungkin mengkompilasi ulang kernel dengan opsi apa? ), Tolong beri tahu saya sesegera mungkin! Sangat dihargai, terima kasih!
UPDATE: Satu-satunya cara yang saya temukan sejauh ini adalah dengan menambal kernel, dan itu berfungsi untuk saya dengan swap dinonaktifkan (mis.
CONFIG_SWAP is not set
) Tetapi tidak bekerja untuk orang lain dengan swap diaktifkan sepertinya ; lihat tambalan di dalam pertanyaan ini .sumber
UPDATE
alih-alihEDIT
lebih baik?The
memory.min
parameter dalamcgroups-v2
memory controller harus membantu.Yaitu, izinkan saya mengutip:
Sumber: https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html
sumber