Soru Neden Linux'ta önbellekleri bırakalım?


Sunucularımızda gece yarısı önbellek bırakma alışkanlığımız var.

sync; echo 3 > /proc/sys/vm/drop_caches

Kodu çalıştırdığımda çok miktarda RAM boşaltmak gibi görünüyor, ama gerçekten bunu yapmak zorundayım. Boş RAM kaybı yok mu?


81
2018-05-20 03:12


Menşei


Bunu yapan kişiyi bulun ve neden yaptığını ona sorun. Doğru tahmin ettiğiniz gibi, bunun için iyi bir sebep yok. - Michael Hampton♦
Çekirdeğin hata ayıklanması. Bu konuda. Bu aslında herhangi bir RAM'i boşaltmaz; Adından da anlaşılacağı gibi önbellekleri düşürür ve böylece performansı azaltır. - Michael Hampton♦
@ivcode Ardından, sorunu neden olan durumlardan kaçınmak yerine, bu sunucuyla ilgili sorunu bulup düzeltmeniz gerekir. Aracım her zaman keskin bir sağa dönüş yaptığında durduysa, keskin sağa dönüşlerden kaçınmak berbat bir çözümdür. - David Schwartz
İlgili thedailywtf.com/Articles/Modern-Memory-Management.aspx Kesinlikle tartışmak kötü bir fikir. - Drunix
İlgili ve "problem" in yararlı bir açıklaması: linuxatemyram.com - Bill Weiss


Cevaplar:


% 100 doğru sizsiniz. Bu değil RAM'i boşaltmak için iyi bir uygulama. Bu muhtemelen kargo kült sistemi yönetiminin bir örneğidir.


85
2018-05-20 04:59



