Bilgisayarın neredeyse tüm RAM'lerde donması, muhtemelen disk önbellek sorunu


74

Bence sorun bu konuya biraz benziyor .

Takas özelliğini etkinleştirip devre dışı bırakmamın önemi yok, kullanılan RAM miktarı maksimum seviyeye yaklaştığında ve disk önbelleği için neredeyse hiç boş alan kalmazsa, sistem tamamen yanıt vermiyor.

Disk çılgınca spinnig ve bazen uzun süre 10-30 dakika bekledikten sonra çözülecek ve bazen (veya bende sapma bitmeyecek) donacaktır. Bazen hızlı hareket edersem, konsolu yavaşça açabilir ve tarayıcı gibi bazı ram yeme uygulamalarını öldürebilirim ve sistem neredeyse anında çözülür.

Bu problem yüzünden takasta neredeyse hiçbir şey görmüyorum, sadece bazen birkaç MB var ve sonra bu problem ortaya çıkıyor. Bu kadar eğitimli değil tahminim, bir şekilde disk önbelleğine çok açgözlü veya çok hafif bir bellek yönetimine bağlı olacağı, bu nedenle bellek gerektiğinde yeterince hızlı bir şekilde serbest bırakılmadığı ve sistemi aç bıraktığı yönünde olacaktı.

Disk önbelleğine yüklenen gecikmeli dosyalar (500MB +) ile çalışıyorsanız ve sonradan sisteminiz düzgün çalışıyorsa, bunları yeterince hızlı bir şekilde çıkaramazsanız, sorun gerçekten çok hızlı şekilde çözülebilir.

Herhangi bir yardım veya Fikir büyük ölçüde takdir edilecektir.

Şimdilik sürekli bir korku içinde yaşamak zorundayım, bilgisayar yaparken sadece donabilecek ve genellikle yeniden başlatmak zorunda kalacağım, gerçekten ram bitiyorsa, broser gibi bazı kullanıcı alanlarını öldürmek için daha çok isterim ( tercihen eğer hangisini ilk öldüreceğini işaretleyebilseydim)

Mistery neden takas olmasa da bu durumda beni kurtarıyor.

GÜNCELLEME: Bir süre beklemiyordum, ama şimdi yine birkaç zorluk kazandım. Şimdi her zaman ekranımda ram monitörü tutuyorum ve askıda kalma gerçekleştiğinde yine de ~% 30 ücretsiz gösteriliyor (Disk önbelleği tarafından kullanılıyor olabilir). Ek belirtiler: Video izliyorsam (VLC oynatıcı) ilk önce ses durur, birkaç saniye sonra görüntü durur. Ses dururken bilgisayar üzerinde hala bir kontrolüm var ama görüntü durduğunda artık fareyi bile hareket ettiremiyorum, bu yüzden biraz bekledikten sonra yeniden başlattım. BTW, bu, videoyu izlemeye başladığımda olmadı, ancak bir süre (20dk.) İçinde ve tarayıcı ve oowrite sürekli olarak ikinci ekranda açık olsa da, o sırada aktif olarak hiçbir şey yapmadım. Temel olarak bir şey bir noktada olmaya karar verir ve sistemi kapatır.

Yorumların isteğine göre asılmadan hemen sonra dmesg koştum. Garip bir şey farketmedim, ama ne arayacağımı bilmiyordum, bu yüzden işte burada: https://docs.google.com/document/d/1iQih0Ee2DwsGd3VuQZu0bPbg0JGjSOCRZhu0B05CMYs/edit?hl=tr=tr=tr


11
Bunun daha fazla dikkat çekmesi gerekiyor. Yıllarca dosyalanmış böceklerin olduğunu biliyorum.
n3,


@ Krišjānis Nesenbergs: Lütfen yanlış düzeltin, uzun bir dosyayı yapıştırarak kopyalamalısınız.
Rick2047

Bu soruyu sorduğunuz ve bir çözüm bulduğunuz için teşekkür ederiz. Lütfen güncellemeye bir tarih ekleyin, aksi halde neyin işe yaradığı ve neyin işe yaramadığı açık değildir. Aynı problemi yaşıyorum, daima bellek seviyelerini kontrol ediyorum ve
16GB'ım var, 32GB'ım

