Ext3 üzerine data = geri yazma ve bariyer = 0 ile bağlanmalı mıyız?


13

Bir barındırma şirketinde VM'de bir sunucu çalıştırıyoruz ve özel bir ana bilgisayara kaydolduk (AMD Opteron 3250, 4 çekirdek, 8 GB RAM, RAID yazılımında 2 x 1 TB, ext3).

Performans testleri çalıştırırken, bazı SQLite dönüşümlerinin (ekler, silme ve / veya güncellemelerin birleşimi) 2010 MacBook Pro'mdan 10x ila 15x daha uzun sürdüğünü fark ettik.

Birçok googling ve okumadan sonra, aşağıdaki montaj seçeneklerine bakmalıyız:

    data=ordered,barrier=1

Biraz deneme yaptık ve en iyi performansı elde ettik

    data=writeback,barrier=0

Bunları okudum ve yaptıklarının temellerini anladım, ancak böyle çalışmamızın iyi bir fikir olup olmadığı konusunda iyi bir his / his yok mu?

Sorular

Yukarıdaki yapılandırma, barındırılan bir hizmet için dikkate alınmaya değer mi?

Elektrik kesintisi veya sert bir çökme yaşadığımızda, verilerin kaybolması veya dosyaların bozulması ile sonuçlanabilir. DB'nin 15 dakikada bir anlık görüntülerini alıyorsak, bu durum hafifletebilir, ancak anlık görüntü alındığında DB senkronize edilmeyebilir. Böyle bir anlık görüntünün bütünlüğünü nasıl sağlayabiliriz?

Dikkate almamız gereken başka seçenekler var mı?

Teşekkürler


Birçok faktör söz konusudur. Birçok sert çökme mi bekliyorsunuz? Barındırılan makinenize bağlı bir UPS (veya eşdeğeri) var mı? Diğer dosya sistemleriyle (örneğin ext4, XFS, vb.) Bazı kıyaslamalar yaptınız mı? HDD önbelleğini kontrol edebilir ((etkinleştirebilir))? Yazılım RAID'inizi nasıl yapılandırdınız? HDD düzgün hizalanmış mı (4K bloklarınız varsa)?
Huygens

Çok fazla sert çökme beklemiyoruz. UPS'imiz yok. Makine spec standart bir "kapalı raf" hosting şirketi, yani: biz diğer fs karşılaştırma yoktu, ext3 ne var. HDD önbelleğinde bilmiyorum, buna bakacak ve benzer şekilde RAID ve HDD hizalaması için. Teşekkürler.
NeilB

Unuttuğum bir diğer soru da ne kadar tarihe değer kaybetmeyi göze alabileceğinizdir? Yoksa kayıp göze alamaz mısınız? Not: SQLite anlık görüntüyü veya başka bir deyişle çalışan bir veritabanını yedeklemeyi destekler. sqlite.org/backup.html
Huygens

Çekirdek sürümünüz nedir? Engeller, önceki çekirdek sürümünde değil, 2.6.33'ten beri md tarafından onurlandırılmaktadır.
Huygens

uname -r raporları "2.6.32-220.2.1.el6.x86_64". "MD" nedir? Çekirdeğin bu sürümünde engellere uyulmuyorsa, engelleri kapatırken neden bir performans artışı gördüm?
NeilB

Yanıtlar:


15

İlk öneri
Herhangi bir veri kaybetmeyi göze alamazsanız (yani bir kullanıcı yeni veri girdikten sonra, bu, önümüzdeki saniyeler içinde kaybedilemezse) ve UPS gibi bir şeyiniz olmadığından, yazma engelini kaldırmayacağım, ben de geri yazmaya geçmezdim.

