Bagaimana saya mencegah Linux membeku saat kehabisan memori?

25

Hari ini saya (secara tidak sengaja) menjalankan beberapa program pada kotak Linux saya yang dengan cepat menggunakan banyak memori. Sistem saya membeku, menjadi tidak responsif dan dengan demikian saya tidak dapat membunuh pelaku.

Bagaimana saya bisa mencegah ini di masa depan? Tidak bisakah setidaknya menjaga inti responsif atau sesuatu berjalan?

John
sumber
Duplikat Sistem menggantung ketika kehabisan memori , dan itu adalah bug yang
Dan Dascalescu

Jawaban:

15

Saya berani bertaruh bahwa sistem tidak benar-benar "membeku" (dalam arti bahwa kernel tergantung), tetapi hanya sangat tidak responsif. Kemungkinannya hanya bertukar sangat keras, menyebabkan kinerja interaktif dan sistem throughput turun seperti batu.

Anda dapat mematikan swap, tetapi itu hanya mengubah masalah dari kinerja yang buruk ke proses yang dibunuh OOM (dan semua kesenangan yang menyebabkan), bersama dengan penurunan kinerja karena cache disk yang kurang tersedia.

Bergantian, Anda dapat menggunakan batas sumber daya per-proses (biasanya disebut sebagai rlimitdan / atau ulimit) untuk menghapus kemungkinan satu proses mengambil jumlah memori yang konyol dan menyebabkan pertukaran, tetapi itu hanya mendorong Anda ke wilayah hiburan dengan proses yang mati pada saat-saat yang tidak nyaman karena mereka ingin sedikit lebih banyak memori daripada yang ingin diberikan oleh sistem.

Jika Anda tahu Anda akan melakukan sesuatu yang mungkin menyebabkan penggunaan memori besar, Anda mungkin bisa menulis program pembungkus yang melakukan mlockall()dan kemudian mengeksekusi shell Anda; yang akan menyimpannya dalam memori, dan akan menjadi hal yang paling dekat untuk "menjaga inti responsif" Anda kemungkinan besar akan mendapatkan (karena bukan CPU yang digunakan secara berlebihan itulah masalahnya).

Secara pribadi, saya berlangganan metode kontrol sumber daya "jangan lakukan hal bodoh". Jika Anda memiliki root, Anda dapat melakukan segala macam kerusakan pada sistem, dan dengan melakukan apa pun yang Anda tidak tahu kemungkinan hasil dari bisnis yang berisiko.

womble
sumber
2
Sayangnya, "jangan lakukan hal-hal bodoh" tidak membantu pengguna yang menjalankan aplikasi memori-hogging seperti Chrome (lihat masalah 134612 , 393395 ).
Dan Dascalescu
1
@DanDascalescu Dan tidak selalu jelas bahwa Anda melakukan sesuatu yang bodoh. Mesin saya digantung beberapa hari yang lalu karena saya mengubah "UNION" dalam kueri SQLite (rumit) menjadi "UNION ALL".
Michael
Program buggy yang dikenal dapat (dan harus) dijalankan dalam konfigurasi terbatas sumber daya - ulimit, atau bahkan cgroup hari ini, jika Anda seorang anak muda, melakukan pekerjaan dengan cukup baik. Jika Anda membuat perubahan pada kueri dalam produksi tanpa memvalidasi efeknya di lingkungan yang tidak kritis, itu adalah akar masalah Anda.
womble
8

Seperti disebutkan di atas dalam komentar oleh Tronic, dimungkinkan untuk memanggil OOM-killer (kehabisan memori pembunuh) secara langsung oleh kombinasi keyboard SysRq- F.

SysRqkunci biasanya digabungkan dalam PrtSctombol pada keyboard.

OOM-killer membunuh beberapa proses (-es) dan sistem menjadi responsif lagi. Akses langsung ke OOM-killer mungkin tidak diaktifkan secara default, harap periksa pertanyaan ini untuk mengetahui cara memeriksa statusnya dan / atau mengaktifkannya.