Kargo Cult Sistem Yönetiminden bahsetmek için +1. Bu terimi bilmeyen herhangi bir sysadmin ve bunun anlamı ne yapılmalı. - Tonny
@Tonny: Sysadmin departmanı olmadan bırakılırdık o zaman :( - PlasmaHH
İnsanlığın çoğu gibi ben de pek çok onay ile birlikte gerginlik iddialarını severim, ama bir alıntı ya da akıl yürütmeme benim süperego'mdan +1 kazanırdı. - Aaron Hall
Aklınıza takılmamışsanız kargo kült yönetimini ve yukarıda belirtilenleri açıklayın. Belki bir takip düzenlemesinde? Hâlâ +1'imi saklıyorum ...: P - Aaron Hall
“Uygulamanızın bu RAM'i kullanmasa da, ancak Linux belleğe agresif bir şekilde önbelleğe alması ve uygulamanın belleğe ihtiyacı olsa da, bu önbelleklerin bir kısmını serbest bırakmayacağı, ancak takas yapmaya başlayacağı” şeklinde yorumlanabilir. Çok spesifik değil. Pratikte, bellek yönetimi mükemmel değildir ve bu kusurun ortaya çıkması için bir topuzun olması iyi bir şeydir. - Dan Pritts


Evet, önbelleği temizlemeniz RAM'i boşaltacaktır, ancak çekirdeğin önbellekten ziyade diskteki dosyaları aramasına neden olarak performans sorunlarına neden olabilir.

Normalde çekirdek kullanılabilir RAM tükendiğinde önbelleği temizler. Sık sık kirli içeriği pdflush kullanarak diske yazar.


62
2018-05-20 06:26



Açıklamak için +1 niye ya Bu kötü bir fikir. - Ogre Psalm33


Önbellekleri bunun gibi bırakmanın nedeni disk performansını karşılaştırmaktır ve var olmasının tek sebebidir.

G / Ç yoğun bir kıyaslama çalıştırırken, çalıştığınız çeşitli ayarların aslında disk G / Ç'sini yaptığından emin olmak istersiniz, bu nedenle Linux tam bir yeniden başlatma yapmak yerine önbellekleri bırakmanıza izin verir.

Alıntı yapmak belgeleme:

Bu dosya, çeşitli çekirdeğin büyümesini kontrol etmek için bir araç değildir.   önbellek (inode, dişçilik, pagecache, vs ...) Bu nesneler   bellek başka yerde gerekli olduğunda otomatik olarak çekirdeği tarafından geri   sistemde.

Bu dosyanın kullanılması performans sorunlarına neden olabilir. O attı çünkü   önbelleğe alınmış nesneler, önemli miktarda I / O ve CPU'ya mal olabilir.   Düşen nesneleri, özellikle de ağır kullanımdaysa yeniden oluşturun.   Bu nedenle, bir sınama veya hata ayıklama ortamı dışında kullanmak   tavsiye edilmez.


34
2018-05-20 13:51



Elbette, ne yapmaya çalıştığınıza bağlı olarak, tam bir yeniden başlatma bile disk önbelleğini yeterince temizleyemeyebilir. - α CVn
"Bu nesneler, belleğe ihtiyaç duyulduğunda çekirdek tarafından otomatik olarak geri alınır" tasarım hedefidir ancak her zaman gerçek davranış olmayabilir. - Dan Pritts
@DanPritts Tam olarak ne olduğunu düşünmemenizi sağlıyor? - Joe
Açık olan durum, daha fazla (non-trildilamaz) devasa sayfaların dağıtılmasına izin vermek için RAM'i temizlemek istediğinizde; Başka bir dava şeffaf devasa çöp toplama tahsilatı hatalarıdır (bu sorunun cevabını / yorumlarına bakın). Ama benim yorumum genel durum için tasarlandı. Bazen sistemi kullanan insanlar, onu tasarlayan / uygulayan insanlardan daha iyi bilirler. Çoğu zaman, değil - bu onların yorumlarına karşı koruma sağlamaya çalışıyor. Sadece bu sevindim - Dan Pritts


Buradaki temel fikir muhtemelen o kadar da kötü değil (sadece çok saf ve yanıltıcı): Önbelleğe alınan, yakın gelecekte erişilemeyen, örneğin günlük dosyaları olan dosyalar olabilir. Bu "yemek" ram, daha sonra OS tarafından bir veya başka şekilde gerektiğinde serbest bırakılması gerekir.

Takas ayarlarınıza, dosya erişim düzenine, bellek ayırma düzenine ve çok daha fazla tahmin edilemeyen şeylere bağlı olarak, bu önbellekleri silmediğinizde, daha sonra yeniden kullanılmaya zorlanacaklar, bu da daha az zaman alır. belleği kullanılmayan bellek havuzundan ayırmak. En kötü durumda, linux'un swappiness ayarları program belleğinin değiştirilmesine neden olur, çünkü linux, bu dosyaların program belleğinden daha yakın bir gelecekte kullanılmasının daha muhtemel olduğunu düşünür.

Benim ortamımda, linux oldukça sık yanlış tahmin ediyor ve çoğu Avrupa borsa borsalarının (saat 09.00 civarında) başlangıcında, sunucular günde bir kez yapmaları gereken şeyleri yapmaya başlayacaklar, daha önce yazıldığından dolayı hafızada yer değiştirmeye ihtiyaç duyuyorlardı. günlük dosyaları, onları sıkıştırmak, kopyalamak vb. önbellekleri, şeylerin değiştirileceği noktaya kadar doldurmaktaydı.

Ama bu problemin çözümünü önbelleğe aldırıyor mu? kesinlikle değil. Buradaki çözüm, Linux'un bilmediği şeyleri anlatmaktır: bu dosyaların artık kullanılmayacağı. Bu gibi şeyler kullanarak yazma uygulaması tarafından yapılabilir posix_fadvise()veya gibi bir cmd satır aracı kullanarak vmtouch (ayrıca önbellek dosyaları gibi şeylere bakmak için de kullanılabilir).

Bu şekilde, artık gerekli olmayan verileri önbelleklerden kaldırabilir ve önbelleğe alınması gerekenleri saklayabilirsiniz, çünkü tüm önbellekleri düşürdüğünüzde, bir çok şeyin diskten yeniden okunması gerekir. Ve mümkün olan en kötü zamanda: gerektiğinde; uygulamanızda fark edilir ve genellikle kabul edilemez gecikmelere neden olur.

Yerine koymanız gereken şey, bellek kullanım kalıplarınızı (ör., Bir şey değişiyorsa) izleyen ve buna göre analiz eden ve buna göre hareket eden bir sistemdir. Çözüm, vtouch kullanarak günün sonunda bazı büyük dosyaları tahliye etmek olabilir; Ayrıca sunucunun günlük tepe kullanımı sadece bu olduğundan daha fazla ram eklemek olabilir.


25
2018-05-20 19:46



Sunucumdaki tüm uygulamalar nohup'ta çalışıyor. Belki de nohup.out önbellekte saklanıyor ve hafıza yiyor mu? - ivcode
@ivcode: Bu bir sebep olabilir, nohup.out'un ne kadar büyük olduğunu kontrol edin. Belki de ne kadarının önbelleğe alındığını bulmak için vmtouch kullanın. - PlasmaHH
Bir cron işim var cat /dev/null > path/nohup.out nohup.out her 15 dakikada bir hızla büyüyor. Belki linux temizliyor olsam bile nohup.out'u önbelleğe alır. - ivcode
@ivcode Eğer çıktıya ihtiyacınız yoksa nohup onu yeniden yönlendirmelisin /dev/null. Sistemlerinizde bir noktada çalışan çok tecrübesiz bir sysadmin vardı gibi geliyor. Görmek stackoverflow.com/questions/10408816/... nasıl yönlendirilir nohupçıktı /dev/null - David Wilkins
nohup.out 15 dakikalık aralıklarla temizlense de, uygulamalar bir sebepten ötürü öldürülürse, nohup.out otomatik olarak başka bir komut dosyasından yedeklenir. Vmtouch'u denedim. gerçekten çok iyi bir araç - ivcode


Bir sürü sanal makineyi çalıştırırken faydalı olabilecek önbellekleri gördüm. Veya bazı veritabanı sunucuları gibi Büyük Sayfaları kullanan başka herhangi bir şey.

Linux'taki Büyük Sayfalar, bir sayfaya yerleştirmek için 2MB bitişik fiziksel RAM bulması için genellikle RAM'i birleştirmek zorundadır. Tüm dosya önbelleğini serbest bırakmak bu işlemi çok kolaylaştırır.

Ama diğer cevapların çoğuna katılıyorum, çünkü her gece dosya önbelleğini bırakmak için genelde iyi bir sebep yok.


16
2018-05-22 00:47



İkinci dereceden önyargıyı işaret ettiğim için ayrıldım, önbellek düşürme yanıtları. - Noah Spurrier
Ayrıca, yüksek bellek düğümlerindeki (1Tb) HPC uygulamalarında, birkaç büyük dosyada okuma, büyük miktarda önbelleğe alınabilir. Birçok HPC uygulamasının yüzlerce GB malloc ürettiği için, sistem önbelleklenmiş bellek "kenarlık" a ulaştığında, geçiş işlemleri NUMA düğümleri boyunca sorunsuz bir şekilde parçalanmış küçük parça parçalarını hareket ettirirken, saatlerce duraklayabilir. Daha da kötüsü, kullanıcı arayüzünde hiçbir şey yapmadan önbellekleri serbest bırakmayacaksınız. Bu sistem, tüm 2MB'lık blokları tahsis etmesine izin veriyor. - user1649948
+1 Büyük sayfalar oluşturma komutu (sysctl -w vm.nr_hugepages=...Önbellekleri düşürdüğüm sürece (Arch linux)) çalışmayı bile reddeder. - Aleksandr Dubinsky


Bu sorunu, aslında problemi bulmak için beceri veya deneyime sahip kimse olmadığında sistemi stabilize etmenin bir yolu olarak kurulmuş olabilir.

Kaynakları serbest bırakmak

Önbelleklerin düşürülmesi, bazı kaynakları serbest bırakacaktır, ancak bu, sistemin gerçekten yapmaya çalıştığı şeyi yapmak için daha fazla çalışmasını sağlamanın bir yan etkisine sahiptir. Sistem değişiyorsa (disk takas bölümünden okuma ve yazma işlemi gerçekte olduğundan daha hızlıdır) önbelleklerin periyodik olarak düşürülmesi kolaylaşır. semptomama tedavi etmek için hiçbir şey yapmaz sebeb olmak.

Hafıza ne yiyor?

Önbelleklerin çalışmasını engelleyen çok fazla bellek tüketimine neden olan şeyi belirlemelisiniz. Bu, herhangi bir sayıda kötü yapılandırılmış veya yalnızca yanlış kullanılmayan sunucu işlemlerinden kaynaklanabilir. Örneğin, bir sunucuda bir Magento web sitesi 15 dakikalık bir aralık içinde belirli sayıda ziyaretçi ulaştığında maksimum bellek kullanımına tanık oldum. Bu, Apache'nin çok fazla işlemin eşzamanlı olarak çalışmasına izin verecek şekilde yapılandırılmasına neden oldu. Çok fazla işlem kullanan, çok fazla bellek kullanan (Magento bazen bir canavardır) = değiş tokuş.

Alt çizgi

Sadece bunun gerekli bir şey olduğunu düşünmeyin. Neden orada olduğunu bulmakta proaktif olun, başkalarının yanlış olduğunu öne sürerse onu devre dışı bırakmaya cesaret edin ve sistemi gözlemleyin - gerçek sorunun ne olduğunu öğrenin ve düzeltin.


8
2018-05-20 15:16





Linux / m68k gerçekte kswapd'ın çıldırmasına ve% 100 CPU'yu tüketmesine neden olan bir çekirdek hatasına sahiptir (bir Debian ikili paket autobuilder gibi başka bir CPU'ya bağlı görev varsa -% 50 çalışan) - zamanın her zaman değil, her birkaç saatte bu özel komutu çalıştırarak azaltılabilir.

Bu söyleniyor ... sunucunuz büyük olasılıkla bir m68k değil (Atari, Amiga, Klasik Macintosh, VME, Q40 / Q60, Sun3) sistemi ;-)

Bu durumda, çizgiye giren kişi ya bazı tartışmalı ya da en iyi ihtimalle güncel olmayan tavsiyeleri izledi ya da RAM'in nasıl kullanılmasının gerektiği hakkında fikre sahip oldu (modern düşünce aslında “boş RAM'in RAM israfı” der ve önbelleğe almayı önerir) ya da bu “düzeltmeler” in [başka bir yerde] başka bir sorun olduğunu (ve doğru bir düzeltmeyi aramak için çok tembeldiğini) “keşfetti”.


