Blok boyutu performansı tutarsız sonucu okuma / yazma, testim doğru mu?


1

Kötü IO nedeniyle bir ızgara işinde potansiyel bir darboğaz tespit etmek için dosya sistemi blok boyutu açısından bazı testler yapmaya çalışıyorum. FS'nin blok büyüklüğü şöyle olurken, iş sırasında 8096 B'lik küçük dosya artışlarını fark ettim:

stat -fc %s /my/filesytem
1048576

Hangisi optimal olmaktan uzak. Böyle davranışını taklit etmek Birlikte 20GB 1GB dan iki küçük rasgele bir dosya oluşturmak ettik ddve /dev/urandombir kaynak olarak, ve bu piton kod çalıştı:

#!/bin/python
bsize=8096
print('File random.20g1')
print(strftime("%Y-%m-%d_%H:%M:%S"))
f1= open('random.20g1','rb')
f2= open('random.20g1.dest','wb')

while True:
   b = f1.read(bsize)
   if b:
       f2.write(b)
   else:
       break
print(strftime("%Y-%m-%d_%H:%M:%S"))

Ve ben de aynısını denedim bsize=1048576.

İlk önce 8096 ve 1048576'lık bir blok büyüklüğü (4 büyük blok büyüklüğü için 4 sn daha az) arasında 4 saniyelik küçük bir okuma / yazma süresi farkı gözlemliyorum.
Bu ilk sonuç ümit vericiydi, ancak daha fazla testten sonra, dosyanın boyutunu 20 GB'a çıkarmak veya aynı 10 GB dosyayla aynı yapmak gibi performans açısından her zaman 4/3 saniyelik aynı farkı görüyorum ve kazanım ne olursa olsun ölçeklendirmiyor. dosya.

Test prosedürümde yanlış bir şey mi yapıyorum yoksa size uygun görünüyor mu?
Örneğin dosyanın boyutunu artırmada bir miktar iyileşme beklerdim.


Özel testinizin davranışını kontrol etmedim, ancak değişken boyuttaki okumaların performansından ziyade çekirdeğin ileriye dönük algoritmalarının performansını ölçtüğünüzden şüpheleniyorum.
Stephen Kitt

Tamam bu bir cevap olabilir, ancak
farklılıklar

Yanıtlar:


1

Bu kod

while True:
   b = f1.read(bsize)
   if b:
       f2.write(b)
   else:
       break

sıralı okumalar yapıyor ve yazar - herhangi biri verildiğinde bsize, ilk bsizebaytları okur , hedef dosyaya yazar, ardından ikinci bsizebaytları okur , hedef dosyaya ekler, ...

İşletim sisteminiz bunları sayfa önbelleği üzerinden arabelleğe alacak ve giriş bilgilerinizi okumaya devam edebilir ve yorumlarda @StephenKitt olarak önbellekleme yapabilir. Böylece, temel diske yapılan GÇ çağrıları, muhtemelen bahsettiğiniz 1 MB olan çok daha büyük parçalara birleştirilir.

Performansta gördüğünüz küçük fark neredeyse kesindir, çünkü sadece daha küçük kullandığınızda bsizeişleminiz verileri gerçekten taşımak için çekirdeğe daha fazla sistem çağrısı yapmak zorunda kalır.

Bu yüzden neredeyse kesinlikle bsizetest kodunuzda değişiklik yaparken çok fazla fark görmüyorsunuz , ancak sisteminiz hakkında daha fazla ayrıntı olmadan kesin olarak söylemek gerçekten mümkün değil.

DAHA...

Yaptığınız şey etkili bir şekilde aynı

dd if=random.20g1 of=random.20g1.dest bs=8192

Gerçekten kullanıyorsanız dd, disk GÇ'yi test etmek için daha birçok şey yapabilirsiniz ( örneğin man sayfasına bakın - örneğin sayfa önbelleğini atlamak için doğrudan GÇ kullanabilirsiniz), ancak sonuçta GÇ sizi test eder ddsırayla olacak gibi ile yapabilirsiniz oldukça sınırlıdır. ddSize en iyi IO performansınıza yakın olduğunu gösterecek , ancak IO performansının olumsuz taraflarını ortaya çıkaran birçok gerçek dünya iş yükünü simüle edemez.

