ZFS performansı: havuzda veya dosya sisteminde boş alan bırakmam gerekir mi?


17

ZFS'nin performansının büyük ölçüde boş alan miktarına bağlı olduğunu biliyorum:

Havuz performansını korumak için havuz alanını% 80'in altında tutun. Şu anda, havuz çok dolu olduğunda ve meşgul posta sunucusunda olduğu gibi dosya sistemleri sık sık güncelleştirildiğinde havuz performansı düşebilir. Tam havuzlar performans cezasına neden olabilir, ancak başka sorunlara neden olmaz. [...]% 95-96 aralığında çoğunlukla statik içerik olsa bile yazma, okuma ve yeniden canlandırma performansının düşebileceğini unutmayın. ZFS_Best_Practices_Guide, solarisinternals.com (archive.org)

Şimdi bir ZFS dosya sistemi barındıran 10T raidz2 havuzum olduğunu varsayalım volume. Şimdi bir çocuk dosya sistemi oluşturuyorum volume/testve 5T rezervasyon yapıyorum .

Sonra NFS başına her iki dosya sistemini de bazı ana bilgisayarlara bağlarım ve bazı işler yaparım. Anladığım kadarıyla volume5T'den fazla yazamıyorum , çünkü kalan 5T'ye ayrıldı volume/test.

Benim ilk soru nasıl performans düşüşü, ben dolgu Gözat eğer vardır volume~ 5T ile bağlama noktası? ZFS'nin yazma üzerine kopyalama ve diğer meta şeyler için bu dosya sisteminde boş alan olmadığı için düşecek mi? Yoksa ZFS ayrılmış alan içindeki boş alanı kullanabildiğinden aynı kalacak volume/testmı?

Şimdi ikinci soru . Kurulumu aşağıdaki gibi değiştirirsem fark eder mi? volumeşimdi iki dosya sistemi var volume/test1ve volume/test2. Her ikisi de 3T rezervasyon her (ama hiçbir kota) verilir. Şimdi 7T yazıyorum test1. Her iki dosya sisteminin performansı aynı mı olacak yoksa her dosya sistemi için farklı mı olacak? Düşecek mi yoksa aynı kalacak mı?

Teşekkürler!

Yanıtlar:


9

Evet. Havuzunuzda boş alan bırakmanız gerekiyor. Temel olarak yazma üzerine kopyalama eylemleri ve anlık görüntüler içindir. Performans yaklaşık% 85 oranında azalır. Daha yükseğe çıkabilirsin, ama kesin bir etkisi var.

Rezervasyon ile uğraşmayın. Özellikle NFS ile. Gereksiz. Belki bir zvol için ama NFS için değil.

Yine de karışıklığı görmüyorum. 10T'niz varsa,% 85'inden fazlasını kullanmayın. Kullanımlarını sınırlamak için kotaları kullanarak paylaşımlarınızı uygun şekilde boyutlandırın . Veya herhangi bir kota kullanmayın ve genel havuz kullanımınızı izleyin .


Teşekkürler! Kota kullanma seçeneğimizde adil bir yol yoktur, bu nedenle herkes aynı bağlama noktasını kullanır ve alanı doldurarak performansta düşüşe neden olur. Benim düşüncem rezervasyon ile bazı boş alan garanti oldu, böylece genel sistem asla çok yavaş olmaz. Ama IIUC, bu garantiyi volume8.5T ile sınırlandırabilirim ve bir daha asla düşünmem. Bu doğru mu?
Pavel

Sen .. ya da sadece izle. Yani, NFS ... bir zvol değil, bu yüzden 8,5 TB'ın altına geri dönmek için dosyaları silebilirsiniz.
ewwhite

Evet, ancak posta listelerinde "lütfen paranızı temizleyin .., dosya sunucusu son derece yavaş" tartışmalar yapmak her iki haftada bir ...
Pavel

Sosyal / idari bir soruna teknik çözüm :) Bu kadar çok veriyi tahmin ediyor musunuz?
ewwhite

Hehe .. Evet, karşılaştığımız oldukça yaygın bir durum. Yani, şöyle iddialar var: "Birçok dosya oluşturma ve silme işlemine sahip dosya sistemlerinde, performansı korumak için kullanım% 80'in altında tutulmalıdır." çünkü dosya sisteminden ziyade bir havuzdaki boş alanla mı ilgili?
Pavel

21

Performans düşüşü, zpool'unuz çok dolu veya çok parçalı olduğunda gerçekleşir. Bunun nedeni ZFS ile birlikte kullanılan serbest blok keşfi mekanizmasıdır. NTFS veya ext3 gibi diğer dosya sistemlerinin aksine, hangi blokların meşgul olduğunu ve hangilerinin ücretsiz olduğunu gösteren bir blok bitmap'i yoktur. Bunun yerine ZFS, zvolünüzü "metaslabs" olarak adlandırılan (genellikle 200) daha büyük alanlara böler ve her metaslab'da AVL ağaçlarını 1 serbest blok bilgisi (uzay haritası) saklar. Dengeli AVL ağacı, isteğin boyutuna uyan bir blok için verimli bir arama yapılmasını sağlar.