Yazma engellerini
kaldırma Yazma engelini kaldırırsanız, çökme veya güç kaybı durumunda, dosya sisteminin disk yapısını onarmak için bir fsck yapması gerekir (bariyer AÇIK durumdayken bile, günlük dosyalarının çoğunun hala bir fsck bile yapacağını unutmayın ancak derginin tekrarlanması yeterli olmalıydı). Yazma engelini kaldırırken, mümkünse herhangi bir disk önbelleğinin (donanımda) kaldırılması önerilir, bu riski en aza indirmeye yardımcı olur. Yine de böyle bir değişikliğin etkisini karşılaştırmalısınız. Bu komutu deneyebilirsiniz (donanımınız destekliyorsa) hdparm -W0 /dev/<your HDD>.
Ext3'ün meta veri değişikliği için 2 engel kullandığını, ext4 ise mount seçeneğini kullanırken yalnızca bir engel kullandığını unutmayın journal_async_commit.

Her ne kadar Ted T'so açıkladı bazı birkaç veri bozulması ext3'ün ilk günlerinde neden oldu (bariyerler varsayılan olarak kapalı idi Çekirdek 3.1 kadar , dergi bir dergi günlüğü sarma olur sürece (dergi döngüsel günlüğü vardır) bir şekilde yerleştirilir) veriler güvenli bir şekilde diske yazılır - önce dergi, ikinci veri - hatta sabit diskle yazmaların yeniden sıralanmasını destekler.
Temel olarak, günlük günlüğü kaydırıldığında bir sistem çökmesi veya güç kaybının olması şanssız olacaktır. Ancak, tutmanız gerekir data=ordered. data=ordered,barrier=0Ek olarak karşılaştırmaya çalışın .

Birkaç saniye veri kaybetmeyi göze alabiliyorsanız, her iki seçeneği de etkinleştirebilirsiniz, data=writeback,barrier=0ancak commit=<nrsec>parametre ile de denemeyi deneyebilirsiniz . Bu parametrenin kılavuzuna buradan bakın . Temel olarak ext3 dosya sisteminin verilerini ve meta verilerini senkronize edeceği dönem olan birkaç saniye verirsiniz.
Ayrıca kirli sayfalar (diske yazılması gerekenler) ile ilgili bazı çekirdek ayarlarla uğraşmaya ve karşılaştırmaya çalışabilirsiniz, burada bu ayarlarla ilgili her şeyi ve onlarla nasıl oynanacağını açıklayan iyi bir makale var.

Engellerle ilgili özet
Birtakım daha ayarlanabilir ayar kombinasyonlarını karşılaştırmalısınız:

  1. data=writeback,barrier=0İle birlikte kullanınhdparm -W0 /dev/<your HDD>
  2. kullanım data=ordered,barrier=0
  3. data=writeback,barrier=0Diğer bağlama seçeneğiyle birlikte kullanın commit=<nrsec>ve nrsec için farklı değerler deneyin
  4. 3. seçeneği kullanın ve kirli sayfalarla ilgili olarak çekirdek düzeyinde ayarlanmayı deneyin.
  5. data=ordered,barrier=1Kasayı kullanın , ancak diğer ayarlayıcıları deneyin: özellikle dosya sistemi asansörü (CFQ, Son Tarih veya Noop) ve onların ilgili ayarlayıcıları.

Ext4'e geçmeyi ve karşılaştırmayı dikkate almayı
söylediğim gibi ext4 yazma için ext3'ten daha az bariyer gerektirir. Ayrıca ext4, büyük dosyalar için daha iyi performans getirebilecek uzantıları destekler. Bu nedenle, keşfetmeye değer bir çözümdür, özellikle yeniden yüklemeden bir ext3'ten ext4'e geçmek kolaydır: resmi belgeler ; Bunu tek bir sistemde yaptım ama Debian rehberini kullanarak . Ext4, 2.6.32 çekirdeğinden bu yana gerçekten kararlıdır, bu nedenle üretimde kullanmak güvenlidir.

Son değerlendirme
Bu cevap tam olmaktan uzaktır, ancak araştırmaya başlamak için yeterli materyal sağlar. Bu, gereksinimlere (kullanıcı veya sistem düzeyinde) o kadar bağımlıdır ki, bunun için üzgünüm.


Teşekkürler - orada çok yararlı şeyler. Kernel.org'daki ext3 belgesini zaten okudum ve taahhüdü değiştirmeyi denedim, ancak büyük bir değer olduğu konusunda bir fikrim yoktu. 5 saniye yerine 15 olarak ayarlandığımda hiçbir değişiklik görmedim. Önerdiğiniz permütasyonları karşılamak için biraz daha kıyaslama yapacağım. Tekrar teşekkürler.
NeilB

