MD Raid 1 алгоритм балансировки чтения

Я искал через Google, но не нашел никакой информации об алгоритме балансировки чтения для MD raid1.

Несколько лет назад я, возможно, читал где-то, что он использует hashing the process id определить, какое устройство он использует, но я не уверен.

У меня виртуализация KVM + LVM поверх raid1, и я неоднократно был свидетелем того, как чтение с нескольких виртуальных машин идет на один и тот же диск, загружается на 100%, а другой диск в raid1 простаивает. (через iostat -x)

РЕДАКТИРОВАТЬ: вопрос также о нескольких процессах внутри ВМ. Произойдет ли балансировка чтения, даже если внутри ВМ?

Чтения сбалансированы? Если да, то по какому алгоритму?

Причина, по которой я спрашиваю, заключается в том, что в настоящее время я посвящаю между двумя вариантами

  1. LUKS поверх одного MD устройства
  2. 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 или на каком-либо из дисков нет ожидающих операций ввода-вывода. Если любой из этих случаев верен, выберите диск с наименьшим количеством ожидающих операций ввода-вывода.
  • Если приведенное выше не дало нам диска, выберите диск, который последним выполнял ввод-вывод, ближайший к желаемому месту чтения.
Другие вопросы по тегам