Yanıtlar:


63

Bu sorunu çözmek için, aşağıdaki ayarı toplam fiziksel RAM'inizin% 5-6'sı kadar bir değere ayarlamanız gerektiğini ve bilgisayardaki çekirdek sayısına bölündüğünü buldum:

sysctl -w vm.min_free_kbytes=65536

Bunun çekirdek başına bir ayar olduğunu unutmayın, bu yüzden 2GB RAM ve iki Çekirdeğim varsa, o zaman sadece 1 GB'ın% 6'sını hesapladım ve sadece güvende olmak için biraz fazladan ilave ettim.

Bu, bilgisayarı bu miktarda RAM'i boş tutmaya çalışmasına zorlar ve bu şekilde disk dosyalarını önbelleğe alma özelliğini sınırlar. Tabii ki yine de onları önbelleğe almaya ve hemen değiştirmeye çalışıyor, bu yüzden muhtemelen takas alanınızı da kısıtlamalısınız:

sysctl -w vm.swappiness=5

(100 = mümkün olduğunca sık değiş tokuş, 0 = yalnızca toplam gereksinim halinde değiş tokuş)

Sonuç olarak, linux artık rastgele bir şekilde koç olarak yaklaşık 1GB'lık bir film dosyasını koyarken ve bunu yaparken makineyi öldürür.

Şimdi, bellek açlığından kaçınmak için yeterince boş yer var, ki bu görünüşte problemdi (daha önce olduğu gibi daha fazla don olmadığı için görme).

Bir gün test ettikten sonra - kilitlenmeler kaybolur, bazen küçük yavaşlamalar olur, çünkü işler daha sık önbelleğe alınır, ancak birkaç saatte bir bilgisayarı yeniden başlatmak zorunda kalmazsam bununla yaşayabilirim.

Buradaki ders - varsayılan bellek yönetimi kullanım durumlarından sadece bir tanesidir ve her zaman en iyisi değildir, ancak bazı kişiler başkalarını önermeye çalışsa da - ev eğlencesi ubuntu sunucudan farklı şekilde yapılandırılmalıdır.


Muhtemelen bu ayarları istediğiniz şekilde ekleyerek kalıcı yapmak /etc/sysctl.confistersiniz:

vm.swappiness=5
vm.min_free_kbytes=65536

İyi bul, hataları bildirmeye çalış, böylece konuyla ilgili daha fazla farkındalık kazanacak ve umarım birileri tüm filmi rastgele yüklemeyecek bir çözüm
bulacaktır

teşekkürler, büyük detay ve sorunumu açıklıyor. Çok takdir!
Ağustos'ta

1
hemen hemen her şeyi denedim ve yalnızca öneriniz işleri geliştirdi. teşekkür ederim
vitalii

1
Takas bölmesi olmadan koşuyorsam,% 5-6'dan daha büyük bir miktar kullanmalı mıyım? Ve ayar vm.swappinessbu durumda hiçbir şey yapmaz, sanırım?
Jarett Millard

1
"[vm.min_free_kbytes], bilgisayarı bu RAM miktarını boş tutmaya çalışmaya zorlar ve bu şekilde disk dosyalarını önbelleğe alma özelliğini sınırlar." - Rahatsız ettiğim için özür dilerim, ama bu ne vm.min_free_kbytesolduğu ile ilgili değil . __GFP_WAITYüksek sistem belleği çekişmesi sırasında atomik (yani, doldurma veya öldürme / olmayan ) tahsisleri kolaylaştırmak için ayrılmış bir sayfa bloğu görevi görür . Onu burada yükseltmek gerçekten mantıklı olabilir (bu duraklar muhtemelen sistem belleği çekişmesiyle ilgilidir), ancak kesinlikle bu cevapta açıklanan nedenden dolayı olmaz.
Chris Down,

9

Bu benim için Ubuntu 14.04'ün yeni kurulumunda oldu.

Benim durumumda, belirtilen sysctl sorunları ile ilgisi yoktu.