PS: Ini banyak membantu saya. Saya setuju dengan pendapat bahwa ini adalah saran paling berguna tentang masalah itu jika disebabkan oleh Chrome atau perangkat lunak apa pun yang serakah memori. Tetapi Anda perlu diingat bahwa pembunuh OOM dapat membunuh beberapa proses yang sangat penting, gunakan dengan hati-hati.

Arkemlar
sumber
0

Jika Anda merasa ingin mengkompilasi ulang kernel, Anda dapat mencoba tambalan dari EDITbagian pertanyaan ini: /programming//q/52067753/10239615
Itu tidak mengusir Active(file)halaman selama tekanan memori tinggi dan dengan demikian memungkinkan OOM-killer untuk memicu hampir seketika karena kernel tidak lagi perlu menghabiskan menit dari konstan membaca ulang disk dari setiap halaman kode yang dapat dieksekusi proses menyebabkan OS beku.


sumber
-1

Ini adalah sesuatu yang sangat sulit dicegah. Itu karena kernel mulai bertukar. Salah satu solusinya adalah mematikan swap. Ketika sistem kehabisan memori, daripada mulai bertukar, kernel akan mematikan beberapa proses; biasanya ia mengambil proses yang benar untuk membunuh, tetapi bagaimanapun juga lebih baik untuk membunuh proses acak daripada memiliki sistem yang tidak responsif.

Ini bisa menjadi solusi yang sangat baik untuk server, karena server sering memiliki cukup RAM dan ketika mereka mulai menggunakan ruang swap itu berarti ada sesuatu yang salah. Namun, desktop biasanya membutuhkan ruang swap, jadi saya pikir tidak ada solusi yang baik untuk desktop. Saya sering mematikan ruang swap di server, terutama ketika ada kecurigaan kebocoran memori.

Antonis Christofides
sumber
4
Mematikan swap pada sistem apa pun adalah ide yang buruk, karena itu tidak memungkinkan halaman yang tidak digunakan untuk ditukar dan ruang kosong yang digunakan untuk cache disk. Ini terutama benar ketika ada kebocoran memori.
womble
2
Dan dengan swap off, sistem masih bisa lambat karena paging. Itu hanya akan halaman halaman bersih gila bukan yang kotor. (Karena, tanpa swap, itu tidak pernah dapat mengusir halaman yang kotor, itu akan selalu harus mengusir yang bersih.)
David Schwartz
Saya memiliki server yang memiliki kebocoran memori. Pertama kali itu terjadi, saya harus menekan tombol reset, karena server menjadi tidak responsif. Tapi sekarang saya sudah mematikan swap, server hanya membunuh anak apache jika itu menjadi terlalu besar (itu adalah perlindungan selain MaxRequestsPerChild). Hasilnya adalah server berjalan tanpa masalah. Itu tidak memiliki banyak halaman yang tidak terpakai, dan tentu saja tidak paging halaman bersih.
Antonis Christofides
@AntonisChristofides: Saya tidak yakin apa yang Anda pikirkan tentang pelajaran takeaway itu. Solusi Anda tentu saja buruk karena menghambat kinerja karena ketidakmampuan untuk mengusir halaman kotor yang jarang diakses dari memori fisik, itu tidak memecahkan masalah yang mendasarinya, dan Anda menjalankan risiko bahwa pembunuh OOM mungkin membunuh proses kritis. Anda kebetulan tidak menemukan bahaya tertentu yang saya peringatankan, tetapi Anda masih berisiko karena itu karena Anda tidak memiliki swap.
David Schwartz
8
Dengan atau tanpa swap masih membeku sebelum pembunuh OOM dijalankan secara otomatis. Ini benar-benar bug kernel yang harus diperbaiki (mis. Jalankan OOM killer sebelumnya, sebelum menjatuhkan semua cache disk). Sayangnya pengembang kernel dan banyak orang lain gagal melihat masalahnya. Saran umum seperti menonaktifkan / mengaktifkan swap, membeli lebih banyak RAM, menjalankan lebih sedikit proses, menetapkan batas, dll. Tidak mengatasi masalah mendasar bahwa penanganan memori rendah kernel menyebalkan bola unta. Sementara itu, saya sarankan menjalankan OOM killer secara manual (SysRq-F) ketika sistem membeku karena akan membuatnya pulih lebih cepat.
Tronic