Cegah Ubuntu dari pembekuan, meskipun memori sistem rendah


24

Terkadang saya bekerja dengan banyak sekali data yang ingin saya ingat untuk diproses. Kadang-kadang saya salah menghitung jumlah memori yang akan dihasilkan oleh program saya, atau debugger mengalikan penggunaan memori dengan faktor yang melebihi memori yang tersedia.

Setiap kali saya memulai proses yang haus akan memori, inilah yang saya harapkan dari sistem operasi yang waras: cobalah untuk memakan semua memori bebas, kemudian tanyakan beberapa proses non-esensial lainnya dengan baik untuk memberikan sebagian memori yang tidak mereka butuhkan, kemudian menulis untuk bertukar.

Inilah yang Ubuntu lakukan untuk saya: makan semua memori bebas, lalu minta sistem operasi untuk menukar semua layanan penting (sesi gnome, terminal, keyboard), lalu bekukan dan tunggu saya untuk menarik steker listrik.

Dua pertanyaan:

  1. Bagaimana sistem operasi dapat berasumsi, bahwa apa pun bisa menjadi sangat penting sehingga tidak masalah untuk berhenti mendengarkan input pengguna?
  2. Bagaimana saya bisa memberitahu Ubuntu untuk tidak pernah menukar layanan penting dan selalu bereaksi terhadap input pengguna, bahkan jika beberapa proses bodoh mencoba memakan lebih banyak sumber daya daripada yang disediakan sistem.

Berapa banyak RAM yang telah Anda instal? Berapa ukuran swap Anda (di terminal, ketik swaponuntuk mengetahuinya)? Cheers, Al
heynnema

3
Ram 16 GB dan 16 GB swap. Tapi bukan itu intinya di sini, masalah ini tidak dapat diselesaikan dengan menambahkan lebih banyak memori.
Klamann

1
Coba satu dari dua hal. 1) ubah swappinesspengaturan menjadi 10, yaitu: vm.swappiness = 10di /etc/sysctl.conf. Cari di sini untuk swappiness untuk info lebih lanjut tentang itu. 2) Jika swappiness tidak membantu ... Meskipun Anda mungkin tidak ingin ... meningkatkan ukuran swapfile Anda menjadi 1,5x16G dan lihat apakah itu membantu. Selalu kabari saya. Cheers, Al
heynnema

1
@ Klamann Saya setuju menambahkan lebih banyak swap tidak akan memperbaiki masalah. Setelah Anda memiliki program yang rusak mengkonsumsi semua RAM + SWAP menambahkan SWAP tambahan hanya menunda yang tak terhindarkan.
WinEunuuchs2Unix

1
@ WinEunuuchs2Unix, seperti yang saya katakan, vm.swappiness=10perlu TAMBAH untuk sysctl.conf. Orang yang berpengalaman bahkan dapat menggunakan perintah sysctl dengan cepat, untuk mengatur vm.swappiness = 10, tanpa mengedit file sysctl.conf. Cheers, Al ps: menunggu OP untuk merespons.
heynnema

Jawaban:


5

Saya masih belum memiliki solusi untuk masalah ini, tetapi saya dapat menawarkan dua solusi yang mungkin menarik bagi orang lain:

1) dini hari

Itu adalah layanan yang mengawasi penggunaan memori dan membunuh proses yang menghabiskan sebagian besar memori ketika ambang tertentu tercapai (lihat juga ini dan pertanyaan ini mengenai pembunuh OOM di kernel linux)

Saya sudah mengujinya dengan proses demo yang tanpa batas meminta memori dalam potongan kecil. Inilah kesan pertama saya: Ketika saya memulai proses nakal, itu dengan cepat memakan semua RAM saya. Kemudian swapping dimulai, sistem menjadi tidak responsif. Beberapa detik kemudian sistem kembali online. Log awal menunjukkan bahwa ia membunuh proses makan memori setelah penggunaan memori dan swap mencapai 90%.

Masih ada jeda yang menyebalkan ketika swapping dimulai dan setelah proses itu dimatikan, beberapa bagian dari proses lain biasanya tetap bertukar sampai diminta, tetapi ini baru permulaan.

2) cukup nonaktifkan swap

