Как работает кэш записи с файловой системой, охватывающей диски с разными скоростями?

9

В современной системе Linux с несколькими дисками и программным RAID, охватывающим как медленные (HDD), так и быстрые (SSD) диски, как кэшируются записи в файловую систему?

Для мкра-рейды RAID1 массив может быть сконфигурирован с дисками , как --write-mostlyи --write-behindчто говорит о том , что читает выполняется с более быстрым диска, и что записи на более медленный диск могут отставать. Но как это кэшируется на уровне ядра? Кеширует ли ядро ​​запись диска до или после слоя md-raid? В конце вызова write () гарантируется ли запись данных на один из --write-behindдисков?

Для btrfsRAID1, как будет выглядеть такая же ситуация? Функциональности нет --write-behind, поэтому подсчитываются ли грязные страницы на уровне устройства или файловой системы? В какой момент функция write () вернется?

Как vm.dirty_*ratioнастраиваемые параметры влияют на эти настройки?

Стивен Дэвис
источник

Ответы:

7

--write-mostly, --write-behindОбрабатывается mdдрайвером внутренне. mdхранит метаданные, такие как битовая карта с намерением записи (которая является обязательной для функции обратной записи), которая в основном записывает, какие данные были записаны, а какие отсутствуют. Это необходимо в случае, когда происходит сбой питания, когда данные еще не достигли устройств записи. В этом случае затронутая область данных будет повторно синхронизирована (в вашем случае чтение с SSD, запись на HDD).

Но как это кэшируется на уровне ядра?

В случае обратной записи драйвер md в основном дублирует внутренний запрос записи. Основной запрос на запись отправляется на основной диск (и) и сообщает верхним уровням: «Хорошо, я уже сделал это»; скопированный запрос на запись остается неизменным для стороны RAID для записи в основном позади, и его выполнение может занять больше времени, мы надеемся, что никто об этом не заметит.

Затем уровень raid делает много шагов, чтобы убедиться, что никакие данные не будут прочитаны с устройства записи в основном, пока в очереди все еще находятся ожидающие запросы на запись. Почему данные будут считываться с устройства записи? Ну, SSD, возможно, вышел из строя, так что это все, что осталось. Это сложно, и в процессе записи приводятся некоторые угловые случаи.

Возможно, именно поэтому он поддерживается только для уровня RAID-1, а не для всех остальных. Хотя теоретически может иметь смысл иметь твердотельные накопители в виде RAID-0 и два жестких диска с четностью в режиме с обратной записью, для RAID-6 с такой записью такая поддержка отсутствует. Это только RAID-1 и редко используется даже там.

Это не влияет на другие параметры кэша, в основном общий механизм кэширования не заботится о том, как mdдрайвер реализовал вещи внутренне. Кэш делает свое дело, а md делает свое дело. Таким образом, кэш файловой системы работает одинаково для файловой системы поверх md против файловой системы поверх чистого диска. (Реальность немного сложнее, но вы можете думать об этом так.)

frostschutz
источник
3

Для мкра-рейды RAID1 массив может быть сконфигурирован с дисками , как --write-mostlyи --write-behindчто говорит о том , что читает выполняется с более быстрым диска, и что записи на более медленный диск могут отставать. Но как это кэшируется на уровне ядра? Кеширует ли ядро ​​запись диска до или после слоя md-raid?

После, так как эта функция специфична для md-raid.

Вы должны думать об этой функции md-raid как о буферизации, а не о кешировании. Он ограничен следующей mdadmопцией:

--write-за =

Укажите, что режим записи должен быть включен (действительно только для RAID1). Если указан аргумент, он установит максимально допустимое число ожидающих записей. Значение по умолчанию - 256.

Я могу только думать, что это также ограничено нормальным ядром и аппаратной буферизацией (то есть, если это меньше). Нормальная буферизация ядра ограничена nr_requestsи max_hw_sectors_kb. См /sys/class/block/$write_behind_device/queue/. Под аппаратной буферизацией я подразумеваю кэш записи на диске.

В конце вызова write () гарантируется ли запись данных на один из --write-behindдисков?

Конечно, предполагая, что вы имеете в виду write () для файла, открытого с помощью O_SYNC / O_DSYNC, или вы действительно имели в виду write () + fsync (). Если нет, то гарантии вообще не применяются.

sourcejedi
источник
Спасибо, но это ставит другой вопрос: если файл был открыт с помощью O_SYNC, возвращает ли write () после того, как был записан первый диск, или все диски были записаны в этом случае?
Стивен Дэвис
3
предварительные записи на диски без записи должны завершаться первыми
sourcejedi