Bu mekanizma ölçeklendirme nedenleriyle seçilmiş olsa da, maalesef yüksek düzeyde parçalanma ve / veya alan kullanımı söz konusu olduğunda büyük bir ağrı olduğu ortaya çıkmıştır. Tüm metaslablar önemli miktarda veri taşıdığı anda, havuz boşken az sayıda büyük alanın aksine çok sayıda küçük ücretsiz blok alanı elde edersiniz. Daha sonra ZFS'nin 2 MB alan tahsis etmesi gerekiyorsa, uygun bir blok bulmak veya 2 MB'yi daha küçük bloklara bölmenin bir yolunu bulmak için tüm metaslab'ların alan haritalarını okumaya ve değerlendirmeye başlar. Bu elbette biraz zaman alıyor. Daha da kötüsü, ZFS'nin aslında fiziksel disklerdeki tüm uzay haritalarını okuyacağı için bir çok G / Ç işlemine mal olacağıdır . İçin herhangi senin yazma.

Performanstaki düşüş önemli olabilir. Güzel resimlerden hoşlanıyorsanız , bazı numaraların (basitleştirilmiş ancak geçerli) bir zfs havuzundan çıkarıldığı Delphix'deki blog yayınına bir göz atın . Grafiklerden birini utanmadan çalıyorum - bu grafikteki mavi, kırmızı, sarı ve yeşil çizgilere (sırasıyla)% 10,% 50,% 75 ve% 93 kapasitede havuzları temsil eden KB / s zamanla parçalanırken: zpool performans düşüşü

Bu hızlı ve kirli bir düzeltme geleneksel olarak metaslab hata ayıklama modu olmuştur (sadece echo metaslab_debug/W1 | mdb -kwayarı anında değiştirmek için çalışma zamanında sorun ). Bu durumda, tüm yazma haritaları OS RAM'de tutulur ve her yazma işleminde aşırı ve pahalı G / Ç gereksinimi ortadan kaldırılır. Nihayetinde bu, özellikle büyük havuzlar için daha fazla belleğe ihtiyacınız olduğu anlamına gelir, bu nedenle at ticareti için bir tür RAM'dir. 10 TB havuzunuz muhtemelen 2-4 GB bellek 2'ye mal olacak , ancak çok fazla uğraşmadan kullanımın% 95'ine çıkarabilirsiniz.


1 biraz daha karmaşık, eğer ilgileniyorsanız, ayrıntılar için Bonwick'in uzay haritalarındaki yazısına bakın

2 bellek için bir üst sınır hesaplamanın bir yoluna ihtiyacınız varsa , her bir metaslab'de kullanılmakta zdb -mm <pool>olan sayısını almak için segmentskullanın, en kötü senaryoyu modellemek için ikiye bölün (her işgal edilen segmentin ardından ücretsiz bir tane gelir) ), bir AVL düğümü için kayıt boyutuyla çarpın (iki bellek işaretçisi ve bir değer, zfs'nin 128 bit doğası ve 64 bit adreslemenin 32 bayta kadar toplanması göz önüne alındığında, insanlar genellikle bazıları için 64 bayt varsayıyor gibi görünüyor) sebebi).

zdb -mm tank | awk '/segments/ {s+=$2}END {s*=32/2; printf("Space map size sum = %d\n",s)}'

Referans: Temel taslak, Markus Kovero tarafından zfs-tartışmalı posta listesindeki bu gönderide yer alsa da, hesaplamamda benim düzeltmeyi umduğum bazı hatalar yaptığına inanıyorum.


syneticon-dj, bu açıklama için teşekkürler! Artan RAM gerçekten yardımcı oluyor gibi görünüyor.
Pavel

BPR'ye (blok işaretçisi yeniden yazma) ne olacak? Ayrıca bu blogs.kent.ac.uk/unseenit/2013/10/02/… ZIL için bir SLOG kullanmaktan da bahsediyor. Ve bu adam nex7.blogspot.com.au/2013/03/readme1st.html hepsi iyi olana kadar gönderip aldığını söylüyor.
CMCDragonkai

@CMCDragonkai Deneyiminizden sizi temin ederim, ayrı bir ZIL cihazı kullanmanın uzay haritası parçalanması nedeniyle performans isabetine karşı hiçbir şey yapmaması. Ancak bir ZIL cihazına sahip olmamanız genel parçalanmayı artıracaktır ve daha az alan kullanım yüzdesinde bu sorunu çözme olasılığınız daha yüksek olacaktır. BPR hala buharlı yazılımdır - kanıtlanabilir bir kod yoktur, daha az kararlı bir uygulama. Bir döngü bir Birleştirilmiş havuzu konusunda yardım almak olasıdır gerçekten de yollanması-ama bu olacaktır alınan veri kümesi gönderilenle / için kesinti anlamına gelir.
the-wabbit

Veri kümesini göndermeden önce başka bir diske çoğalttıysanız ne olur? Ve sonra her disk için bir gönderme-alma döngüsü döndürmek mi?
CMCDragonkai

@CMCDragonkai sen yapabilirsiniz ilk tam gönderme yapıyor ve bundan sonra incremental ile çalışarak kesinti kısa tutmak. Ancak kesinti süresi kalır. Veri kümelerinizi veritabanları veya sanallaştırma için arka uç depolama alanı olarak kullanırsanız, kısa olsa bile kesinti süresi zarar görür. Ayrıca, bunun çalışması için ayrı, boş bir havuza ihtiyacınız olacaktır.
wabbit
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.