Komputer membeku pada RAM hampir penuh, mungkin masalah cache disk


74

Masalahnya saya pikir agak mirip dengan utas ini .

Tidak masalah jika saya memiliki swap diaktifkan atau dinonaktifkan, setiap kali jumlah RAM yang digunakan nyata mulai mendekati maksimum dan hampir tidak ada ruang tersisa untuk cache disk, sistem menjadi benar-benar tidak responsif.

Disk spinnig liar, dan kadang-kadang setelah lama menunggu 10-30 menit itu akan mencair, dan kadang-kadang tidak (atau saya kehabisan kesabaran). Kadang-kadang jika saya bertindak cepat, saya bisa mengatur untuk perlahan-lahan membuka konsol dan mematikan beberapa aplikasi pemakan ram seperti browser, dan sistem itu hampir selesai secara instan.

Karena masalah ini saya hampir tidak pernah melihat apa pun di swap, hanya kadang-kadang ada beberapa MB di sana, dan kemudian segera setelah masalah ini muncul. Dugaan saya yang tidak berpendidikan adalah bahwa entah bagaimana terhubung ke cache disk yang terlalu serakah, atau manajemen memori terlalu lunak, jadi ketika memori diperlukan tidak dibebaskan dengan cukup cepat dan membuat sistem kelaparan.

Masalah dapat dicapai dengan sangat cepat jika bekerja dengan file lagrge (500MB +) yang dimuat dalam cache disk dan jelas setelah itu sistem tidak dapat membongkar mereka dengan cukup cepat.

Bantuan atau Ide apa pun akan sangat dihargai.

Untuk saat ini saya harus hidup dalam ketakutan yang konstan, ketika melakukan sesuatu komputer dapat membeku dan saya biasanya harus me-restart itu, jika itu benar-benar kehabisan ram saya akan lebih suka untuk hanya membunuh beberapa aplikasi userspace, seperti broser ( lebih baik jika saya entah bagaimana bisa menandai mana yang harus dibunuh terlebih dahulu)

Meskipun kesalahannya adalah mengapa tidak bertukar menyelamatkan saya dalam situasi ini.

UPDATE: Tidak bertahan selama beberapa waktu, tapi sekarang saya mendapatkan beberapa kejadian lagi. Saya sekarang menjaga monitor ram di layar saya setiap saat dan ketika hang terjadi masih menunjukkan ~ 30% gratis (Digunakan oleh cache disk mungkin). Gejala tambahan: Jika pada saat saya menonton video (VLC player) suara berhenti lebih dulu, setelah beberapa detik gambar berhenti. Sementara suara telah berhenti saya masih memiliki kontrol atas PC, tetapi ketika gambar berhenti saya bahkan tidak bisa menggerakkan mouse lagi, jadi saya me-restart setelah menunggu beberapa lama. Btw, ini tidak terjadi ketika saya mulai menonton video tetapi beberapa waktu dalam (20 menit) dan saya tidak aktif melakukan hal lain pada saat itu, meskipun browser dan oowrite terbuka di layar kedua sepanjang waktu. Pada dasarnya sesuatu hanya memutuskan untuk terjadi pada satu titik dan menggantung sistem.

Sesuai permintaan dalam komentar saya berlari dmesg tepat setelah hang. Saya tidak melihat sesuatu yang aneh, tetapi tidak tahu apa yang harus dilihat, jadi ini dia: https://docs.google.com/document/d/1iQih0Ee2DwsGd3VuQZu0bPbg0JGjSOCRZhu0B05CMYs/edit?hl=id_edit&authkeyccc7


11
Ini perlu mendapat perhatian lebih. Saya tahu bahwa ada bug yang diajukan selama bertahun-tahun.
n3

1
@ n3rd: Ini adalah bug .
Dan Dascalescu

@ Krišjānis Nesenbergs: Tolong perbaiki saya jika saya salah menyalin file lama juga membuatnya hang.
Rick2047

