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

Программный RAID6 для Linux: восстановление медленно

Я пытаюсь найти узкое место при восстановлении программного рейда6.

## Pause rebuilding when measuring raw I/O performance
# echo 1 > /proc/sys/dev/raid/speed_limit_min
# echo 1 > /proc/sys/dev/raid/speed_limit_max
## Drop caches so that does not interfere with measuring
# sync ; echo 3 | tee /proc/sys/vm/drop_caches >/dev/null
# time parallel -j0 "dd if=/dev/{} bs=256k count=4000 | cat >/dev/null" ::: sdbd sdbc sdbf sdbm sdbl sdbk sdbe sdbj sdbh sdbg 
4000+0 records in
4000+0 records out
1048576000 bytes (1.0 GB) copied, 7.30336 s, 144 MB/s
[... similar for each disk ...]
# time parallel -j0 "dd if=/dev/{} skip=15000000 bs=256k count=4000 | cat >/dev/null" ::: sdbd sdbc sdbf sdbm sdbl sdbk sdbe sdbj sdbh sdbg 
4000+0 records in
4000+0 records out
1048576000 bytes (1.0 GB) copied, 12.7991 s, 81.9 MB/s
[... similar for each disk ...]

Таким образом, мы можем читать последовательно со скоростью 140 МБ / с на внешних дорожках и 82 МБ / с на внутренних дорожках на всех дисках одновременно. Производительность последовательной записи аналогична.

Это заставило бы меня ожидать, что скорость восстановления будет 82 МБ / с или больше.

# echo 800000 > /proc/sys/dev/raid/speed_limit_min
# echo 800000 > /proc/sys/dev/raid/speed_limit_max
# cat /proc/mdstat
md2 : active raid6 sdbd[10](S) sdbc[9] sdbf[0] sdbm[8] sdbl[7] sdbk[6] sdbe[11] sdbj[4] sdbi[3](F) sdbh[2] sdbg[1]
      27349121408 blocks super 1.2 level 6, 128k chunk, algorithm 2 [9/8] [UUU_UUUUU]
      [=========>...........]  recovery = 47.3% (1849905884/3907017344) finish=855.9min speed=40054K/sec

Но мы получаем всего 40 МБ / с. И часто это падает до 30 МБ / с.

# iostat -dkx 1
sdbc              0.00  8023.00    0.00  329.00     0.00 33408.00   203.09     0.70    2.12   1.06  34.80
sdbd              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sdbe             13.00     0.00 8334.00    0.00 33388.00     0.00     8.01     0.65    0.08   0.06  47.20
sdbf              0.00     0.00 8348.00    0.00 33388.00     0.00     8.00     0.58    0.07   0.06  48.00
sdbg             16.00     0.00 8331.00    0.00 33388.00     0.00     8.02     0.71    0.09   0.06  48.80
sdbh            961.00     0.00 8314.00    0.00 37100.00     0.00     8.92     0.93    0.11   0.07  54.80
sdbj             70.00     0.00 8276.00    0.00 33384.00     0.00     8.07     0.78    0.10   0.06  48.40
sdbk            124.00     0.00 8221.00    0.00 33380.00     0.00     8.12     0.88    0.11   0.06  47.20
sdbl             83.00     0.00 8262.00    0.00 33380.00     0.00     8.08     0.96    0.12   0.06  47.60
sdbm              0.00     0.00 8344.00    0.00 33376.00     0.00     8.00     0.56    0.07   0.06  47.60

iostat говорит, что диски заняты не на 100% (а только на 40-50%). Это согласуется с гипотезой о том, что максимальная скорость составляет около 80 МБ / с.

Поскольку это программный рейд, ограничивающим фактором может быть ЦП. top говорит:

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                              
38520 root      20   0     0    0    0 R   64  0.0   2947:50 md2_raid6
 6117 root      20   0     0    0    0 D   53  0.0 473:25.96 md2_resync

Так md2_raid6 и md2_resync явно заняты, занимая 64% и 53% ЦП соответственно, но не на 100%.

Размер блока (128 КБ) RAID был выбран после измерения того, какой размер блока дает наименьшие потери ЦП.

Если эта скорость нормальная: что является ограничивающим фактором? Могу я это измерить?

Если эта скорость ненормальная: как мне найти ограничивающий фактор? Могу я это изменить?

Я не помню точно, какие скорости были у меня, когда я переходил на 6-дисковый RAID 6 с 4-х дискового RAID 5, но они были похожи (полезный массив 4 ТБ, 24-часовая перестройка, около 45 МБ / с).

Вы должны помнить, что даже speed_limit_min будет отдавать приоритет приложениям, которые пытаются использовать массив. Таким образом, механизм, используемый для обнаружения активности, может потребовать 50% нагрузки на диски, чтобы обнаружить ее, и при этом иметь возможность обслуживать запросы ввода-вывода. Вы пробовали размонтировать раздел?

Чтобы проверить наличие узких мест, вам необходимо отследить ядро ​​(например, с помощью Linux Tracing Toolkit lttng, или System Tap). Это непросто и займет много времени, поэтому, если вам не нужно перестраивать массивы на нескольких компьютерах, это, вероятно, того не стоит. Что касается его изменения: уверен, такие патчи к ядру Linux будут приветствоваться :)

Я не ожидал, что операция восстановления Raid6 будет носить последовательный характер, поскольку обычно требуется восстановление контрольных сумм и блоков данных с дисков n-1, которые встроены между блоками данных на этих дисках.

В дополнение к этому я ожидал бы несколько последовательную операцию (= не полную параллельную), например:

  1. читать datablock1
  2. читать datablock2 ...
  3. читать datablockn-1
  4. прочитать контрольную сумму1
  5. рассчитать блок данных
  6. написать блок данных

не менее 5. - это точка синхронизации, поэтому длительность (1..4) не менее длительности (самая медленная (1..4)). Насколько хорошо он работает, определяется уровнем распараллеливания любого задействованного уровня (MD, драйвер, контроллер (ncq и т. Д.)).

Я бы никогда не ожидал, что скорость восстановления raid6 приблизится к времени последовательного чтения / записи отдельных дисков.

Для сравнения: нашим массивам PS6000 Equallogic (16x1TB) требуется около 32 часов при умеренной нагрузке для восстановления отказавшего диска.