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

Повторная синхронизация RAID6 с быстрой записью, но медленным чтением

Я использую Debian Jessie.

# uname -a
Linux host 4.9.0-0.bpo.3-amd64 #1 SMP Debian 4.9.30-2+deb9u5~bpo8+1 (2017-09-28) x86_64 GNU/Linux

И настроили RAID6.

# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid1]
md0 : active raid6 sda[0] sdd[3] sdc[2] sdb[1]
      19532611584 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/4] [UUUU]
      bitmap: 1/73 pages [4KB], 65536KB chunk

Это 4x Seagate Enterprise 10 ТБ, 7200 об / мин. При копировании большого файла из массива RAID на внутренний системный диск (который является SSD) я получаю среднюю пропускную способность 220 МБ / с. Копирование больших файлов с SSD в массив выполняется со скоростью 145 МБ / с. Когда ежемесячная проверка RAID завершена (запускается при выполнении задания cron checkarray --cron --all --idle --quiet что является поведением по умолчанию) я вижу

# cat /proc/mdstat                                                                                                                                                 Personalities : [raid6] [raid5] [raid4] [raid1]
md0 : active raid6 sda[0] sdd[3] sdc[2] sdb[1]
      19532611584 blocks super 1.2 level 6, 512k chunk, algorithm 2 [4/4] [UUUU]
      [>....................]  check =  0.7% (72485728/9766305792) finish=817.2min speed=197694K/sec
      bitmap: 1/73 pages [4KB], 65536KB chunk

Так что скорость повторной синхронизации тоже отличная. Теперь наблюдается странное поведение. Пока выполняется проверка, я могу записывать данные в массив параллельно с хорошей производительностью. Скорость записи составляет ~ 100 МБ / с, и видно, что скорость синхронизации RAID снижается. После завершения копирования в массив скорость синхронизации снова увеличилась до предыдущей. Проблема в том читает из массива во время проверки. Чтения выполняются со скоростью <20 МБ / с. И скорость ресинхронизации для RAID не снижается. Понятия не имею, в чем причина этого.

# ps aux | grep md0
root       211  0.4  0.0      0     0 ?        S    Okt22  93:40 [md0_raid6]
root       648  0.0  0.0      0     0 ?        S    Okt22   0:01 [jbd2/md0-8]
root     15361  4.4  0.0      0     0 ?        DN   02:25   0:00 [md6_resync]
root     15401  0.0  0.0  12752  2040 pts/2    S+   02:26   0:00 grep md6
# ionice -p 211
none: prio 0
# ionice -p 15361
idle

Процесс повторной синхронизации установлен на idle что правильно. Планировщик ввода / вывода настроен на CFQ для всех нижележащих физических дисков.

В этой системе также есть RAID1

# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid1]
md1 : active raid1 sde[0] sdf[1]
      3906887488 blocks super 1.2 [2/2] [UU]
      bitmap: 2/30 pages [8KB], 65536KB chunk

С этим массивом проблем нет. Я могу писать и читать из массива с хорошей скоростью, пока выполняется проверка. Смотреть /proc/mdstat, скорость синхронизации уменьшается при активности ввода-вывода и увеличивается после повторного завершения. Но не для чтения ввода-вывода на md0/ RAID6. Что касается md0 нормальная скорость синхронизации очень хорошая, нормальные операции чтения и записи без повторной синхронизации хороши, и даже запись в массив при выполнении проверки RAID очень хороша, почему читается так плохо при ежемесячной проверке?

Позвольте мне начать с того, что я понятия не имею о mdadm или Debian - однако я думаю, что эффект, который вы наблюдаете, является очень общим.

Обычно скорость записи ниже, чем скорость чтения, если вы посмотрите, как работает RAID 6: при чтении все четыре диска могут быть прочитаны одновременно. Данные четности пропускаются, и вместо этого следующий сегмент данных может быть предварительно прочитан в кэш. Наилучшая скорость чтения, которую можно достичь, это п раз скорость одного диска.

При записи данные дополняются двумя разными сегментами четности, которые также необходимо записать на диск. Когда все диски записывают одновременно, наилучшая скорость п-2 раза больше одиночной скорости.

Повторная синхронизация или восстановление RAID 6 с использованием нескольких больших дисков займет много времени. По сути, каждая полоса должна быть прочитана и сравнена с данными избыточности, которые также хранятся на дисках. Диски сильно загружены, и любой продуктивный ввод-вывод должен конкурировать со всеми чтениями. Вот почему чтение происходит медленно. Чтобы иметь приличную задержку чтения, фоновая синхронизация должна выполняться с низким приоритетом, то есть она должна останавливаться и приостанавливаться на мгновение, когда обнаруживается другой ввод-вывод.

С другой стороны, записи сначала попадают в кеш и, кажется, сразу же завершаются - пока есть доступный кеш. Настоящая запись рано или поздно произойдет в фоновом режиме. Только когда ваш объем записи превысит емкость кеширования, вы заметите серьезное замедление.

Чтобы получить скорость чтения на достойном уровне во время повторной синхронизации, вам необходимо запустить фоновую проверку в медленном темпе, чтобы начать с нее, или найти способ приостановить ее, когда будут выполнены продуктивные чтения.