MD Raid 1 алгоритм балансировки чтения
Я искал через Google, но не нашел никакой информации об алгоритме балансировки чтения для MD raid1.
Несколько лет назад я, возможно, читал где-то, что он использует hashing the process id
определить, какое устройство он использует, но я не уверен.
У меня виртуализация KVM + LVM поверх raid1, и я неоднократно был свидетелем того, как чтение с нескольких виртуальных машин идет на один и тот же диск, загружается на 100%, а другой диск в raid1 простаивает. (через iostat -x)
РЕДАКТИРОВАТЬ: вопрос также о нескольких процессах внутри ВМ. Произойдет ли балансировка чтения, даже если внутри ВМ?
Чтения сбалансированы? Если да, то по какому алгоритму?
Причина, по которой я спрашиваю, заключается в том, что в настоящее время я посвящаю между двумя вариантами
- LUKS поверх одного MD устройства
- MD поверх двух устройств LUKS
Второй вариант использует больше ресурсов процессора, но это не проблема.
2 ответа
Реализация RAID1 в Linux ускоряет операции чтения с диска, если одновременно выполняются две отдельные операции чтения с диска. Это означает, что чтение одного файла на RAID1 будет не быстрее, чем на одном диске, но чтение двух отдельных файлов одновременно будет быстрее.
Тест чтения выполнен с DD и отключен кэш чтения:
Test single file:
1048576000 copied @ 224MB/s
Test same file 2 transfers:
Test single file:
1048576000 copied @ 116MB/s
1048576000 copied @ 104MB/s
Test 2 files 2 transfers:
1048576000 copied @ 212MB/s
1048576000 copied @ 217MB/s
Что касается опций, LUKS поверх одного MD-устройства звучит более логично.
Проблема с чтением, которое происходит с того же диска, может быть изменена best_dist_disk
а также best_pending_disk
параметры. Вы можете увидеть полный пример здесь.
Если у вас есть только один поток последовательного ввода-вывода, алгоритм md RAID1 будет продолжать выбирать один и тот же диск. Со страницы руководства mdadm :
[На md RAID1] один поток последовательного ввода не будет ускоряться (например, один dd), но несколько последовательных потоков или случайная рабочая нагрузка будут использовать более одного шпинделя. Теоретически наличие N-дискового RAID1 позволит N последовательным потокам читать со всех дисков.
Вы можете прочитать исходный код ядра 5.10, чтобы увидеть алгоритм балансировки md RAID1 . Грубый обзор таков:
- Балансировка может происходить только в регионах, где имеется несколько синхронизированных и исправных дисков.
- Балансировка будет стараться избегать дисков, помеченных как «в основном пишут».
- Если последний ввод-вывод на диске завершился точно перед областью, которую нужно прочитать, балансировка продолжится с этим диском, если только размер нового ввода-вывода не станет слишком большим (вот почему одиночный последовательный поток не ускоряется).
- Если вышеописанное не дало нам диск, проверьте, не является ли какой-либо из дисков SSD или на каком-либо из дисков нет ожидающих операций ввода-вывода. Если любой из этих случаев верен, выберите диск с наименьшим количеством ожидающих операций ввода-вывода.
- Если приведенное выше не дало нам диска, выберите диск, который последним выполнял ввод-вывод, ближайший к желаемому месту чтения.