Я пытаюсь найти узкое место при восстановлении программного рейда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, которые встроены между блоками данных на этих дисках.
В дополнение к этому я ожидал бы несколько последовательную операцию (= не полную параллельную), например:
не менее 5. - это точка синхронизации, поэтому длительность (1..4) не менее длительности (самая медленная (1..4)). Насколько хорошо он работает, определяется уровнем распараллеливания любого задействованного уровня (MD, драйвер, контроллер (ncq и т. Д.)).
Я бы никогда не ожидал, что скорость восстановления raid6 приблизится к времени последовательного чтения / записи отдельных дисков.
Для сравнения: нашим массивам PS6000 Equallogic (16x1TB) требуется около 32 часов при умеренной нагрузке для восстановления отказавшего диска.