Bunun yerine, sorun takas bölümünün UUID'sinin yükleme sırasında yükleme sonrasında olduğundan farklı olmasıydı. Böylece takasım hiçbir zaman etkin olmadı ve birkaç saatlik kullanımdan sonra makinem kilitlendi.

Çözelti takas bölümünün cari UUID ile kontrol etmekti

sudo blkid

ve ardından sudo nano /etc/fstabyanlış takasın UUID değerini blkid tarafından bildirilenle değiştirmek için.

Değişiklikleri etkilemek için basit bir yeniden başlatma ve işte.


3
Çok teşekkür ederim! Şimdi bu kadar çıldırtan böcekle bir yıla yakın bir şey için uğraşıyorum ve düzeltmek için her şeyi denedim . Linux neden bu davranışa sahip? Takas yokmuş gibi davranması gerekiyor gibi görünüyor ve sadece OOM katilini çağırdı. Bunun yerine, takas varmış gibi davranıyor gibi görünüyor, ancak daha sonra bir şeyleri takas etmekte başarısız oluyor (çünkü aslında doğru şekilde yapılandırılmadığı için yok).
crazy2be

@ crazy2be Başarısız değil, hiç bitmeden başarıyor. Herhangi bir takas olmadan bile Linux hala programları ve değiştirilmemiş dosyaları hafızaya alabilir ve diskten yeniden okuyabilir.
Martin Thornton

4

Bu sorunun eski olduğunu biliyorum ama bu problemi Acer C720 Chromebook'ta Ubuntu (Chrubuntu) 14.04'te yaşadım. Krišjānis Nesenbergs'in çözümünü denedim ve biraz çalıştı, ancak bazen de çöktü.

Sonunda, SSD'ye fiziksel takas kullanmak yerine zram yükleyerek çalışan bir çözüm buldum. Yüklemek için sadece talimatları takip Burada böyle,:

sudo apt-get install zram-config

Daha sonra, /etc/init/zram-config.conf21. satırda değişiklik yaparak zram takas boyutunu yapılandırabilirim .

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

Zram boyutunun sahip olduğum koç miktarıyla aynı boyutta olmasını sağlamak için 2'yi 1 ile değiştirdim. O zamandan beri hiçbir donma ya da sisteme tepkisizlik yaşamadım.


zramKullanılabilir seçenek yalnızca daha fazla RAM kuramazsanız geçerlidir. Sistem, SSD'ye geçiş yaparken çok yavaşsa ve değiştirmeden RAM'den çıkarsa, zrambiraz daha fazlasını yapmaya çalışıncaya kadar biraz yardımcı olabilir ve sonuç, değiştirilemeyen RAM dışı ile aynı olur.
Mikko Rantalainen

4

Hiçbir şey benim için çalıştı!

Bu yüzden hafıza kullanımını izlemek için bir senaryo yazdım. Bellek tüketimi bir eşik değerini arttırırsa ilk önce RAM önbelleğini temizlemeye çalışır. Bu eşiği komut dosyasında yapılandırabilirsiniz. Hafıza tüketimi o zaman bile eşiğin altına düşmezse, hafıza tüketimi eşiğin altına düşene kadar azalan hafıza tüketim sırasındaki işlemleri öldürmeye başlayacaktır. Varsayılan olarak% 96 olarak ayarladım. Komut dosyasında RAM_USAGE_THRESHOLD değişkeninin değerini değiştirerek yapılandırabilirsiniz.

Yüksek bellek tüketen öldürme işlemlerinin mükemmel bir çözüm olmadığı konusunda hemfikir, ancak TÜM işi kaybetmek yerine BİR uygulamayı öldürmenin daha iyi olduğunu kabul ediyorum !! RAM kullanımı eşiği artırırsa, komut dosyası size masaüstü bildirimi gönderir. Ayrıca herhangi bir işlemi öldürürse sizi bilgilendirecektir.

#!/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)

Kodu bir dosyaya kaydedin, save_hang.py yazın. Komut dosyasını şu şekilde çalıştır:

sudo python save_hang.py