Terima kasih telah mengajukan pertanyaan ini dan menemukan solusinya. Harap tambahkan tanggal pada pembaruan, jika tidak jelas apa yang berhasil dan yang tidak berfungsi. Saya mengalami masalah yang sama, saya selalu memeriksa level memori, dan saya memiliki 16GB, berencana untuk memiliki 32GB, untuk melihat apakah saya dapat memperbaikinya seperti itu ...
Beto Aveiga

Jawaban:


63

Untuk memperbaiki masalah ini, saya telah menemukan bahwa Anda perlu mengatur pengaturan berikut untuk sekitar 5% -6% dari total RAM fisik Anda, dibagi dengan jumlah core di komputer:

sysctl -w vm.min_free_kbytes=65536

Perlu diingat bahwa ini adalah pengaturan per-inti, jadi jika saya memiliki 2GB RAM dan dua Cores, maka saya menghitung 6% dari hanya 1 GB dan menambahkan sedikit tambahan hanya untuk aman.

Ini memaksa komputer untuk mencoba menjaga jumlah RAM ini bebas, dan dengan demikian membatasi kemampuan untuk melakukan cache file disk. Tentu saja masih mencoba untuk men-cache mereka dan segera menukar mereka, jadi Anda mungkin harus membatasi swapping Anda juga:

sysctl -w vm.swappiness=5

(100 = tukar sesering mungkin, 0 = tukar hanya dengan kebutuhan total)

Hasilnya adalah bahwa linux tidak lagi secara acak memutuskan untuk memuat seluruh file film sekitar 1GB dalam ram saat menontonnya, dan mematikan mesin dalam melakukannya.

Sekarang ada cukup ruang yang disediakan untuk menghindari kelaparan memori, yang mungkin merupakan masalah (mengingat tidak ada lagi pembekuan seperti sebelumnya).

Setelah pengujian selama satu hari - penguncian hilang, kadang-kadang ada pelambatan kecil, karena hal-hal di-cache lebih sering, tetapi saya bisa hidup dengan itu jika saya tidak perlu me-restart komputer setiap beberapa jam.

Pelajaran di sini adalah - manajemen memori default hanyalah salah satu kasus penggunaan dan tidak selalu yang terbaik, meskipun beberapa orang mencoba menyarankan sebaliknya - hiburan rumah ubuntu harus dikonfigurasi secara berbeda dari server.


Anda mungkin ingin menjadikan pengaturan ini permanen dengan menambahkannya ke Anda /etc/sysctl.confseperti ini:

vm.swappiness=5
vm.min_free_kbytes=65536

Bagus temukan, coba laporkan bug tentang hal itu sehingga ada lebih banyak kesadaran tentang masalah ini dan mudah-mudahan seseorang akan menemukan solusi untuk tidak memuat seluruh film secara acak,
Oxwivi

terima kasih, sangat detail dan jelaskan masalah saya. Sangat dihargai!
odedbd

1
well, saya sudah mencoba hampir semuanya, dan hanya saran Anda yang memperbaiki. terima kasih
vitalii

1
Jika saya menjalankan tanpa partisi swap, apakah saya harus menggunakan jumlah yang lebih besar dari 5-6%? Dan pengaturan vm.swappinessakan melakukan apa-apa dalam kasus itu, saya kira?
Jarett Millard

1
"[vm.min_free_kbytes] memaksa komputer untuk mencoba menjaga jumlah RAM ini bebas, dan dengan demikian membatasi kemampuan untuk melakukan cache file disk." - maaf mengganggu, tapi ini tidak terkait dengan apa yang vm.min_free_kbytesterjadi. Ini bertindak sebagai blok halaman yang disediakan untuk memudahkan __GFP_WAITalokasi atom (mis., Isi atau matikan / non- ) ketika berada di bawah pertentangan memori sistem yang tinggi. Ini bisa memang masuk akal untuk menaikkan sini (sebagai mungkin warung ini terkait dengan contention memori sistem), tapi itu pasti tidak akan untuk alasan yang dijelaskan dalam jawaban ini.
Chris Down