Güvenli varsayılanları korurken işlem süresini artırmayı denemek iyi bir fikirdi! SQLite'ın, kesinleştirme seçeneğini kullanarak herhangi bir performans değişikliğini neden ölçmediğinizin bir açıklaması olabilecek bir yıkama / senkronizasyon olması mümkündür.
Huygens

@NeilB sadece bu makalelerde rastlamak: 1. sqlite.org/draft/lockingv3.html içinde arayın ext3. Cevabımda neyi ele almaya çalıştığımın anlaşılması (veya basitleştirilmesi) için belki de daha kolay bir açıklama sağlar. 2. sqlite.1065341.n5.nabble.com/… güvenli ext3 varsayılanlarını (sıralı + bariyer) tutmayı deneyebilir ancak senkronizasyonu SQLite'den kaldırabilirsiniz. Bu ikinci konu ile ilgili cevabımı yakında güncelleyeceğim.
Huygens

Bunlar için teşekkürler. Tüm permütasyonları çalışmak ve sırayla onlarla performans testleri yapmak üzereyim. Daha önce SQLite'de senkronizasyonla denedim ve iyi performans rakamları aldım. Önce yazma işlemleri farklı kombinasyonları için bir dizi veri toplamak için bazı kod yazmak gerekiyor. Burada bir özet göndereceğim, ancak daha fazla ayrıntı istiyorsanız bowers dot com'da neil'im.
NeilB

10

Uyarı: Aşağıda yanlışlıklar olabilir. Ben ilerlerken bu şeylerin çoğunu öğreniyorum, bu yüzden bir tutam tuz ile alın. Bu oldukça uzun, ama sadece oynadığımız parametreleri okuyabilir ve sonunda Sonuca geçebilirsiniz.

SQLite yazma performansı hakkında endişelenebileceğiniz birkaç katman vardır:

performansı düşünmek için farklı seviyeler

Koyu renkle vurgulanmış olanlara baktık. Belirli parametreler

  • Disk yazma önbelleği. Modern diskler, disk yazma işlemlerini dönen diske göre optimize etmek için kullanılan RAM önbelleğine sahiptir. Bu etkinleştirildiğinde, veriler sıra dışı bloklarda yazılabilir, böylece bir kilitlenme meydana gelirse, kısmen yazılı bir dosya elde edebilirsiniz. Hdparm -W / dev / ... ile ayarı kontrol edin ve hdparm -W1 / dev / ... ile ayarlayın (açmak için -W0 kapatmak için).
  • Bariyer = (0 | 1). "Bariyer = 0 ile çalıştırırsanız, disk yazma önbelleği etkin değilse" diyen çok sayıda yorum var. Engellerle ilgili bir tartışmayı http://lwn.net/Articles/283161/ adresinde bulabilirsiniz.
  • data = (günlük | sipariş edilen | geri yazma). Bu seçeneklerin açıklaması için http://www.linuxtopia.org/HowToGuides/ext3JournalingFilesystem.html adresine bakın .
  • taahhüt = N. Ext3'e tüm verileri ve meta verileri her N saniyede bir senkronize etmesini söyler (varsayılan 5).
  • SQLite pragma senkronize = AÇIK | KAPALI. ON olduğunda, SQLite devam etmeden önce bir işlemin "diske yazılmasını" sağlar. Bunu kapatmak, diğer ayarları büyük ölçüde ilgisiz kılar.
  • SQLite pragma cache_size. SQLite'ın bellek içi önbellek için ne kadar bellek kullanacağını kontrol eder. İki boyutu denedim: biri tüm DB önbelleğe sığacak ve diğeri önbellek maksimum DB boyutunun yarısı idi.

Ext3 belgelerindeki ext3 seçenekleri hakkında daha fazla bilgi edinin .

Bu parametrelerin bir dizi kombinasyonu üzerinde performans testleri yürüttüm. Kimlik, aşağıda belirtilen bir senaryo numarasıdır.

denediğim senaryolar

