Вопрос или проблема
Я пытаюсь настроить MD RAID1 (с использованием mdadm) с опцией --write-mostly
так, чтобы сетевой (EBS) том и локальный диск были зеркалами друг друга (идея заключается в том, что локальный диск является эпhemeral для моего экземпляра, но имеет лучшую производительность).
Чтобы проверить эту идею, я получаю базовую оценку производительности моего диска с помощью следующих двух скриптов.
fio -name=RandWrite -group_reporting -allow_file_create=0 \
-direct=1 -iodepth=128 -rw=randwrite -ioengine=io_uring -bs=32k \
-time_based=1 -ramp_time=10 -runtime 10 -numjobs=8 \
-randrepeat=0 -norandommap=1 -filename=$BENCHMARK_TARGET
# Производительность чтения
fio -name=RandRead -group_reporting -allow_file_create=0 \
-direct=1 -iodepth=128 -rw=randread -ioengine=io_uring -bs=32k \
-time_based=1 -ramp_time=10 -runtime 10 -numjobs=8 \
-randrepeat=0 -norandommap=1 -filename=$BENCHMARK_TARGET
Результаты:
- Сетевой диск: 117 MiB/s запись, 117 MiB/s чтение
- Локальный диск: 862 MiB/s запись, 665 MiB/s чтение
Проблема возникает, когда я ввожу mdadm. Даже при использовании тривиального беззеркального “RAID1” производительность записи значительно хуже при использовании сетевого диска.
mdadm --build /dev/md0 --verbose --level=1 --force --raid-devices=1 "$TARGET"
# mdadm --detail /dev/md0
/dev/md0:
Версия :
Время создания : Пн 30 Сен 14:22:41 2024
Уровень RAID : raid1
Размер массива : 10485760 (10.00 GiB 10.74 GB)
Использованный размер устройства : 10485760 (10.00 GiB 10.74 GB)
Устройства RAID : 1
Всего устройств : 1
Состояние : чистое
Активные устройства : 1
Рабочие устройства : 1
Устройства с ошибками : 0
Резервные устройства : 0
Политика согласованности : resync
Номер Основной Вторичный Устройство RAID Состояние
0 8 16 0 активная синхронизация /dev/sdb
- 0-зеркальный массив RAID1, основанный на сетевом диске: 69.9 MiB/s запись, 118 MiB/s чтение
- 0-зеркальный массив RAID1, основанный на локальном диске: 868 MiB/s запись, 665 MiB/s чтение
Как мы видим, производительность записи массива значительно ухудшена по сравнению с производительностью сырых дисков, и ухудшение происходит только при использовании сетевого диска, а не при использовании локального диска. Почему это происходит?
Не зная точной реализации mdadm, я напишу свою образовательную догадку по этому поводу.
Я думаю, что в настройке RAID 1 подсистема RAID ждет, пока оба диска подтвердят операции записи, прежде чем обрабатывать следующие события файлов. А затем могут быть дополнительные задержки, вызванные несоответствием производительности между дисками, что приведет к разнице в скорости записи 69.9 MiB/s против 117 MiB/s.
Я не думаю, что целесообразно создавать RAID-массивы с устройствами, где скорость доступа значительно отличается. RAID не был разработан для этого случая использования.
Возможно, вам стоит обратить внимание на кластерную файловую систему, такую как GFS2 или OCFS2, они могут лучше подойти для вашего случая использования.
Ответ или решение
Причины, по которым производительность записи в MD RAID1 значительно ниже, чем при работе с отдельным диском, связаны с несколькими аспектами, касающимися особенностей реализации RAID и взаимодействия с дисками с разными скоростями.
-
Синхронизация записи: При записи данных в массив RAID1, контроллер RAID должен дождаться подтверждения записи от всех устройств, входящих в массив. Когда одно из устройств значительно медленнее (например, сетевой диск EBS), это замедляет весь процесс записи, поскольку RAID-система не может перейти к следующему блоку данных, пока все устройства не завершат текущую операцию записи. Таким образом, при использовании сетевого диска, который имеет более низкую производительность записи, задержки в выполнении операций записи на RAID1 становятся заметными.
-
Неравномерные скорости дисков: Если один из дисков в RAID1 (в вашем случае, сетевой диск) работает медленнее, чем другой (локальный диск), это может привести к тому, что RAID1 будет перезаписывать данные в соответствии с медленным диском, что ухудшает производительность. RAID не предназначен для работы с дисками, у которых скорость доступа существенно различается.
-
Сетевые задержки: Использование сетевого диска (например, EBS) добавляет дополнительную компоненту задержки, связанную с сетевыми операциями. Эти задержки могут быть вызваны как сетевым протоколом, так и ежедневными переменными, такими как загруженность сети и длина маршрута передачи данных.
-
Контекст переключения и накладные расходы: Реализация RAID требует дополнительных вычислительных ресурсов и переключения контекста, чтобы управлять массивом. Хотя это может незначительно повлиять на производительность при работе с локальными дисками, разница в скорости доступа между локальным и сетевым дисками может значительно усугубить ситуацию при высоких нагрузках.
-
Оптимизация процессов: Для повышения производительности записи в RAID-массивах рекомендуется использовать диски с сопоставимой или близкой скоростью доступа. Если один из дисков будет значительно медленнее, как в вашем случае, это будет неэффективно. Возможно, стоит рассмотреть использование систем управления файлами, таких как GFS2 или OCFS2, которые могут быть более адаптированы для работы в средах с различной производительностью дисков, особенно если вы стремитесь оптимизировать производительность при использовании сетевых хранилищ.
В заключение, разница в производительности записи между MD RAID1 и отдельными дисками в вашей конфигурации в значительной степени обусловлена необходимостью синхронизации между медленным сетевым диском и быстрым локальным диском, а также дополнительными задержками, возникающими при взаимодействии с сетевыми устройствами. Рекомендуется пересмотреть конфигурацию RAID, чтобы добиться лучшей производительности, или рассмотреть альтернативные решения для работы с данными.