9

Ini terjadi pada saya di instalasi baru Ubuntu 14.04.

Dalam kasus saya, itu tidak ada hubungannya dengan masalah sysctl yang disebutkan.

Sebaliknya, masalahnya adalah bahwa UUID partisi swap berbeda selama instalasi daripada setelah instalasi. Jadi swap saya tidak pernah diaktifkan, dan mesin saya akan terkunci setelah digunakan beberapa jam.

The solusi adalah untuk memeriksa UUID saat partisi swap dengan

sudo blkid

dan kemudian sudo nano /etc/fstabuntuk mengganti nilai UUID swap yang salah dengan yang dilaporkan oleh blkid.

Reboot sederhana untuk memengaruhi perubahan, dan voila.


3
Terima kasih banyak! Saya telah berjuang dengan bug yang sangat menyebalkan ini untuk sesuatu yang hampir satu tahun sekarang, dan telah mencoba segalanya untuk memperbaikinya. Mengapa Linux memiliki perilaku ini? Sepertinya itu harus bertindak seperti tidak ada swap, dan hanya memanggil pembunuh-OOM. Sebaliknya, tampaknya berpura-pura seolah ada swap, tetapi kemudian gagal untuk benar-benar menukar hal-hal (karena sebenarnya tidak ada, karena tidak dikonfigurasi dengan benar).
crazy2be

@ crazy2be Ini tidak gagal, ini berhasil tanpa akhir. Bahkan tanpa swap apa pun, Linux masih dapat mengeluarkan program dan file yang tidak dimodifikasi dalam memori dan membacanya kembali dari disk.
Martin Thornton

4

Saya tahu pertanyaan ini sudah lama, tetapi saya mengalami masalah ini di Ubuntu (Chrubuntu) 14.04 pada Chromebook Acer C720. Saya mencoba solusi Krišjānis Nesenbergs, dan itu bekerja agak, tetapi kadang-kadang masih macet.

Saya akhirnya menemukan solusi yang bekerja dengan menginstal zram daripada menggunakan pertukaran fisik pada SSD. Untuk menginstalnya saya cukup ikuti instruksi di sini , seperti ini:

sudo apt-get install zram-config

Setelah itu saya dapat mengkonfigurasi ukuran swap zram dengan memodifikasi /etc/init/zram-config.confpada baris 21.

20: # Calculate the memory to user for zram (1/2 of ram)
21: mem=$(((totalmem / 2 / ${NRDEVICES}) * 1024))

Saya mengganti 2 dengan 1 untuk membuat ukuran zram dengan ukuran yang sama dengan jumlah ram yang saya miliki. Sejak melakukan itu, saya tidak lagi memiliki sistem macet atau tidak responsif.


zramadalah opsi yang layak hanya jika Anda tidak dapat menginstal lebih banyak RAM. Jika sistem terlalu lambat ketika bertukar ke SSD dan keluar dari RAM tanpa swap, maka zramdapat membantu sedikit sampai Anda mencoba untuk melakukan sedikit lebih banyak dan hasilnya sama seperti kehabisan RAM tanpa swap.
Mikko Rantalainen

4

Tidak ada yang berhasil untuk saya !!

Jadi saya menulis skrip untuk memonitor penggunaan memori. Pertama-tama akan mencoba untuk menghapus cache RAM jika konsumsi memori meningkatkan ambang batas. Anda dapat mengkonfigurasi ambang ini pada skrip. Jika konsumsi memori tidak sampai di bawah ambang batas, maka akan mulai mematikan proses satu per satu dalam urutan konsumsi memori yang menurun sampai konsumsi memori di bawah ambang batas. Saya telah menetapkannya ke 96% secara default. Anda dapat mengonfigurasinya dengan mengubah nilai variabel RAM_USAGE_THRESHOLD dalam skrip.

