Назад | Перейти на главную страницу

Почему мой доступ для чтения к RAID1 медленнее, чем доступ для записи?

Я провел несколько простых тестов производительности, и кажется, что чтение с моего 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

Я понимаю, что dd - это не инструмент для проверки производительности, но этот результат все же удивляет.

Система построена производителем и имеет материнскую плату Supermicro с 16 ГБ ОЗУ. RAID-контроллер - MegaRAID 9271-8i с кеш-памятью 1 ГБ. На объединительной плате SAS-933EL1 установлено 8 дисков SAS емкостью 2 ТБайт. Я не уверен в кабельной разводке, один разъем контроллера идет к объединительной плате 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? Пожалуйста, порекомендуйте.

Обновить

Как объяснили Поиге и Питер, более медленная, чем ожидалось, скорость чтения, вероятно, вызвана кэшированием подсистемы ввода-вывода 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 не повлияло на скорость записи.

Ключ к ответу на ваш вопрос - чтение вперед. Когда-то я тоже случилась эта проблема.

IOW, для оптимальной производительности последовательного чтения все диски должны быть постоянно задействованы во Вводе.

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

poige совершенно прав относительно кеша записи, но вот подробности.

dd с нулями и использование кеша записи - неправильный способ тестирования (если, конечно, вы не хотите тестировать кеш записи, что, вероятно, полезно только для файловой системы, чтобы увидеть, насколько он синхронизирует метаданные, создает новые файлы и т. ) (и, вероятно, 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

Прочтите файл много раз, чтобы записать его (здесь я использую cat, чтобы прочитать его 6 раз):

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

rm /dev/shm/randfile

Также имейте в виду, что чтение raid1 происходит быстрее всего при параллельных операциях, поэтому диски можно использовать независимо. Вероятно, недостаточно умно координировать диски для чтения разных частей одной и той же операции с разных дисков.