Linux disk önbellekleme davranışını maksimum verim için ayarlama


12

Burada maksimum bir işlem sorunu yaşıyorum ve düğmelerimi ayarlamak için hangi tavsiyeye ihtiyacım var. Yedek dağıtım için 10Gbit dosya sunucusu çalıştırıyoruz. Bir LSI MegaRAID Denetleyicisi üzerinde iki diskli S-ATA2 kurulumu. Sunucu ayrıca 24gig bellek aldı.

Son yüklenen yedeklememizi maksimum verimle yansıtmamız gerekiyor.

"Sıcak" yedeklemelerimiz için RAID0 bize yaklaşık 260 MB / sn yazma ve 275 MB / sn okuma sağlar. 20 GB boyutunda test edilmiş bir tmpfs bize yaklaşık 1GB / sn sağlar. Bu tür bir verim ihtiyacımız.

Şimdi Linux'un sanal bellek alt sistemini en son yüklenen dosyaları diske yazmadan (veya daha da iyisi: diske yazmak ve bellekte tutmak) bellekte olabildiğince uzun süre önbelleğe almak için nasıl ayarlayabilirim?

Aşağıdaki sysctl'leri ayarladım, ancak bize beklediğimiz verimi vermiyorlar:

# VM pressure fixes
vm.swappiness = 20
vm.dirty_ratio = 70
vm.dirty_background_ratio = 30
vm.dirty_writeback_centisecs = 60000

Teorik olarak bu , G / Ç'yi önbelleğe almak için bize 16 GB vermeli ve diske yazılıncaya kadar birkaç dakika beklemelidir. Yine de sunucuyu karşılaştırdığımda yazma üzerinde hiçbir etki görmüyorum, verim artmıyor.

Yardım veya tavsiye gerekiyor.


En kısa zamanda yazmaya başlamak daha anlamlı olmaz mıydı? Aksi takdirde maksimum tampon boyutuna ulaşır ve aniden durur. Başından beri yazıyorsa, size daha fazla zaman verir.
Zan Lynx

Uygulamalarım (base linux + vsftpd) 4GB (toplam 24GB) altında kullandığından, yalnızca arabellekler için 20GB belleğim var. Yedeklemelerim 20 GB'nin altında. Yedekleme çalıştırdıktan sonra arabellek ve sonra sırayla diske yazılabilir, bu benim yedekleme kaynağımın (sanal sunucular) kesinti süresini önemli ölçüde azaltacaktır. Not: Sunucu daha sonra durdurulabilir, sorun değil. İyileşmesi için 30 dakika var :)
Peter Meyer

Verileri ağ üzerinden aktarmak için kullandığınız uygulama diske senkronize ediliyor gibi görünüyor. Bunu yapmak istemeyeceksiniz, böylece veriler sadece önbellekte oturabilir, ancak neden disklerin tutabildiğinden daha hızlı bir şekilde veri çoğaltmak istediğinizi soruyorum. Bu, bir yerde bir tasarım kusuruna işaret ediyor.
psusi

Kusur gibi görünüyor: yedekleme çözümünüz sunucunun sürekli kapatılmasını gerektirmemelidir.
psusi

1
@PeterMeyer: Çok fazla RAM'iniz olsa bile, yazmaların başlamasını beklemek hala bir hatadır. Herhangi bir anlam ifade eden tek zaman, dosyaları diske gelmeden önce (geçici bir dosya gibi) düzenleyecek veya silecek olmanızdır. Bir yedekleme bunu yapmaz. Arka plan yazma işlemlerine mümkün olan en kısa sürede başlamak istiyorsunuz. Background_ratio'nuzu 1 veya 2 olarak ayarlayın.
Zan Lynx

Yanıtlar:


6

Belirlediğiniz değişkenlere bakıldığında, çoğunlukla yazma performansı ile ilgilendiğiniz ve elektrik kesintilerinden kaynaklanan olası veri kayıplarını önemsemediğiniz anlaşılıyor.

Sadece tembel yazma seçenekleri ve eşzamansız yazma işlemleriyle geri yazma önbelleği kullanma seçeneği elde edersiniz. Eşzamanlı yazma işlemleri diske bağlanmayı gerektirir ve hiçbir zaman tembel olarak yazılmaz. Dosya sisteminiz, sık sık sayfa temizleme ve eşzamanlı yazma işlemlerine neden olabilir (genellikle günlük kaydı nedeniyle, özellikle ext3 veri = günlük modundayken). Ayrıca, "arka plan" sayfa yıkamaları bile önbelleğe alınmamış okumalara ve eşzamanlı yazma işlemlerine engel olur , böylece yavaşlar.

Genel olarak, neler olduğunu görmek için bazı metrikler almalısınız - kopyalama işleminizin "D" durumuna getirildiğini görüyorsunuz ve pdflush tarafından G / Ç işinin yapılması bekleniyor mu? Disklerinizde ağır senkronize yazma etkinliği görüyor musunuz?

Her şey başarısız olursa, yedeklerinizi kopyaladığınız ve gerçekte inotify kullanarak otomatik olarak disklerinizle verileri senkronize ettiğiniz açık bir tmpfs dosya sistemi kurmayı seçebilirsiniz.