Saya tahu ini adalah topik yang kontroversial , tetapi untuk tujuan sistem desktop dan terutama mesin pengembangan di mana hal itu dapat terjadi dari waktu ke waktu bahwa suatu proses mencoba memakan semua memori Anda, masuk akal: Tanpa bertukar, pembunuh OOM hanya berfungsi sebagaimana dimaksud. Ketika Anda kehabisan memori, ia menemukan proses terbaik untuk membunuh dan menghilangkannya. Tidak ketinggalan, tidak ada penundaan.

Anda dapat menonaktifkan swap untuk sesi saat ini dengan sudo swapoff -aatau membuat perubahan permanen .


Solusi yang tepat untuk masalah tentu saja adalah bahwa sistem tetap responsif ketika memori utama habis dan mulai bertukar memori seperti tidak ada hari esok, tetapi itu tampaknya tidak akan terjadi dalam waktu dekat.


1
Saya telah menonaktifkan swap dan sistem saya langsung dari memori rendah (<100MB) ke pembekuan. Bagaimana saya bisa tahu jika pembunuh OOM diaktifkan?
Michael

0

Coba satu dari dua hal:

1) ubah pengaturan swappiness dari pengaturan default 60, menjadi 10, yaitu: tambahkan vm.swappiness = 10 ke /etc/sysctl.conf (dalam terminal, ketik sudo gedit /etc/sysctl.conf), kemudian reboot sistem. Cari di sini untuk swappiness untuk info lebih lanjut tentang itu.

2) Jika swappiness tidak membantu ... walaupun Anda mungkin tidak ingin ... meningkatkan ukuran swapfile Anda menjadi 1,5x16G dan lihat apakah itu membantu.

Selalu kabari saya. Ceria, Al


Saya telah menyiapkan VM untuk menjalankan beberapa tes, karena me-reboot OS saya setiap beberapa detik benar-benar menjengkelkan. Ubuntu 16.04, ram 2gb, 3gb swap, 20gb disk. Kemudian saya menjalankan skrip yang memakan banyak memori: Dengan swappiness default (60), sistem membeku dan setelah beberapa menit, saya mematikannya karena waktu untuk pemulihan tidak dapat diterima. Dengan swappiness 10, sistem membeku selama beberapa detik, kemudian menerima input tetapi Anda tidak dapat memulai proses apa pun (mis. topUntuk membunuh babi memori). Setelah sekitar satu menit, prosesnya terbunuh. Tidak sempurna, tapi kami semakin dekat.
Klamann

Buat kami tetap diposting. VM tidak akan benar-benar meniru kehidupan nyata Anda yang berfungsi OS, tetapi itu akan membiarkan Anda bermain dengan pengaturan. Saya ingin tahu apakah swappiness membantu masalah Anda. Cheers, Al
heynnema

Ah bagus. Kemajuan! Baca sedikit tentang swappiness. Anda bisa bermain dengan nilai sedikit. Cheers, Al
heynnema

Berapa banyak swap yang digunakan ketika sistem membeku? Cheers, Al
heynnema

2
mengapa, apa gunanya itu? lebih banyak memori tidak akan mencegah sistem macet jika saya menyedot memori itu juga.
Klamann

0

Saya memecahkan masalah yang sama. Saya tidak tahu apakah pengalaman saya mungkin cocok untuk Anda ...

Baru-baru ini saya telah menerbitkan panduan tentang cara menginstal linux pada perangkat LVM loopback booting dari USB (jadi tanpa harus menginstal grub pada disk internal, meninggalkannya seperti aslinya). Ini panduannya: https://github.com/DareDevil73/linux-on-loopback-usb .

Kemudian saya jatuh dalam masalah pembekuan pada beban memori yang tinggi dan saya mengamati penggunaan ruang swap abnormal (semua RAM dimakan, dan swap penggunaan mendekati nol). Jelas partisi swap LVM sudah terpasang dan berfungsi dengan baik, tapi saya tidak tahu mengapa kernel tidak menggunakannya seperti yang diharapkan.

Saya mencoba solusi alternatif. Saya telah membuat file loopback swap (bukan LVM) dan pembekuannya hilang. Sekarang file swap digunakan sebagaimana mestinya, dan OS tidak pernah membeku!

Silakan lihat https://github.com/DareDevil73/linux-on-loopback-usb#known-issues untuk mendapatkan informasi yang lebih dalam.


Harap perluas tautan ke jawaban.
Konrad Gajewski
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.