Linux'ta tampon önbellek boyutunu sınırla


25

Linux çekirdeğine arabellek önbelleği için yalnızca belirli bir bellek yüzdesini kullanmasını söylemenin bir yolu var mı? /proc/sys/vm/drop_cachesÖnbelleği geçici olarak temizlemek için kullanılabileceğini biliyorum , ancak ana belleğin% 50'sinden fazlasına büyümesini önleyen kalıcı bir ayar var mı?

Bunu yapmak istememin nedeni, sürekli diskten veri sunan ve tüm fiziksel belleği birkaç saat içinde tampon önbellek olarak kullanmayı başaran bir Ceph OSD çalıştıran sunucum olmasıdır. Aynı zamanda, büyük miktarda (birkaç 10 GB GB) fiziksel bellek tahsis edecek uygulamaları çalıştırmam gerekiyor. Popüler inanışın tersine (tampon önbellekle ilgili hemen hemen tüm sorulara verilen tavsiyelere bakın), temiz önbellek girişlerini atmak suretiyle belleği serbest bırakmak otomatik değildir : başvurumu başlatmak, arabellek önbelleği dolduğunda bir dakika kadar sürebilir ( *), önbelleği temizledikten sonra (kullanarak echo 3 > /proc/sys/vm/drop_caches) aynı uygulama neredeyse anında başlar.

(*) Uygulama başlangıç ​​dakikası boyunca, uygulama yeni bellekte hata veriyor ancak Vtune'a göre çağrılan bir fonksiyonda zamanının% 100'ünü çekirdeğe harcıyor pageblock_pfn_to_page. Bu işlev, devasa sayfalar bulmak için gereken bellek sıkıştırma ile ilgili gibi görünüyor, bu da bana parçalanmanın sorun olduğuna inanmamı sağlıyor.


1
Önbellek katmanlama adı verilen bir şey var. ceph osd havuzu seti {cachepool} hit_set_count 1 ceph osd havuzu seti {cachepool} hit_set_period 3600 ceph osd havuzu seti {cachepool} target_max_bytes 1000000000000 örnek olarak bakın. docs.ceph.com/docs/master/rados/operations/cache-tiering
Michael D.

2
Bu sorun görünüşte yalnızca yoğun bellek kullanan uygulamaların başlatılmasını etkilediğinden, belki de uygulamaları başlatmadan önce önbelleği temizleyen bir komut dosyası ile uygulamaları başlatabilirsiniz. Belki de bu daha hızlı başlarken, önbellek yönetimini çalışırken çekirdeğe bırakırken.
Thawn

Yanıtlar:


14

Eğer mutlak bir sınır istemiyorsanız, ancak çekirdeği tamponları daha hızlı temizlemesi için çekirdeğe baskı uygulamak istiyorsanız, vm.vfs_cache_pressure

Bu değişken, çekirdeğin, VFS önbelleklerini önbellekte saklamak için kullanılan, pagecache ve takas alanını geri alma eğilimini kontrol eder. Bu değerin arttırılması, VFS önbelleklerinin geri kazanılma oranını arttırır.

0 ila 200 arasında değişir. Daha yüksek basınç için 200'e doğru hareket ettirin. Varsayılan ayar 100'dür slabtop. Komutu kullanarak bellek kullanımınızı da analiz edebilirsiniz . Senin durumunda, dentryve *_inode_cachedeğerler yüksek olmalıdır.

Mutlak bir sınır istiyorsanız, yukarı bakmalısınız cgroups. Ceph OSD sunucusunu bir cgroup içine yerleştirin ve cgroup için memory.limit_in_bytesparametre ayarlayarak kullanabileceği maksimum belleği sınırlayın.

memory.memsw.limit_in_bytesHafıza toplamı ve takas kullanımı için maksimum tutarı ayarlar. Birim belirtilmezse, değer bayt olarak yorumlanır. Bununla birlikte, daha büyük birimleri temsil etmek için sonekler kullanmak mümkündür - kilobayt için k veya K, Megabayt için m veya M ve Gigabayt için g veya G.

Referanslar:

[1] - GlusterFS Linux Çekirdek Ayarlama

[2] - RHEL 6 Kaynak Yönetimi Rehberi


1
Setli bir grup limit_in_bytesbunu yapıyor gibi görünüyor. Teşekkürler!
Wim

4
Ben vfs_cache_pressuresadece dişçi ve inode önbellekleri temizlediğini ve tampon önbellekle ilgisi olmadığını düşünüyorum.
kawing-chiu 5

Artan vfs_cache_pressureyukarıdaki 100durumda Mayıs yardım alıdığınız için yeterli RAM yok. RAM kullanımını azaltır, ancak genel olarak daha düşük G / Ç performansına neden olur.
Mikko Rantalainen

3

A% 'sini bilmiyorum ama, bir zaman limiti ayarlayabilirsiniz, böylece x dakika kadar sonra düşer.

Bir terminalde ilk

sync && echo 3 | sudo tee /proc/sys/vm/drop_caches

Geçerli önbellekleri temizlemek için.

Bir cron-job Alt-F2'ye basın, yazın gksudo gedit /etc/crontab, Sonra Bu satırı en alta ekleyin.

 */15 *    * * *   root    sync && echo 3 > /proc/sys/vm/drop_caches

Bu her 15 dakikada bir temizler. İlk parametreyi * / 15 yerine * veya * / 5 olarak değiştirerek gerçekten isterseniz 1 veya 5 dakika olarak ayarlayabilirsiniz.

Ücretsiz RAM'inizi görmek için önbellek hariç:

free -m | sed -n -e '3p' | grep -Po "\d+$

Burada biraz fazlalık hissediyorum. Bildiğim kadarıyla 3 > drop_caches,sync
andras.tim