Izgara işinizin gerçekte kullandığı IO modeli hakkında daha fazla şey belirlemeniz gerekir - testinizde olduğu gibi sıralı okumalar / yazmalar mı yapıyor yoksa rasgele okumalar yapıyor ve / veya dosyalarda nerede aradığını etkin bir şekilde rastgele okumalar mı IO yapmadan önce konumu? Rastgele G / Ç işlemleri, bir dosya sisteminde ve bunun altında yatan disk donanımında çok daha fazla şey gerektirir - özellikle dönen diskler. Yüzlerce MB / sn akışlı sıralı IO'yu hareket ettirebilen sistemler, rastgele küçük boyutlu IO işlemleri ile kelimenin tam anlamıyla saniyede bir avuç kilobayta indirgenebilir . Özellikle SLOW 5.000 RPM SATA disk kullanıyorsanız.

Dosya sistemlerini ve RAID dizilerini anlamayan insanlar depolama alanı kurduklarında, gerçekten kötüye gidebilir. 1 MB'lık bir dosya sistemi bloksiz olduğundan, yanlış bir "daha büyük her zaman daha hızlıdır" paradigması altında bir depolama sistemi kurulumuyla uğraşıyor olabilirsiniz.

RAID5 / 6 dizileri ve rastgele küçük blok GÇ (ızgara işinizde göründüğü gibi) gibi şeylerle "daha büyük her zaman daha hızlıdır" paradigmasını karıştırmak, tamamen korkunç GÇ performansı için bir reçete olabilir.

Sen kullanabilirsiniz straceLinux üzerinde fiili sistem işini (ler) yapmak çağrıları alır. Gibi aramalar için bak lseek, write, readve pwriteve pread. Bu size iş (ler) inizin gerçek IO kalıbını söyleyecektir.

IO kalıbınızı aldıktan sonra, bu kalıbın çoğaltılmasına yaklaşan bir araçla bu kalıp altındaki gerçek depolama performansını test edebilir ve kıyaslayabilirsiniz. Büyük olasılıkla rasgele konumlardan yazacak veya okuyacak bir araca ihtiyacınız vardır. Yine, Linux varsayarak başlayabilirsinizfio . Büyük olasılıkla rastgele okuma / yazma seçeneklerini kullanmanız gerekir.


Belgelenmiş yanıt için teşekkürler, aslında RAID ayarlı GPFS adlı dağıtılmış bir dosyada çok büyük bir dosyayı depolamak için kullanılan bir dosya sistemi. Tartışmayacağım, doğru ayarların olup olmadığı. Buradaki mesele değil. Yine de daha kesin testler yapacağım ve bunların neden böyle olduğunu göreceğim.
IO'm

@Kiwy GPFS'nin tam olarak ne olduğunu biliyorum. IBM için GPFS kurulumlarını bile yaptım. GPFS'nin yanlış yapılandırılması kolaydır. Bir SAN üzerinde kullanıldığını varsayarsak, temel diziler nelerdir? RAID5 / 6? RAID segmenti / şerit boyutu nedir? Dizilerin üstüne yerleştirilen LUN'lar segment / şerit boyutuna uygun şekilde hizalanmış mı? RAID dizileri, 1 MB / disk segmenti boyutu / 18 MB şerit boyutu ile 19 diskli RAID-5 gibi tamamen yetersiz bir şey midir? LUN'lardaki disk bölümleri düzgün bir şekilde hizalanmış mı, böylece bloksiz IO işlemleri temel RAID dizisiyle aynı hizada mı?
Andrew Henle,

@Kiwy GPFS uzaktan çoğaltma kullanılıyor mu? Eğer öyleyse, nasıl yapılandırılır?
Andrew Henle,

@Kiwy Üzerinde tartışmayacağım, doğru ayarların olup olmadığı. Buradaki mesele değil. Bu doğru değil. Temel depolama yapılandırması aldığınız performans için kesinlikle çok önemlidir . Tamamen konunun bir parçası.
Andrew Henle,

Bütün bu yolu benden daha iyi biliyor gibisin. Bu konuda size birkaç nedenden dolayı cevap veremiyorum. ama güven bana, sorunun depoda yatmadığı. Yaygın olarak başkaları tarafından kullanılır ve sorun daha çok IO yapmanın iş yolundadır. Kötü depolamanın zarar verebileceğini biliyorum. ama burada durum böyle değil.
Kiwy
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.