RAID1 okuma erişimim neden yazma erişiminden daha yavaş?


10

Bazı basit performans testleri yaptım ve RAID1'imden okumanın yazmaktan daha yavaş olduğu anlaşılıyor:

root@dss0:~# for i in 1 2 3; do dd if=/dev/zero of=/dev/sda bs=1048576 count=131072; done
137438953472 bytes (137 GB) copied, 192.349 s, 715 MB/s
137438953472 bytes (137 GB) copied, 192.851 s, 713 MB/s
137438953472 bytes (137 GB) copied, 193.026 s, 712 MB/s
root@dss0:~# for i in 1 2 3; do dd if=/dev/sda of=/dev/null bs=1048576 count=131072; done
137438953472 bytes (137 GB) copied, 257.201 s, 534 MB/s
137438953472 bytes (137 GB) copied, 255.522 s, 538 MB/s
137438953472 bytes (137 GB) copied, 259.945 s, 529 MB/s

DD'nin bir performans testi aracı olmadığını anlıyorum, ancak bu sonuç hala bir sürpriz.

Sistem, satıcı tarafından üretilmiştir ve 16 GByte RAM'e sahip bir Supermicro ana kartına sahiptir. RAID denetleyicisi, 1 GByte önbellekli MegaRAID 9271-8i'dir. SAS-933EL1 arka panelinde 8 2 TByte SAS disk vardır. Kablolamadan emin değilim, denetleyicinin bir konektörü SAS arka paneline, diğeri işletim sistemini tutan iki SATA diskine gider.

RAID1 şu komutla kuruldu:

root@dss0:~# /opt/MegaRAID/MegaCli/MegaCli64 -CfgLdAdd -r1 [8:0,8:1,8:2,8:3,8:4,8:5,8:6,8:7] WB NORA Direct -a0
Adapter 0: Created VD 0
Adapter 0: Configured the Adapter!!
Exit Code: 0x00

root@dss0:~# /opt/MegaRAID/MegaCli/MegaCli64 -LDInfo -LALL -aALL
Adapter 0 -- Virtual Drive Information:
Virtual Drive: 0 (Target Id: 0)
Name                :
RAID Level          : Primary-1, Secondary-0, RAID Level Qualifier-0
Size                : 7.275 TB
Sector Size         : 512
Is VD emulated      : No
Mirror Data         : 7.275 TB
State               : Optimal
Strip Size          : 256 KB
Number Of Drives    : 8
Span Depth          : 1
Default Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
Current Cache Policy: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
Default Access Policy: Read/Write
Current Access Policy: Read/Write
Disk Cache Policy   : Disk's Default
Encryption Type     : None
PI type: No PI
Is VD Cached: No
Exit Code: 0x00

Okuma erişiminin en azından yazma erişimi kadar hızlı, belki daha da hızlı olmasını beklerim. 715 MByte / sn yazma hızı, tek bir SAS / SATA konektörünün 6 GBit sınırına yakın görünüyor. Bu, SAS arka paneliyle ilgili bir yapılandırma veya kablolama sorunu mu olabilir? SAS arka panel yapılandırması bir MegaRAID komutuyla sorgulanabilir mi? Tavsiye lütfen.

Güncelleme

Poige ve Peter tarafından açıklandığı gibi, beklenenden daha yavaş okuma performansına muhtemelen Linux I / O alt sisteminin önbelleğe alınması neden olmaktadır.

Dd komutunda doğrudan bayrağı kullanırken

root@dss0:~# dd if=/dev/sda of=/dev/null bs=1048576 count=131072 iflag=direct
137438953472 bytes (137 GB) copied, 199.862 s, 688 MB/s

ki bu çok daha iyi ama yine de yazma hızından% 10 daha yavaş. Oflag = direct kullanımı yazma hızını etkilemedi.


Basit cevap: Okuma sonuçları beklemeyi gerektirir, yazma yapmaz.
David Schwartz

Yanıtlar:


8

poige, yazma önbelleği konusunda tam olarak doğru, ancak daha fazla ayrıntı.

sıfırlar ve yazma önbelleği kullanmak ile dd karşılaştırmak için doğru bir yol değildir (elbette sadece bir dosya sistemi için yararlı olan meta veriyi ne kadar senkronize ettiğini, yeni dosyalar oluşturduğunu vb. ) (ve muhtemelen dd her zaman yanlış kıyaslama türüdür, ancak çok temel bir test için çalışır)

En az bir aşağıdaki seçenekle dd kullanmanızı öneririm:

conv=fdatasync -> this will make it flush to disk before finishing and calculating speed
oflag=direct   -> this will make it skip the OS cache but not the disk cache
conv=sync      -> more like skipping the disk cache too, but not really ... just flushing it every block or something like that.

Ve sıfırı da kullanma. Bazı akıllı donanım / yazılım / bellenim, veriler sıfır gibi tahmin edilebilirse bazı kısayollar kullanabilir. Bu özellikle kullanmadığınız tahmin ettiğim sıkıştırma varsa doğrudur. Bunun yerine, bellekte rastgele bir dosya kullanın (/ dev / shm gibi). urandom yavaştır, bu yüzden tekrar okumak için geçici bir yere yazmanız gerekir. 50 MB'lık rastgele bir dosya oluşturun:

dd if=/dev/urandom of=/dev/shm/randfile bs=1M count=50

Dosyayı yazmak için birçok kez okuyun (burada 6 kez okumak için kedi kullanıyorum):

dd if=<(cat /dev/shm/randfile{,,,,,}) of= ... conv=fdatasync

rm /dev/shm/randfile

Ayrıca raid1 okumalarının paralel işlemlerle en hızlı olduğunu unutmayın, böylece diskler bağımsız olarak kullanılabilir. Muhtemelen aynı işlemin farklı bölümlerini farklı disklerle okumak için diskleri koordine edecek kadar akıllı değildir.


10

Sorunuzun cevabının anahtarı, ileriye dönüktür . Bir zamanlar bu sorunu da yaşadım .

IOW, en iyi sıralı okuma performansı için tüm diskler sürekli olarak Giriş'e dahil edilmelidir.

ddW / o directio(bkz. man dd) Kullandığınızda , yazma işlemi hemen gerçekleştirilmez, ancak işletim sistemi önbelleğinden geçer, bu nedenle tüm diskleri sırayla dahil etme ve mümkün olan en yüksek performansı elde etme şansı daha yüksektir.

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.