Saya setuju bahwa proses pembunuhan yang menggunakan memori tinggi bukanlah solusi yang sempurna, tetapi lebih baik untuk membunuh SATU aplikasi daripada kehilangan SEMUA pekerjaan !! skrip akan mengirimkan pemberitahuan desktop kepada Anda jika penggunaan RAM meningkatkan ambang batas. Ini juga akan memberi tahu Anda jika itu membunuh proses apa pun.

#!/usr/bin/env python
import psutil, time
import tkinter as tk
from subprocess import Popen, PIPE
import tkinter
from tkinter import messagebox
root = tkinter.Tk()
root.withdraw()

RAM_USAGE_THRESHOLD = 96
MAX_NUM_PROCESS_KILL = 100

def main():
    if psutil.virtual_memory().percent >= RAM_USAGE_THRESHOLD:
        # Clear RAM cache
        mem_warn = "Memory usage critical: {}%\nClearing RAM Cache".\
            format(psutil.virtual_memory().percent)
        print(mem_warn)
        Popen("notify-send \"{}\"".format(mem_warn), shell=True)
        print("Clearing RAM Cache")
        print(Popen('echo 1 > /proc/sys/vm/drop_caches',
                    stdout=PIPE, stderr=PIPE,
                    shell=True).communicate())
        post_cache_mssg = "Memory usage after clearing RAM cache: {}%".format(
                            psutil.virtual_memory().percent)
        Popen("notify-send \"{}\"".format(post_cache_mssg), shell=True)
        print(post_cache_mssg)

        if psutil.virtual_memory().percent < RAM_USAGE_THRESHOLD:
            print("Clearing RAM cache saved the day")
            return
        # Kill top C{MAX_NUM_PROCESS_KILL} highest memory consuming processes.
        ps_killed_notify = ""
        for i, ps in enumerate(sorted(psutil.process_iter(),
                                      key=lambda x: x.memory_percent(),
                                      reverse=True)):
            # Do not kill root
            if ps.pid == 1:
                continue
            elif (i > MAX_NUM_PROCESS_KILL) or \
                    (psutil.virtual_memory().percent < RAM_USAGE_THRESHOLD):
                messagebox.showwarning('Killed proccess - save_hang',
                                       ps_killed_notify)
                Popen("notify-send \"{}\"".format(ps_killed_notify), shell=True)
                return
            else:
                try:
                    ps_killed_mssg = "Killed {} {} ({}) which was consuming {" \
                                     "} % memory (memory usage={})". \
                        format(i, ps.name(), ps.pid, ps.memory_percent(),
                               psutil.virtual_memory().percent)
                    ps.kill()
                    time.sleep(1)
                    ps_killed_mssg += "Current memory usage={}".\
                        format(psutil.virtual_memory().percent)
                    print(ps_killed_mssg)
                    ps_killed_notify += ps_killed_mssg + "\n"
                except Exception as err:
                    print("Error while killing {}: {}".format(ps.pid, err))
    else:
        print("Memory usage = " + str(psutil.virtual_memory().percent))
    root.update()


if __name__ == "__main__":
    while True:
        try:
            main()
        except Exception as err:
            print(err)
        time.sleep(1)

Simpan kode dalam file say save_hang.py. Jalankan skrip sebagai:

sudo python save_hang.py

Harap dicatat bahwa skrip ini hanya kompatibel untuk Python 3 dan mengharuskan Anda untuk menginstal paket tkinter. Anda dapat menginstalnya sebagai:

sudo apt-get install python3-tk

Semoga ini membantu...


2

Dugaan saya adalah bahwa Anda telah menetapkan vm.swappinessnilai yang sangat rendah, yang menyebabkan kernel terlambat bertukar, meninggalkan terlalu sedikit RAM untuk sistem untuk bekerja.

Anda dapat menunjukkan pengaturan swappiness Anda saat ini dengan menjalankan:

sysctl vm.swappiness

Secara default, ini diatur ke 60. Wiki Ubuntu merekomendasikan untuk mengaturnya menjadi 10, tetapi jangan ragu untuk mengaturnya ke nilai yang lebih tinggi. Anda dapat mengubahnya dengan menjalankan:

sudo sysctl vm.swappiness=10

Ini akan mengubahnya hanya untuk sesi saat ini , untuk membuatnya persisten, Anda perlu menambahkan vm.swappiness = 10ke /etc/sysctl.conffile.

Jika disk Anda lambat, pertimbangkan untuk membeli yang baru.


Sebenarnya mengurangi swapiness mengurangi masalah (itu jarang terjadi). Saya menyimpannya jam 5 sekarang. Meskipun mungkin itu adalah masalah lain dengan pertukaran yang lebih tinggi, karena, ketika berusia 60 tahun, dan saya memutuskan untuk menonton film atau mengedit file besar, seluruh file dan hampir GB dimuat dalam memori dan kemudian sistem segera mulai menukar program saya aktif menggunakan dan bahkan antarmuka pengguna itu sendiri. Masalahnya adalah saya pikir saya mengerti bagian bertukar, apa yang saya inginkan adalah membunuh aplikasi pengguna serakah alih-alih membekukan mesin saat kehabisan ram. (Dan sebaiknya batasi ukuran file dalam cache)
Krišjānis Nesenbergs

@ Krisa: ketika sistem kehabisan memori (RAM dan swap), kernel memanggil oom_kill yang membunuh proses untuk menghemat memori. Sayangnya, Anda tidak dapat mengontrol proses target. Untuk memicunya secara manual, tekan Alt + SysRq + F. Saat menjalankan dmesgperintah, Anda harus melihat beberapa informasi (dan nama proses + id) dari proses. Saya pikir Anda sebaiknya membeli disk baru yang lebih cepat. Atau tingkatkan RAM Anda.
Lekensteyn

3
Masalahnya adalah, oom_kill itu tidak dipanggil sebelum komputer terkunci selama 30 menit. Juga - adakah setidaknya cara untuk mengetahui proses mana yang akan dibunuh terlebih dahulu?
Krišjānis Nesenbergs

2
Saya memiliki Ram 2GB dan HDD adalah 5400rpm. Saya benar-benar tidak berpikir bahwa itu adalah sistem lama yang membenarkan setengah jam membeku saat menonton video di satu monitor dan menjelajah sekitar 20-30 tab di yang lain. Sebenarnya saya akan sangat senang jika saya bisa membiarkan akses konsol dan mematikan beberapa proses - apakah ada cara untuk membuat input pengguna dan terminal prioritas super tinggi sehingga berfungsi saat sistem macet?
Krišjānis Nesenbergs

1
Pokoknya - bertukar dan jumlah RAM agak offtopic. Masalahnya adalah, sistem itu menjadi tidak responsif untuk waktu yang lama, bahkan jika swap dinonaktifkan, dan setelah itu kadang-kadang masih menjalankan program (sehingga ia berhasil menemukan memori di suatu tempat) dan waktu lain menjalankan oom_killer. Sistem seharusnya dapat mengatakan bahwa itu kehabisan ram dan tidak membiarkan saya menjalankan lebih banyak barang. Jadi, apakah ada cara untuk menghentikan pembekuan itu atau mengatur prioritas input pengguna begitu tinggi, sehingga saya bisa beralih ke konsol ketika itu terjadi dan membunuh sendiri beberapa proses?
Krišjānis Nesenbergs

2

Saya telah berjuang dengan masalah ini untuk waktu yang lama, tetapi sekarang tampaknya sudah diselesaikan pada Laptop saya.

