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 fazla RAM boşalmış gibi görünüyor, ancak gerçekten yapmam gerekiyor mu? Ücretsiz RAM boşa gitmiyor mu?
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 fazla RAM boşalmış gibi görünüyor, ancak gerçekten yapmam gerekiyor mu? Ücretsiz RAM boşa gitmiyor mu?
Yanıtlar:
% 100 haklısın. Öyle değil RAM boşaltmak için iyi bir uygulama. Bu muhtemelen bir kargo kült sistemi yönetimine bir örnektir.
Evet, önbelleği temizlemek RAM'i boşaltacaktır, ancak çekirdeğin önbellek yerine diskte dosya aramasına neden olur ve bu da performans sorunlarına neden olabilir.
Normalde, kullanılabilir RAM tükendiğinde çekirdek önbelleği temizler. Kirli içeriği pdflush kullanarak diske sık sık yazar.
Bu tür önbellekleri düşürmenin nedeni disk performansını ölçmek içindir ve bunun tek nedeni budur.
Yoğun bir G / Ç kıyaslaması yaparken, denediğiniz çeşitli ayarların aslında disk G / Ç işlemi yaptığından emin olmak istersiniz; bu nedenle Linux, önyükleme yapmak yerine önbellekleri bırakmanıza izin verir.
Dan alıntı belgeler :
Bu dosya, çeşitli çekirdek önbelleklerinin büyümesini kontrol etmek için bir araç değildir (inode, diş macunu, pagecache vb.) Bu nesneler, sistemin başka bir yerinde belleğe ihtiyaç duyulduğunda, çekirdek tarafından otomatik olarak geri kazanılır.
Bu dosyanın kullanımı performans sorunlarına neden olabilir. Önbelleğe alınmış nesneleri attığı için, özellikle yoğun kullanımda olsalar, bırakılan nesneleri yeniden oluşturmak için önemli miktarda G / Ç ve CPU'ya mal olabilir. Bu nedenle, test etme veya hata ayıklama ortamı dışında kullanılması önerilmez.
Buradaki temel fikir muhtemelen o kadar da kötü değil (sadece çok saf ve yanıltıcı): Önbelleğe alınmış, yakın bir gelecekte erişilebilecek gibi görünmeyen dosyalar olabilir, örneğin günlük dosyaları. Bu “yemek” koçu, daha sonra işletim sistemi tarafından gerektiğinde bir şekilde veya başka bir şekilde serbest bırakılması gerekecek.
Değişim ayarlarınıza, dosya erişim düzeninize, bellek ayırma düzeninize ve daha pek çok tahmin edilemeyeceğiniz şeylere bağlı olarak, bu önbellekleri serbest bırakmadığınızda, daha sonra tekrar kullanılmaya zorlanacakları anlaşılabilir. kullanılmayan hafıza havuzundan hafıza ayırma. En kötü durumda, linux'un takas ayarları program belleğinin değiştirilmesine neden olacaktır, çünkü linux bu dosyaların program belleğinden daha yakın bir zamanda kullanılabileceğini düşünüyor.
Benim çevremde, linux oldukça sık yanlış tahmin ediyor ve çoğu Avrupa borsalarının başında (yaklaşık 0900 yerel saate kadar) sunucular, günde yalnızca bir kez yaptıkları şeyleri yapmaya başlayacaklar; kütük dosyaları, bunları sıkıştırmak, kopyalamak vb. şeylerin değiştirilmesi gereken noktaya önbellek dolduruyordu.
Ancak bırakma, bu sorunun çözümünü önlüyor mu? kesinlikle değil. Buradaki çözüm, linux'a bilmediklerini söylemektir: bu dosyaların artık kullanılmayacağını. Bu, yazma gibi posix_fadvise()
bir şey kullanarak veya bir cmd satırı aracı kullanarak vmtouch
(önbellek dosyalarının yanı sıra nesnelere bakmak için de kullanılabilir) kullanılarak yazma uygulaması ile yapılabilir .
Bu şekilde, artık gerekmeyen verileri önbellekten kaldırabilir ve önbelleğe alınması gerekenleri saklayabilirsiniz, çünkü tüm önbellekleri bıraktığınızda, diskten çok fazla şey okunması gerekir. Ve bu mümkün olan en kötü anda: gerektiğinde; Uygulamanızda fark edilir ve genellikle kabul edilemez olan gecikmelere neden olabilir.
Yapmanız gereken şey, bellek kullanım düzenlerinizi izleyen (örneğin, bir şey değişiyorsa) ve ardından buna göre analiz eden ve buna göre davranan bir sistemdir. Çözüm, vtouch kullanarak günün sonunda bazı büyük dosyaları çıkarmak olabilir; Sunucunun günlük yoğun kullanımı tam da bu olduğundan daha fazla ram eklemek de olabilir.
cat /dev/null > path/nohup.out
Nohup.out hızla büyüdükçe her 15 dakikada bir cron işim var . Belki linux temizlememe rağmen nohup.out'u önbelleğe alıyordur
nohup
yoksa, yeniden yönlendirmeniz gerekir /dev/null
. Bir noktada sistemlerinizde çalışan çok deneyimsiz bazı sistem yöneticileriniz var gibi gözüküyor. Bkz stackoverflow.com/questions/10408816/... yönlendirmek için nasıl nohup
'ın çıkış için/dev/null
Bir sürü sanal makineyi başlatırken yararlı olacak önbellekleri gördüm. Veya bazı veritabanı sunucuları gibi Büyük Sayfaları kullanan herhangi bir şey.
Linux'taki Büyük Sayfalar, bir sayfaya koymak için 2 MB bitişik fiziksel RAM bulmak için RAM'i birleştirmek zorundadır. Tüm dosya önbelleğini boşaltmak bu işlemi çok kolaylaştırır.
Ancak diğer cevapların çoğuna katılıyorum, çünkü her gece dosya önbelleğini bırakmak için genellikle iyi bir neden yoktur.
sysctl -w vm.nr_hugepages=...
) komutu, ilk önbellekleri bırakmadığım sürece bile çalışmayı reddediyor (Arch linux).
Bunun sorunu çözecek beceri veya deneyime sahip hiç kimsenin olmadığı durumlarda sistemi dengelemenin bir yolu olarak kullanılması mümkündür.
Bırakma önbellekleri temel olarak bazı kaynakları serbest bırakacaktır, ancak bunun, sistemin gerçekten yapmaya çalıştığı şeyi yapmak için daha çok çalışmasını sağlama yan etkisi var. Sistem değişiyorsa (disk takma bölümünden gerçekten daha hızlı bir şekilde okumaya ve yazmaya çalışarak), önbellekleri düzenli aralıklarla bırakmak, semptomları hafifletebilir , ancak nedeni düzeltmek için hiçbir şey yapmaz .
Düşen önbelleklerin işe yaradığını gösteren çok fazla hafıza tüketimine neyin neden olduğunu belirlemelisiniz. Bu, kötü yapılandırılmış herhangi bir sayıda veya yanlış kullanılan sunucu işlemlerinden kaynaklanabilir. Örneğin, bir sunucuda bir Magento web sitesi 15 dakikalık bir süre içinde belirli sayıda ziyaretçiye ulaştığında en fazla bellek kullanımına tanık oldum. Bu, Apache'nin aynı anda çok fazla işlemin çalışmasına izin verecek şekilde yapılandırılmasından kaynaklandı. Çok fazla bellek kullanarak çok fazla işlem (Magento bazen bir canavardır) = değiş tokuş.
Sadece gerekli bir şey olduğunu varsaymayın. Neden orada olduğunu bulma konusunda proaktif olun, diğerleri yanlış olduğunu söylerse onu etkisiz hale getirme cesaretini alın ve sistemi gözlemleyin - asıl sorunun ne olduğunu öğrenin ve düzeltin.
Linux / m68k aslında kswapd'ın çılgına dönmesine ve% 100 CPU (% 100 başka CPU işlemine bağlı bir işlem varsa,% 50 gibi), Debian ikili paket autobuilder - vulgo buildd - çalışıyor gibi) çağırabilen bir çekirdek böceğine sahiptir (çoğu zaman zaman; her zaman değil) bu komutu çalıştırarak her birkaç saatte bir azaltılabilir.
Söyleniyor… sunucunuz bir m68k değil (Atari, Amiga, Klasik Macintosh, VME, Q40 / Q60, Sun3) sistemi ;-)
Bu durumda, satırları sıraya koyan kişi ya biraz sorgulanabilir ya da en iyi ihtimalle modası geçmiş bir tavsiyede bulundu ya da RAM'in nasıl yanlış kullanılması gerektiği konusunda fikir sahibi oldu (modern düşünce gerçekten de “serbest RAM RAM israfı” diyor ve önbelleklemeyi öneriyor) , veya “başka bir problemin başka bir sorunu“ çözdüğünü ”(“ uygun bir çözüm bulmak için çok tembeldi ”) keşfetti.
Bunun bir nedeni, site, serbest ram miktarını kontrol eden ve serbest ram belirli bir yüzdesinin altına düştüğünde yöneticilere bir uyarı gönderen bir tür izleme çalıştırması olabilir. Bu izleme aracı serbest ram hesaplamasına önbellek eklenmeyecek kadar aptalsa, yanlış uyarılar gönderebilir; Önbelleğin düzenli olarak boşaltılması bu uyarıları bastırabilirken, aynı zamanda aletin "gerçek" tokmak ne zaman azaldığını fark etmesini sağlar.
Tabii ki, bu tür durumlarda, gerçek çözüm izleme aracını serbest ram hesaplamasına önbellek içerecek şekilde değiştirmek; önbelleğin temizlenmesi yalnızca bir geçici çözüm ve aynı zamanda kötü bir durumdur, çünkü işlemler diske eriştiğinde önbellek hızla dolar.
Bu yüzden benim varsayım doğruysa bile, önbellek temizliği mantıklı bir şey değil, daha çok birincil sorunu çözecek kadar yetkin olmayan bir kişi için geçici bir çözüm.
Her gece bir cron işinde bunu yapmak için makul bir neden düşünebilirim.
Büyük bir sistemde, düzenli aralıklarla önbellekleri düşürmek yararlı olabilir, böylece bellek parçalanmasını kaldırabilirsiniz.
Çekirdek saydam hugepage desteği, küçük sayfaları hugping'lerde birleştirmek için düzenli aralıklarla bellek taraması yapar. Dejenere koşullar altında bu, bir iki dakika kadar sistem duraklamalarına neden olabilir (bununla ilgili deneyimim RHEL6'daydı; umarım geliştirilmiştir). Bırakma önbellekleri, sarmal sayfası süpürücüsünün çalışacak bazı odalarının olmasına izin verebilir.
Bunun, şeffaf sargıları devre dışı bırakmak için iyi bir neden olduğunu iddia edebilirsiniz; OTOH, şeffaf sarf malzemelerinin genel performans geliştirmesinin, önbelleklerinizi günde bir kez kaybetmenin bedelini ödemeye ve değer vermeye değer olduğuna inanabilirsiniz.
Bir cron işinde olmasa da, yapmak istemeniz için başka bir neden düşündüm. Sanallaştırma sistemi bir VM'yi yeni donanıma geçirmeden hemen önce bunun için çok iyi bir zaman olurdu. Yeni ana bilgisayara kopyalamak için daha az bellek içeriği. Sonunda tabii ki, depodan okumak zorunda kalacaksınız, ama muhtemelen bu tradeoffu alırdım.
Gerçekten herhangi bir yazılımın bunu gerçekten yapıp yapmadığını bilmiyorum.
Sadece iki kuruş eklemek için: Sistem bu hafıza sayfalarının önbellek olduğunu çok iyi biliyor ve bir uygulama hafıza istediğinde istediği kadar düşecek.
/proc/sys/vm/swappiness
Yeni bir bellek tahsisi sırasında çekirdeğe bellek önbelleklerini bırakmayı veya "boşta" ayrılmış bellek sayfalarını değiştirmeyi tercih etmelerini söyleyen ilgili bir ayardır .
Soru 2014'ten itibaren, ancak sorun şu ana kadar bazı gizli centos 6.8 arka uçlarında mevcut olduğu için, yine de birisi için yararlı olabilir.
https://github.com/zfsonlinux/zfs/issues/1548 , zfs ile ilgili bir sorunu anlatıyor. Orada, disk alanı silinmiş dosyalar için boş bırakılmaz, çünkü eğer nfs kullanılırsa, dosyanın inode'ları çekirdeğin inode önbelleğinden çıkarılmaz.
Böcek parçasından alıntı yapmak için, 6 Ocak 2015 behlendorf yazdı:
Mevcut spekülasyon, bir nedenden dolayı NFS sunucusunun dosya tanıtıcısının önbelleğe alınmış bir versiyonunu tutuyor olmasıdır. NFS sunucusu bu dosyadan çıkana kadar ZFS bu dosyanın bağlantısını kaldıramaz. Bazı ışık testleri, sunucudaki bırakma önbelleklerinin, bu referansın, alanın doğru bir şekilde serbest bırakıldığı noktada bırakılmasına (NFS dosya tanıtıcısı gibi) neden olacağını göstermiştir. Bellek basıncı da düşmesine neden olabilir.
yani, her gece yankı 3> / proc / sys / vm / drop_caches, zfs'nizi yeniden yapılandırmak için bir zamanınız kalmasını istemiyorsanız, bu hata için en kolay çözümdür.
Bu yüzden belki kargo kültü idare etmiyor olabilir, ancak bazı iyi hata ayıklama sebepleriydi.
Bu, tipik olarak her bir CPU'nun (soketin) tüm belleğe şeffaf bir şekilde erişebildiği, ancak kendi belleğine, paralel HPC uygulamalarıyla bağlantılı olarak diğer soketin belleğinden daha hızlı bir şekilde erişilebildiği NUMA (düzgün olmayan bellek erişimi) sistemlerinde anlamlı olabilir.
Birçok basit paralel uygulama, tek bir işlemden dosya G / Ç yapma eğilimindedir, bu nedenle çıkışta disk önbelleğine ayrılan tek bir NUMA düğümü üzerinde büyük bir bellek bölümü bırakılırken, diğer NUMA düğümü üzerinde bellek çoğunlukla serbest olabilir. Bu durumlarda, bildiğim kadarıyla, Linux çekirdeğindeki önbellek geri alma işlemi hala NUMA farkında olmadığından, önbellek için ayrılmış belleği olan NUMA düğümünde çalışan işlemler diğer NUMA düğümüne bellek ayırmak zorunda kalır. diğer düğümde boş RAM olduğu sürece, performansları öldürür.
Ancak, bir HPC sisteminde, cron ile belirli bir zamanda değil, yeni bir kullanıcı işine başlamadan önce önbelleği temizlemek daha akıllıca olacaktır.
Paralel olmayan uygulamalar için bu sorunun ortaya çıkması muhtemel değildir.
Sayfa önbelleğiniz oldukça büyük olduğunda (geçerli takas kullanımınızdan çok daha büyük) ve takas ve takas işlemleri sırayla gerçekleşir, bu, önbellekleri bırakmanız gereken zamandır. Ubuntu 16.04LTS çalıştıran MariaDB veritabanı sunucularımdan birinde bellek kullanımının arttığı, Linux ise kullanılmayan sayfa önbelleklerini kaldırmak yerine takas kullanımını arttırmayı seçti. TokuDB devre dışı bırakılmasını gerektirdiği için şeffaf sarmallar sistemimde zaten devre dışı bırakıldı. Her neyse, belki bir hata değil, ama linux hala bu davranışı yapmak benim için oldukça kafa karıştırıcı. Çeşitli kaynaklar, Linux'un uygulama istediğinde sayfa önbelleğini kaldıracağını belirtti:
Ancak gerçek bu kadar basit değil. Geçici çözüm ya:
Örnek dd çalışması:
dd if=/var/log/apache2/access_log.1 iflag=nocache count=0
Örnek python-fadvise:
pyadvise -d /var/log/apache2/access_log.1
PAE çekirdeğinde 16GB RAM çalışan bir masaüstü makinem var. Bir ya da iki saat sonra disk performansı, önbellekleri bırakana kadar çarpıcı bir şekilde düşer, bu yüzden basitçe cron'a koyarım. Bunun PAE çekirdeği ile mi yoksa önbellek uygulamasının çok fazla bellek varsa yavaş kalmasıyla ilgili bir sorun mu olduğunu bilmiyorum.