Чому мій RAID1 доступ для читання повільніше, ніж доступ до запису?


10

Я зробив кілька простих тестів на ефективність, і, здається, читання з мого RAID1 повільніше, ніж написання:

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

Я розумію, що дд - це не інструмент для перевірки ефективності, але цей результат все ще є несподіванкою.

Система була побудована виробником і має основну плату Supermicro з 16 ГБ оперативної пам’яті. RAID-контролер - це MegaRAID 9271-8i з 1 ГБ кеш-пам'яті. На задній площині SAS-933EL1 є 8 2 TByte SAS. Я не впевнений у проводці кабелів, один роз'єм контролера переходить на задній план SAS, інший - на два диски SATA, на яких розміщена ОС.

RAID1 був налаштований за допомогою цієї команди:

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

Я б очікував, що доступ до читання є принаймні таким же швидким, як і доступ до запису, можливо навіть швидше. Швидкість запису 715 Мбіт / сек, здається, знаходиться в межах 6 Гбіт для одного роз'єму SAS / SATA. Це може бути проблема з конфігурацією чи кабелем із задньої площини SAS? Чи можна конфігурацію базової площини SAS запитувати за допомогою команди MegaRAID? Порадьте, будь ласка.

Оновлення

З розширенням Poige та Peter, більш повільне, ніж очікувалося, читання, можливо, спричинене кешуванням підсистеми вводу / виводу Linux.

При використанні прямого прапора в команді dd я отримую

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

що набагато краще, але все ж на 10% повільніше, ніж швидкість запису. Використання oflag = direct не впливало на швидкість запису.


Проста відповідь: читання вимагає очікування результатів, записування - ні.
Девід Шварц

Відповіді:


8

poige точно відповідає кешу запису, але тут докладніше.

dd з нулями та використанням кешу запису - це не правильний спосіб орієнтування (якщо ви не хочете перевірити кеш запису, звичайно, що, мабуть, корисно лише для файлової системи, щоб побачити, наскільки він синхронізує метадані, створює нові файли тощо). ) (і, ймовірно, dd - це завжди неправильний тип еталону, але він працює для дуже базового тесту)

Я пропоную вам скористатися щонайменше одним із наступних варіантів:

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.

І не використовуйте також нуль. Деякі розумні апаратні / програмні / прошивки можуть використовувати деякі ярлики, якщо дані настільки передбачувані, як нулі. Це особливо вірно, якщо є компресія, яку, напевно, ви не використовуєте. Замість цього використовуйте випадковий файл у пам'яті (наприклад, / dev / shm). urandom повільний, тому вам потрібно записати його кудись тимчасово, щоб знову його прочитати. Створіть випадковий файл розміром 50 Мб:

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

Читайте файл багато разів, щоб його написати (тут я використовую кішку, щоб прочитати його 6 разів):

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

rm /dev/shm/randfile

Також пам’ятайте, що зчитування raid1 відбувається найшвидше при паралельних операціях, тому диски можна використовувати самостійно. Напевно, недостатньо розумно координувати диски для читання різних частин однієї операції з різними дисками.


10

Ключ до відповіді на ваше запитання читається заздалегідь . Колись у мене теж траплялося це питання .

IOW, для оптимальної послідовності читання всі диски повинні бути постійно включені до Input.

Коли ви використовуєте ddбез виводу directio(див. man dd), Операція запису виконується не відразу, а проходить через кеш операційної системи, тому у неї більше шансів задіяти всі диски послідовно і досягти максимально можливої ​​продуктивності.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.