Lütfen bu betiğin yalnızca Python 3 ile uyumlu olduğunu ve tkinter paketini yüklemenizi gerektirdiğini unutmayın. olarak yükleyebilirsiniz:

sudo apt-get install python3-tk

Bu yardımcı olur umarım...


2

Tahminimce, vm.swappinessçok düşük bir değere ayarladınız , bu da çekirdeğin çok geç değişmesine ve sistemin çalışması için çok düşük RAM bırakmasına neden oluyor.

Geçerli takas ayarınızı aşağıdakileri uygulayarak gösterebilirsiniz:

sysctl vm.swappiness

Varsayılan olarak, bu, 60'a ayarlanmıştır. Ubuntu Wiki , 10'a ayarlanmasını önerir, ancak daha yüksek bir değere ayarlamaktan çekinmeyin. Çalıştırarak değiştirebilirsiniz:

sudo sysctl vm.swappiness=10

Bu, yalnızca geçerli oturum için değişecek , kalıcı kılmak vm.swappiness = 10için /etc/sysctl.confdosyaya eklemeniz gerekir .

Diskiniz yavaşsa, yenisini almayı düşünün.


Aslında değiş tokuş etmek, sorunu azalttı (daha nadir oldu). Şimdi 5'te tutuyorum. Higer takasçılığıyla ilgili başka bir sorun olsa da, çünkü, 60 yaşındayken, bir filmi izlemeye ya da büyük bir dosyayı düzenlemeye karar verdim, bütün dosya o anda neredeyse bir GB belleğe yüklendi ve sonra sistem anında programları değiştirmeye başladı. aktif olarak ve hatta kullanıcı arayüzü kullanarak. Mesele şu ki, değiştirilen kısmı anlıyorum, istediğim şey ram bitince makineyi dondurmak yerine açgözlü kullanıcı uygulamalarını öldürmektir. (Ve tercihen önbellekteki dosya boyutunu
sınırla

@Krisa: sistem belleği bittiğinde (RAM ve takas), çekirdek bellek tasarrufu için işlemleri öldüren oom_kill'i çağırır. Ne yazık ki, hedef işlemleri kontrol edemezsiniz. Manuel olarak tetiklemek için, Alt + SysRq + F tuşlarına basın. dmesgKomutu çalıştırırken , işlemle ilgili bazı bilgileri (ve işlem adı + kimliğini) görmelisiniz. Yeni, daha hızlı bir disk satın almaktan daha iyi olacağını düşünüyorum. Veya RAM'inizi yükseltin.
Lekensteyn

3
Sorun şu ki, oom_kill sadece bilgisayar yaklaşık 30 dakika boyunca kilitlenmeden çağrılmıyor. Ayrıca - en azından hangi sürecin öldürüleceğini bilmenin bir yolu var mı?
Krišjānis Nesenbergs

2
Ben 2GB Ram var ve HDD 5400 rpm. Gerçekten bir monitörde video izlerken ve diğerinde 20-30 sekmeye göz atarken yarım saat donmayı haklı çıkartan eski bir sistem olduğunu sanmıyorum. Aslında, her zaman konsola erişip bazı işlemleri sonlandırabilirsem çok mutlu olacağım - kullanıcı girişi ve terminali yüksek öncelikli hale getirmenin bir yolu var, bu yüzden sistem donarken çalışır?
Krišjānis Nesenbergs

1
Neyse - takas ve RAM miktarı biraz offtopic. Sorun şu ki, takas devre dışı bırakılsa bile, bu sistem uzun bir süre boyunca tepkisizleşiyor ve bundan sonra da bazen programı çalıştırıyor (bu nedenle bir yerde bellek bulmayı başarıyor) ve diğer zamanlarda oom_killer'ı çalıştırıyor. Sistemin ramın tükendiğini ve daha fazla şey çalıştırmama izin vermediğini söyleyebilir. Bu donmaları durdurmanın veya kullanıcı giriş önceliğini o kadar yüksek ayarlamamın bir yolu var, bunlar gerçekleştiğinde konsola geçebilir ve bazı işlemleri kendim öldürebilir miyim?
Krišjānis Nesenbergs

2

