Mengapa akses baca RAID1 saya lebih lambat daripada akses tulis?

10

Saya telah melakukan beberapa tes kinerja sederhana dan tampaknya membaca dari RAID1 saya lebih lambat daripada menulis:

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

Saya mengerti bahwa dd bukan alat uji kinerja, tetapi hasil ini masih mengejutkan.

Sistem dibangun oleh vendor dan memiliki papan utama Supermicro dengan RAM 16 GByte. Pengontrol RAID adalah MegaRAID 9271-8i dengan cache 1 GByte. Ada 8 2 TByte SAS disk pada backplane SAS-933EL1. Saya tidak yakin dengan pemasangan kabel, satu konektor controller menuju ke SAS backplane, yang lain ke dua disk SATA yang menampung OS.

RAID1 diatur dengan perintah ini:

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

Saya berharap akses baca setidaknya secepat akses tulis, bahkan mungkin lebih cepat. Kecepatan tulis 715 MByte / detik tampaknya mendekati batas 6 GBit untuk satu konektor SAS / SATA. Apakah ini mungkin masalah konfigurasi atau pemasangan kabel dengan backplane SAS? Bisakah konfigurasi backplane SAS ditanyai dengan perintah MegaRAID? Mohon saran.

Memperbarui

Seperti yang dikeluarkan oleh poige dan Peter, kinerja membaca yang lebih lambat dari yang diperkirakan mungkin disebabkan oleh caching dari subsistem I / O Linux.

Saat menggunakan flag langsung dalam perintah dd saya dapatkan

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

yang jauh lebih baik tetapi masih 10% lebih lambat dari kecepatan menulis. Menggunakan oflag = langsung tidak mempengaruhi kecepatan tulis.

nn4l
sumber
Jawaban sederhana: Baca perlu menunggu hasil, tulis tidak.
David Schwartz

Jawaban:

8

poige benar tentang cache tulis, tetapi di sini lebih detail.

dd dengan nol dan menggunakan cache tulis bukan cara yang tepat untuk benchmark (kecuali Anda ingin menguji cache tulis tentu saja, yang mungkin hanya berguna untuk sistem file, untuk melihat berapa banyak itu menyinkronkan metadata, membuat file baru, dll. ) (dan sepertinya dd selalu merupakan tipe benchmark yang salah, tetapi ini berfungsi untuk tes yang sangat mendasar)

Saya sarankan Anda menggunakan dd dengan setidaknya satu opsi berikut:

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.

Dan jangan gunakan nol juga. Beberapa perangkat keras / lunak / firmware cerdas mungkin menggunakan beberapa jalan pintas jika datanya dapat diprediksi sebagai nol. Ini terutama benar jika ada kompresi yang saya duga Anda tidak gunakan. Sebagai gantinya, gunakan file acak dalam memori (seperti / dev / shm). urandom lambat, jadi Anda perlu menulisnya di suatu tempat untuk sementara waktu untuk membacanya lagi. Buat file acak 50MB:

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

Baca file berkali-kali untuk menulisnya (di sini saya menggunakan cat untuk membacanya 6 kali):

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

rm /dev/shm/randfile

Juga perlu diingat bahwa pembacaan raid1 tercepat dengan operasi paralel, sehingga disk dapat digunakan secara independen. Mungkin tidak cukup pintar untuk mengoordinasikan disk untuk membaca bagian berbeda dari operasi yang sama dengan disk yang berbeda.

Peter
sumber
10

Kunci untuk jawaban atas pertanyaan Anda adalah baca-depan . Sekali waktu, saya juga mengalami masalah itu .

TKI, untuk kinerja pembacaan sekuensial yang optimal, semua disk harus terlibat secara permanen ke dalam Input.

Saat Anda menggunakan ddw / o directio(lihat man dd), operasi tulis tidak dilakukan segera, tetapi melewati cache OS, sehingga memiliki lebih banyak peluang untuk melibatkan semua disk secara berurutan dan mencapai kinerja semaksimal mungkin.

poige
sumber