Senaryo 1 olarak makinemdeki varsayılan yapılandırmayla çalışarak başladım. Senaryo 2, "en güvenli" olduğunu düşündüğüm şeydir ve sonra uygun / istenirse çeşitli kombinasyonları denedim. Bu, muhtemelen kullandığım harita ile anlaşılması en kolay:

senaryoları parametrelerle eşleme

Yalnızca INTEGER, yalnızca TEXT (id sütunu ile) veya karışık olan tablolarda, ekler, güncellemeler ve siler ile çok sayıda işlem yürüten bir test komut dosyası yazdım. Bu yukarıdaki yapılandırmaların her biri üzerinde birkaç kez koştu:

senaryolar için zamanlamaları gösteren çizim

En alttaki iki senaryo "pragma senkronize = kapalı" olan # 6 ve # 17'dir, bu yüzden en hızlı olmaları şaşırtıcı değildir. Üçlü sonraki küme # 7, # 11 ve # 19'dur. Bu üçü yukarıdaki "yapılandırma haritası" nda mavi renkle vurgulanmıştır. Temel olarak yapılandırma disk yazma önbelleği açık, bariyer = 0 ve veri 'günlük' dışında bir şeye ayarlanmıştır. İşlemi 5 saniye (# 7) ile 60 saniye (# 11) arasında değiştirmek çok az fark yaratıyor gibi görünüyor. Bu testlerde veri = sıralı ve veri = geri yazma arasında herhangi bir fark varsa beni şaşırtmıştı.

Karışık güncelleme testi orta zirvedir. Bu testte daha yavaş bir senaryo kümesi var. Bunların hepsi data = günlüğü olanlardır . Aksi takdirde, diğer senaryolar arasında fazla bir şey yoktur.

Farklı tip kombinasyonlarda daha heterojen ekler, güncellemeler ve siler karışımı yapan başka bir zamanlama testi yaptım. Bunlar çok daha uzun sürdü, bu yüzden yukarıdaki arsaya dahil etmedim:

karışık türler ve ekleme / güncelleme / silme

Burada geri yazma yapılandırmasının (# 19) sıralı olanlardan (# 7 ve # 11) biraz daha yavaş olduğunu görebilirsiniz. Geri yazımın biraz daha hızlı olmasını bekledim, ama belki de yazma desenlerinize bağlıdır, ya da henüz ext3'te henüz yeterince okumadım :-)

Çeşitli senaryolar, başvurumuzun yaptığı işlemleri bir şekilde temsil ediyordu. Kısa bir senaryo listesi seçtikten sonra, bazı otomatik test takımlarımızla zamanlama testleri gerçekleştirdik. Yukarıdaki sonuçlarla aynı çizgideydi.

Sonuç

  • Taahhüt biz 5s o terk ediyoruz, böylece parametre, küçük fark yaratmak için görünüyordu.
  • Disk yazma önbelleği açık, bariyer = 0 ve veri = sıralı olarak devam ediyoruz . Çevrimiçi olarak bunun kötü bir kurulum olduğunu düşündüğüm bazı şeyleri okudum ve birçok durumda bunun varsayılan olması gerektiğini düşünen diğerleri. En önemlisi, hangi ödünleşimleri yaptığınızı bilerek bilinçli bir karar vermenizdir.
  • SQLite'de senkron pragmayı kullanmayacağız.
  • SQLite cache_size pragma'nın DB'nin bellekte sığacağı şekilde ayarlanması beklediğimiz gibi bazı işlemlerde performansı artırdı.
  • Yukarıdaki yapılandırma, biraz daha fazla risk aldığımız anlamına gelir. Kısmi yazma işleminde disk arızası riskini en aza indirmek için SQLite yedekleme API'sini kullanacağız: N dakikada bir anlık görüntü alma ve son M'yi çevresinde tutma. Performans testlerini yaparken bu API'yı test ettim ve bize bu şekilde gitmemize güven verildi.
  • Hâlâ daha fazlasını isteseydik, çekirdeği karıştırmaya bakabilirdik, ama oraya gitmeden işleri yeterince geliştirdik.

Çeşitli ipuçları ve işaretçiler için @Huygens'e teşekkürler.

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.