4
2018-05-21 08:03



"kswapd'ın çıldırmasına neden olan bir çekirdek hatası" - Hangi hata bu? - Ben
@Ben gör bu konu (bu mesaj ve bir çift takip, bunlardan biri nereden gelebileceğine dair bir tahminde bulunur) - mirabilos
Benzer bir sorunu yaşıyorum (x86_64 olmasına rağmen) ve şu anda tek çözüm önbellekleri bırakmaktır serverfault.com/questions/740790/... - Fernando
@Fernando M68k kutusunda da bir “drop caches” cronjob var - mirabilos


Bir neden, sitenin bir tür izleme çalışması yürütmesi, serbest ram miktarını kontrol etmesi ve serbest ram belirli bir yüzde altına düştüğü zaman yöneticilere uyarı gönderilmesi olabilir. Eğer bu izleme aracı, ücretsiz ram hesaplamasına önbellek eklenmemesi için yeterli değilse, yanlış uyarılar gönderebilir; önbelleği düzenli olarak boşaltırken, bu uyarıları bastırıp, aracın "gerçek" ram alçaldığında farkına varmasına izin verebilir.

Elbette, bu tür bir durumda, asıl çözüm, izleme aracını ücretsiz ram hesaplamasında önbellek içerecek şekilde değiştirmektir; önbelleği temizlemek yalnızca bir geçici çözüm ve kötü bir şeydir, çünkü işlemler diske eriştiğinde önbellek hızlı bir şekilde yeniden dolduracaktır.