Okuma önbellekleme için işler çok daha basittir - çekirdeğin arabellek önbelleğine yüklenmesi için çekirdeğe tavsiyede bulunacak parametreye sahip olan fcoretools fadviseyardımcı programı vardır --willneed.

Düzenle:

vm.dirty_ratio = 70

Teorik olarak bu, G / Ç'yi önbelleğe almak için bize 16 GB vermeli ve diske yazılıncaya kadar birkaç dakika beklemelidir.

Bu, test senaryonunuzu büyük ölçüde etkilemez, ancak anlayışınızda bir yanlış anlama vardır. Dirty_ratio parametresi, sisteminizin toplam belleğinin bir yüzdesi değil, sisteminizin boş belleğinin bir yüzdesidir .

Daha ayrıntılı bilgiler içeren Yazma-Ağır yükleri ayarlama hakkında bir makale var .


Evet, yazma performansından sonra geliyorum. Yedek kölelere yedeklemenin yayınlanması gereken zaman benim endişelerimden biri değil. Ayrıca, birincil yedekleme sunucusu başarısız olursa ve yedekler yedek kölelere ulaşmazsa, yeniden iletim için yerinde bir komut dosyası var. PS Bağlantıyı zaten okudum ve buna göre ayarladım. Free vs buffered vs total hakkındaki hatalar için üzgünüz.
Peter Meyer

3

Veya daha fazla disk alın ... Sahip olduğunuz sürücü dizisi yapılandırması, ihtiyacınız olan her şeyi desteklemiyor. Bu, gerçek ihtiyaçlarınızı karşılamak için çözümün yeniden yapılandırılması gereken bir durumdur. Bunun sadece yedek olduğunu anlıyorum, ancak kludgy bir düzeltmeyi önlemek mantıklı.


Kabul. Birkaç SATA ( SATA ? Ciddi?) Sürücünün 275MB / s'yi sürdürmesinin bir yolu yoktur ve onlardan alacağınız uçsuz IOP'lardan bile bahsetmiyoruz.
adaptr

1
Nereye gittiğini görebiliyorum - bu sadece bir veri yedekleme hedefi olduğundan, elektrik kesintileri nedeniyle ara sıra veri kaybı olasılığını umursamıyor. Ve mümkün olan maksimum verimi sağlayarak bir yedekleme penceresi için gereken süreyi en aza indirmek istiyor - 20 GB veri 30 saniyenin altında bu şekilde yazılabilir. Yedekler herhangi bir nedenle kesinti veya servis etkisi içeriyorsa, 30 saniyenin 20 dakikadan fazla sürmesi kesinlikle daha kolaydır.
the-wabbit

TAMAMEN doğru. Senkronizasyon sırasında kapalı olan sanal makine görüntülerini (hesaplama düğümleri için çok küçük olanlar) senkronize ediyorum. Uygulama tar gibi çalışır | ssh ama ftp kullanıyor. Ve simülasyonların çalışması gerekiyor ... :)
Peter Meyer

1
Ne SATA ırkı oldukları önemli değil. 7200 RPM kurumsal olmayan diskler, verimi veya gecikmeyi garanti edemez.
adaptr

1
@adaptr, bir yedek sıralı yazma olacak.
Şubat'ta psusi

1

Bellek önbelleğinin kullanılması, bir şeyler ters giderse bellekte olan ve disklere kaydedilmeyen veriler kaybedilecek gibi veri kaybına neden olabilir.

Bununla birlikte, dosya sistemi düzeyinde yapılacak ayarlamalar var.

Örneğin, ext4 kullanıyorsanız bağlama seçeneğini deneyebilirsiniz:

Bariyer = 0

Bu: "jbd kodunda yazma bariyerlerinin kullanılmasını devre dışı bırakır. Yazma bariyerleri, bazı performans cezalarında geçici disk yazma önbelleklerinin kullanılmasını güvenli hale getirerek, dergi taahhütlerinin disk üzerinde uygun şekilde sıralanmasını zorunlu kılar. Diskleriniz bir şekilde pil destekli ise veya başka bir şekilde, devre dışı bırakma engelleri performansı güvenli bir şekilde artırabilir. "Bariyer" ve "nobariyer" montaj seçenekleri, diğer ext4 montaj seçenekleriyle tutarlılık sağlamak amacıyla bariyerleri etkinleştirmek veya devre dışı bırakmak için de kullanılabilir. "

Daha fazla bilgi için: http://www.mjmwired.net/kernel/Documentation/filesystems/ext4.txt


Ben kullanıyorum ağır ayarlı XFS. Bu konuda yukarıdaki yorumda ayarlandığı hakkında daha fazla bilgi :)
Peter Meyer

Dosya sistemi mkfs.xfs -l lazy-count = 1, sürüm = 2, boyut = 256m -i attr = 2 -d sunit = 512, swidth = 1024 ile oluşturuldu ve rw, noatime, logbufs = 8, logbsize = 256k, osyncisdsync, delaylog, attr2, nobarrier, ayırma boyutu = 256k
Peter Meyer
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.