Uzun süredir bu sorunla mücadele ediyorum, ancak şimdi dizüstü bilgisayarımda çözülmüş görünüyor.

Diğer yanıtların hiçbiri sizin için işe yaramazsa (çoğunu denedim), bilgisayarınız değişmeye başladığında RAM'de daha fazla yer açmak için min_free_kbytes ile oynayın (yalnızca RAM'inizdeki bu minimum değere ulaşmadan önce).

16GB RAM'im var, ancak daha sonra erteledi, bellek doldu ve sonra bazı şeyler değişinceye kadar 10 ila 30 dakika boyunca yanıt vermiyor.

En azından benim için, min_free_kbytes değerini önerilen değerin üstüne çıkarmak , takas işleminin oldukça hızlı bir şekilde yapılmasını sağlar.

16GB RAM için şunu deneyin:

vm.min_free_kbytes=500000

Bu değeri ayarlamak için diğer cevaplara bakın ya da sadece google :)


0

Dizüstü bilgisayarlarımdan birini sürekli olarak küçük bir ext4 depolama bölümü ve sabit sürücüdeki bir takas dosyasıyla birlikte canlı bir Ubuntu SD karttan çalıştırıyorum. RAM'in neredeyse tamamı kullanıldığında ve takas değeri çok düşük olduğunda (bazen, eğer mümkünse sabit sürücüyü tamamen kapalı tutmayı tercih ederim, çünkü gürültülüdür), Linux performansı benim için bir uçurumdan düşme eğilimindedir. TTY1'in Firefox'u öldürmesi 15 dakika sürer.

/proc/sys/vm/vfs_cache_pressureVarsayılan 100'den 6000 değerine yükseltmek , bunu önlemeye yardımcı görünüyor. Bununla birlikte, çekirdek belgeler bunu yapmama konusunda uyarır;

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.

Bunu yapmanın yan etkilerinden tam olarak emin değilim, bu yüzden bunu yaparken dikkatli olacağım.


Muhtemelen vfs_cache_pressure10'a yakın (yani 100'den daha az) ve min_free_kbytesdaha yüksek ayarlarla daha iyi sonuçlar alırsınız . Eğer min_free_kbytesçok yükseğe koyarsan, çekirdeğin OOM katilinin herkesi öldüreceği konusunda uyar!
Mikko Rantalainen 17:17

@MikkoRantalainen 262144'e yükselttim min_free_kbytesve düşürmenin vfs_cache_pressureters etkiye sahip olduğunu gördüm - 100'ün altına düşürmek sistemin çok daha hızlı tepkisizleşmesini sağlıyor. Neden tam olarak bilmiyorum.
Hitechcomputergeek

Genel olarak arttırmak vfs_cache_pressure, önbellek dosyalarının içeriğinden önce direncilerin atılmasına neden olur ve sonuç olarak, genel performans genellikle 100'ün üzerinde değerlerle etkilenir. Örneğin, Ubuntu Live CD ile başlayan sistemi çökertmek / asmak için yeniden oluşturma adımlarını çözebilirsiniz. daha sonra çekirdek geliştiricileri kök nedenini anlayabilir. Benim için asmak, herhangi bir uyarı olmadan gerçekleşir. En iyi tahminim, çekirdeğin OOM Katili yeterince RAM serbest bırakmadan önce OOM nedeniyle askıda kalmasıdır. Şimdi min_free_kbytes = 100000, admin_reserve_kbytes = 250000 ve user_reserve_kbytes = 500000 kullanıyorum.
Mikko Rantalainen

(cont) swappiness = 5 ve vfs_cache_pressure = 20 olsa da, yukarıdaki config ile henüz çarpılmadım. Sistem, SSD'de 16 GB RAM ve 8 GB takas alanına sahiptir. Başka bir sistemde 32 GB RAM ve sıfır takas vardır ve rastgele aynı sorundan muzdarip görünüyor - orada sistem yavaşladığında Alt + SysRq + f tuşlarına basmak yardımcı olacak gibi görünüyor, bu nedenle OOM Killer'ın sistemin yeterince hızlı hareket etmesini sağlayıp sağlamadığını tahmin ediyorum.
Mikko Rantalainen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.