Benim varsayımım doğru olsa bile, önbellek temizliği mantıklı olmayan bir şey değildir, birincil sorunu çözmek için yetkin olmayan bir kişi tarafından bir çözümdür.


3
2018-05-21 06:20





Bunu bir gece cron işinde yapmak için makul bir sebep düşünebilirim.

Büyük bir sistemde, bellek parçalanmayı kaldırabilmeniz için önbellekleri periyodik olarak düşürmek yararlı olabilir.

Kernel şeffaf büyük sayfa desteği, küçük sayfaları büyük sayfalara birleştirmek için periyodik bir bellek taraması yapar. Dejenere koşullar altında bu, bir veya iki dakikadaki sistem duraklamaları ile sonuçlanabilir (bununla ilgili deneyimim RHEL6'deydi; umarız iyileşti). Damlama önbellekleri, büyük sayfalık süpürücünün çalışacak bir odaya sahip olmasına izin verebilir.

Saydam büyük sayfaları devre dışı bırakmanın iyi bir nedeni olduğunu iddia edebilirsiniz; OTOH şeffaf büyük sayfalardan genel performans iyileştirmeye değer olduğuna inanıyor olabilir ve günde bir kez önbellekleri kaybetme fiyatı ödemek için değer.


Bir cron işinde olmasa da, bunu yapmak isteyeceğiniz başka bir sebep düşündüm. Sanallaştırma sisteminin hemen öncesinde bir VM'yi yeni donanıma geçirmesi bunun için çok iyi bir zaman olacaktır. Yeni ana bilgisayara kopyalanacak daha az hafıza içeriği. Sonunda, depodan okumak zorunda kalacaksın, elbette, ama muhtemelen bu tradeoffu alacağım.

Gerçekten yazılımlardan herhangi birinin bunu yapıp yapmadığını bilmiyorum.


3
2018-01-14 15:43



Bunun için bir kaynağın var mı? Bu böyle bir sorun varsa, çekirdeğe sabitlenmesi gereken bir şey gibi geliyor. - gparent
Şeffaf büyük sayfalarla duraklamalarla kişisel deneyimim var. RHEL6, Dell R810, 4CPU'lar, 64 GB RAM. Şeffaf büyük sayfaları devre dışı bırakmak (bunu yapmak için bir / proc dosyası var) duraklamaları hemen düzeltin. O zaman önbellek bırakma tekniğini denemedim; bunun yerine, java uygulamalarımızı saydam olmayan büyük sayfaları ve sol şeffaf devasa sayfaları devre dışı bırakmak için yeniden yapılandırdım. IIRC, etkilenen tek insan olmadığımızı ve Red Hat'ın bu konuyu bildiğinin farkına varacak kadar durumu inceledik. - Dan Pritts
Merhaba Dan, aynı davranışı sunucumda kabul ediyorum. Çok büyük miktarda veriyle çalışıyorum ve aynı python programının (ilk hesaplama zamanının x2-3'ü) 10'dan fazla hesaplaması sonrasında büyük bir performans düşüyor. Bir göz atabilirsem, bellek önbellek boyutu çok büyük, 100 + GB. Ve bu bellek önbelleğini temizler ve programımı yeniden çalıştırırsam, ilk hesaplama zamanımı geri alırım. Bu fenomeni paylaşmak için herhangi bir belge veya bilgi var mı? Teşekkür ederim. - Axel Borja
access.redhat.com/solutions/46111 açıklar. Durumunuzda sorun olup olmadığını görmek için şeffaf büyük sayfaları devre dışı bırakabilirsiniz. - Dan Pritts