Yıllarca, işletim sistemimin OOM katili düzgün çalışmıyor ve donmuş bir sisteme yol açıyor.
Bellek kullanımı çok yüksek olduğunda, tüm sistem belleği boşaltmak için işlemleri öldürmek yerine saatlerce , hatta günlerce "donma" (aslında: aşırı yavaşlama) eğilimindedir .
Kaydettiğim maksimum süre, sıfırlama işlemini yapmak için kendimi istifa etmeden 7 gün önce. OOM'a
ulaşmak üzereyken , iyot ölçülemez hale gelmeden önce çok yüksektir (~% 70).
Araç: Her programın sabit diskimden çok yüksek bir verimle (onlarca MB / sn) okuduğunu gösterdi.
Bu programlar ne okuyor?iotop
- Dizin hiyerarşisi?
- Çalıştırılabilir kodun kendisi mi?
Ben tam olarak şimdi değilim.
[değiştirildi] Bu mesajı yazdığımda (2017'de) güncel bir ArchLinux kullanıyordum (4.9.27-1-lts), ancak sorunu daha önce yıllarca yaşadım.
Aynı sorunu çeşitli Linux dağıtımları ve farklı donanım yapılandırmaları ile de yaşadım.
Şu anda (2019), güncel bir Debian 9.6 kullanıyorum (4.9.0) İşletim sistemimin yüklü olduğu bir SSD olan 16 GB fiziksel ram, herhangi bir takas bölümü yok.
Sahip olduğum koç miktarı nedeniyle, bir takas bölümünü etkinleştirmek istemiyorum çünkü konunun ortaya çıkmasını geciktirecektir.
Ayrıca, SSD'lerin çok sık değişmesi, diskin ömrünü azaltabilir.
Bu arada, zaten bir takas bölümüyle ve bu bölüm olmadan denedim, yalnızca sorunun ortaya çıkışını geciktirdiğini, ancak çözüm olmadığını kanıtladı.
Bana göre sorun, Linux'un temel verileri donmuş bir sisteme götüren önbelleklerden ayırmasıdır , çünkü her seferinde sabit sürücüden her şeyi okumak zorundadır.
Linux'un çalışan programların çalıştırılabilir kod sayfalarını bırakıp bırakmayacağını bile merak ediyorum, bu da normalde bu kadar çok veri okumayan programların neden bu şekilde davrandığını açıklıyor.
Bu sorunu çözme umuduyla birkaç şey denedim.
Bir ayarlamak /proc/sys/vm/min_free_kbytes
için 1000000
(1 GB) oldu.
Bu 1 GB boş kalması gerektiğinden, bu hafızanın Linux tarafından önemli verileri önbelleğe almak için ayrılacağını düşündüm.
Ama işe yaramadı.
Ayrıca, ben, tanımlayarak bu fiziksel bellek büyüklüğüne sanal bellek boyutunu kısıtlamak, teoride büyük ses olabilir bile eklemek için yararlı düşünüyorum /proc/sys/vm/overcommit_memory
için 2
, benim durumda terbiyeli teknik olarak mümkün olmadığı uygulamalar tür çünkü Kullandığım, bazı nedenlerden dolayı etkili bir şekilde kullandıklarından daha fazla sanal bellek gerektiriyor.
Dosyaya göre /proc/meminfo
, Commited_AS
değer genellikle sistemimdeki fiziksel ram değerinin iki katından daha yüksektir (16 GB, Commited_AS genellikle> 32 GB).
Bu sorunu /proc/sys/vm/overcommit_memory
varsayılan değerine göre yaşadım : 0
ve bir süredir bunu tanımladım: 1
çünkü yanlış davranmak yerine OOM katili tarafından öldürülecek programları tercih ettim çünkü malloc
ne zamanların dönüş değerlerini kontrol etmiyorlar? tahsisler reddedilir.
IRC'de bu konuda konuştuğumda , aynı sorunu yaşayan diğer Linux kullanıcılarıyla tanıştım, sanırım birçok kullanıcı bununla ilgileniyor.
Bana göre bu kabul edilemez, çünkü Windows bile yüksek bellek kullanımıyla daha iyi başa çıkıyor.
Daha fazla bilgiye ihtiyacınız varsa, bir öneriniz varsa, lütfen bana bildirin.
Belgeler:
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/
Bunun hakkında konuşuyorlar:
Neden Linux dışı bellek (OOM) katili otomatik olarak çalışmıyor, ancak sysrq-key'de çalışıyor?
OOM-katil neden bazen kaynak domuzlarını öldürmekte başarısız oluyor?
OOM Katilinin
Önyüklenmesi Zorla değişim sırasında OOM-katilini tetiklemek mümkün mü?
OOM durumuna yakın gecikmeyi nasıl önleyebilirim?
https://lwn.net/Articles/104179/
https://bbs.archlinux.org/viewtopic.php?id=233843
min_free_kbytes
alakalı değil, önbelleğe alınmış sayfalar için bir rezerv değil. AFAICT vm sctrislerinin hiçbiri önbelleklenmiş sayfalar için özel olarak herhangi bir bellek ayırmaya izin vermez, yani MAP_ANONYMOUS tahsislerini sınırlandırır :(.