Jika tidak ada jawaban lain yang berfungsi untuk Anda (saya sudah mencoba sebagian besar dari mereka), bermainlah dengan min_free_kbytes , untuk memiliki lebih banyak ruang dalam RAM ketika komputer Anda mulai bertukar (tepat sebelum mencapai nilai minimum ini pada RAM gratis Anda).

Saya memiliki 16GB RAM, tetapi lebih cepat daripada kemudian memori menjadi penuh dan kemudian berhenti merespons selama 10 hingga 30 menit, sampai beberapa hal ditukar.

Setidaknya bagi saya, pengaturan nilai min_free_kbytes di atas apa yang disarankan membuat proses swapping lebih cepat.

Untuk RAM 16GB, coba ini:

vm.min_free_kbytes=500000

Untuk mengatur nilai ini, lihat jawaban lain, atau cukup google saja :)


0

Saya menjalankan salah satu laptop saya dari kartu SD Ubuntu langsung terus-menerus, dengan partisi penyimpanan ext4 kecil dan file swap pada hard drive. Ketika hampir semua RAM digunakan dan nilai swappiness terlalu rendah (kadang-kadang saya lebih suka menjaga hard drive sepenuhnya jika mungkin, karena berisik), kinerja Linux cenderung jatuh dari tebing untuk saya, sehingga hanya untuk mendapatkan TTY1 untuk mematikan Firefox membutuhkan waktu 15 menit.

Meningkatkan /proc/sys/vm/vfs_cache_pressuredari default 100 ke nilai 6000 tampaknya membantu mencegah hal ini. Namun, dokumentasi kernel memperingatkan tidak melakukannya, mengatakan

Increasing vfs_cache_pressure significantly beyond 100 may have negative
performance impact. Reclaim code needs to take various locks to find freeable
directory and inode objects. With vfs_cache_pressure=1000, it will look for
ten times more freeable objects than there are.

Saya tidak sepenuhnya yakin tentang efek samping dari melakukan ini, jadi saya akan berhati-hati melakukan ini.


Anda mungkin akan mengalami hasil yang lebih baik dengan vfs_cache_pressuremendekati 10 (yaitu, jauh lebih sedikit dari 100) dan pengaturan min_free_kbyteslebih tinggi. Berhati-hatilah bahwa jika Anda menyetel min_free_kbytesterlalu tinggi, pembunuh OOM kernel akan membunuh semua orang!
Mikko Rantalainen

@MikkoRantalainen Saya sudah naik min_free_kbyteske 262144, dan saya telah mengamati bahwa menurunkan vfs_cache_pressurememiliki efek sebaliknya - menurunkannya di bawah 100 membuat sistem menjadi tidak responsif jauh lebih cepat. Saya tidak yakin persis mengapa.
Hitechcomputergeek

Secara umum peningkatan vfs_cache_pressureakan menyebabkan direntries untuk dibuang sebelum konten file di-cache dan sebagai hasilnya, kinerja keseluruhan biasanya akan menderita dengan nilai lebih dari 100. kemudian pengembang kernel dapat mengetahui akar penyebabnya. Bagi saya, hang terjadi tanpa peringatan apa pun. Tebakan terbaik saya adalah bahwa kernel hang karena OOM sebelum OOM Killer telah membebaskan RAM yang cukup. Saya sekarang menjalankan min_free_kbytes = 100000, admin_reserve_kbytes = 250000 dan user_reserve_kbytes = 500000.
Mikko Rantalainen

(lanjutan) Saya belum pernah mengalami crash dengan konfigurasi di atas walaupun saya memiliki swappiness = 5 dan vfs_cache_pressure = 20. Sistem ini memiliki 16 GB RAM dan 8 GB swap pada SSD. Sistem lain memiliki 32 GB RAM dan nol swap dan secara acak tampaknya mengalami masalah yang sama - ada menekan Alt + SysRq + f setelah sistem terasa lambat tampaknya membantu, jadi saya kira jika OOM Killer bertindak cukup cepat, sistem tidak akan menggantung.
Mikko Rantalainen
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.