1
@ andras.tim no - sync, kirli sayfaları diske, 3'ü drop_caches'a yazar, sadece temiz sayfalar ve diğer önbellekler tarafından kullanılan belleği geri alır / serbest bırakır. senkronizasyon çalıştırmak zorunda değilsin ama yaparsan, kirli yerine daha fazla hafıza temiz olacak ve önbellekleri bıraktığında daha fazla hafıza boşalacak
Daniel S. Sterling

2

Sanırım sorunuzun sonundaki önseziniz doğru yolda. A, NUMA uyumlu bellek ayırma işlemlerini CPU'lar arasında geçiren sayfalardan şüpheleniyordum ya da B, büyük olasılıkla, bitişik, hizalı bölgeler bulmaya çalışan şeffaf sarılmaların birleştirme kodundan.

Hem iş yüklerinde göze çarpan performans iyileştirmeleri hem de çok fazla fayda sağlamadan muazzam miktarda CPU zamanı tüketmekten sorumlu olan sarkaçlar ve saydam sarkaçlar belirlenmiştir.

Hangi çekirdeği çalıştırdığınızı, / proc / meminfo'nun içeriğini (veya en azından HugePages_ * değerlerinin.) Ve mümkünse, vtune profiler çağrı çizelgesinden daha fazla pageblock_pfn_to_page () işlevini bilmek yardımcı olacaktır.

Ayrıca, benim tahminime dayanmak istersen, hugepage dolandırmasını devre dışı bırakmayı dene:

echo 'never'> / sys / çekirdek / mm / transparent_hugepage / defrag

(çekirdeğinize bağlı olarak, bunun yerine olabilir :)

echo 'never'> / sys / çekirdek / mm / redhat_transparent_hugepage / defrag

Son olarak, bu uygulama yazdığınız bir şey ram konserler birçok onlarca kullanarak mı? Hangi dil?

"Bellek sayfalarında faylanma" terimini kullandığınızdan beri, işletim tasarımı ve sanal bellek konusunda yeterince bilgi sahibi olduğunuzu tahmin ediyorum. Neredeyse her zaman sınırlamaya çalıştığınız tampon önbellekten gelen, çok fazla G / Ç okumayıp o kadar agresif bir şekilde arızalanacak bir durum / uygulama öngörmek için mücadele ediyorum.

(Merak ediyorsanız, hangi sanal sayfaların eşlenmiş bir fiziksel sayfaya sahip olduğunu görmek için kullanılabilecek MAP_ANONYMOUS ve MAP_POPULATE ve mincore (2) gibi bayraklara bakın.)

İyi şanslar!


2

Ceph OSD ayrı bir işlem ise, işlem tarafından kullanılan kaynakları kontrol etmek için cgroups kullanabilirsiniz :

Bellek limiti olan group1 gibi bir cgroup oluşturun (örneğin 50GB, örneğin CPU gibi diğer limitler desteklenir, örneğin CPU da belirtilir):

cgcreate -g memory,cpu:group1

cgset -r memory.limit_in_bytes=$((50*1024*1024*1024)) group1

Ardından, uygulama zaten çalışıyorsa, uygulamayı bu gruba getirin:

cgclassify -g memory,cpu:group1 $(pidof your_app_name)

Veya uygulamanızı bu grup içinde yürütün:

cgexec -g memory,cpu:group1 your_app_name

0

ayarlı , kullanıma bağlı olarak sistem ayarlarını dinamik olarak ayarlayan dinamik bir uyarlamalı sistem ayar programıdır.

 $ man tuned

İlgili belgelere ve yapılandırma dosyalarına bakın.

 /etc/tuned
 /etc/tuned/*.conf
 /usr/share/doc/tuned-2.4.1
 /usr/share/doc/tuned-2.4.1/TIPS.txt

This parameter may be useful for you.

** Set flushing to once per 5 minutes
** echo "3000" > /proc/sys/vm/dirty_writeback_centisecs

İlave bilgi

Senkron komut tampon, yani güçler yazılmamış veri diske yazılacak ve bir her şeyin güvenle yazılı olduğu olmak istediği zaman kullanılabilir temizler. Geleneksel UNIX sistemlerinde, her 30 saniyede bir senkronizasyon yapan arka planda çalışan güncelleme adı verilen bir program vardır , bu nedenle genellikle senkronizasyon kullanmak gerekmez. Linux, bazen senkronizasyonun neden olduğu ağır disk G / Ç nedeniyle ani donmadan kaçınmak için daha sık rastlanan bir senkronizasyon yapan ek bir arka plan programı bdflush'a sahiptir .

Linux altında, bdflush güncelleme ile başlar. Genel olarak endişelenmek için bir neden yoktur, ancak bdflush bazı nedenlerden dolayı ölürse, çekirdek bu konuda uyarır ve el ile başlatmanız gerekir ( / sbin / update ).


1
Bu sadece kirli girişler için değil mi? Bunların sistemimde hepsi temiz olduğu için sorun olduğunu sanmıyorum - gecikme kirli sayfaları geri yazmak değil, temiz sayfaları kaldırarak kalan alanı birleştirmektir.
Wim

Evet, bu kirli sayfalar içindir, dinamik moda ayarlanmış olarak diğer performans sorunlarını da çözebileceğinizi düşünüyorum.
Ijaz Ahmad Khan

"Linux 2.6'dan beri [bdflush] sistem çağrısı kullanımdan kaldırıldı ve hiçbir şey yapmıyor. Gelecekteki bir çekirdek sürümünde tamamen ortadan kalkması muhtemel. Bugünlerde bdflush () tarafından gerçekleştirilen görev çekirdek pdflush iş parçacığı tarafından gerçekleştiriliyor." man7.org/linux/man-pages/man2/bdflush.2.html
sourcejedi
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.