Сейчас появилось некоторое количество файловых систем, которые почему-то необоснованно относят к группе CoW (Copy-on-Write). Почему так получилось, и что что на самом деле есть Copy-on-Write?
Итак, начнем.
Механизм Read-Modify-Write
Для начала, мы разберем что такое RMW (Read-Modify-Write). Представим себе, что в нашей файловой системе каждый экстент данных должен иметь метаданные (для простоты, скажем что это контрольная сумма). Это классическое устройство механизма хранения данных контроля целостности в таких ФС как ZFS или BTRFS. При этом, размер экстента достаточно большой (16 … 64КБ), а ввод-вывод идет малыми блоками (4КБ).
Проблема в том, что мы не можем просто выполнить запись блока в середину экстента, потому что нам надо расчитать новую контрольную сумму. А во-вторых, экстент надо записать вместе с его метеданными (новой контрольной суммой).
В этот момент у нас и возникает то, что называется Read-Modify-Write: прочесть весь экстент (Read), изменить его в середине (Modify), просчитать новую контрольную сумму и выполнить запись экстента целиком (Write).
То есть RMW это механизм, используемый во всех случаях, когда для выполнения запись нужны дополнительные данные (собсвтенно, весь экстент), хранимые за границами модифицируемого блока.
Redirect-Write
Усложним задачу - экстенты имеют размер кратный степени двойки, но их метаданные тоже занимают некоторое место - и тогда у нас получается невыровненный ввод-вывод. Чтобы оптимизировать размещение экстентов и метаданных, метаданные помещают не непосредственно в экстент, а в другое место файловой системы. И тут (кто бы сомневался?!) возникает вторая проблема - атомарность модификации данных. Если данные и метаданные лежат в разных местах (или просто размер операции записи не равен размеру атомарной записи на диске), нам потребуется две записи - одна для данных экстента, а вторая для метаданных. И если между этими двумя операциями произойдет сбой, у нас будет некосистентная ФС - данные новые а контрольная сумма старая.
Эту проблему решают механизмом Redirect-Write: данные экстента записываются в новое (пустое) место, и затем в метаданные производится атомарная запись, включающая в себя новую контрольную сумму и новое расположение экстента. А старое место где данные экстента лежали раньше, помечаеся как свободное. Таким образом, если случится сбой между записью данных и последующей записью метаданных, то метаданные просто не обновятся и мы получим старые данные и старую контрольную сумму в метаданных.
Такой механизм используется в BTRFS и ZFS.
Таким образом, ZFS и BTRFS это не CoW а сочетание RMW + Redirect-Write. Ну или просто просто Redirect-Write.
Именно наличие Redirect-Write позволяет реализовать снапшоты малыми затратами производительности - достаточно просто старое место не освобождать, а оставить числиться как занятое снапшотом.
Таким образом, Redirect-Write используется как механизм обеспечения как регулярной записи, так и клонирующей записи.
Copy-on-Write
Классический механизм Copy-on-Write работает только для снапшотов или клонов. Он работает похоже на Redirect-Write, но с очень существенным отличием - новые данные пишутся в исходное место, а старые данные (копия) записываются в новое (пустое) место.
При этом, сначала случается Read экстента, затем Copy (запись исходной копии в новое место) и затем Write - запись измененных данных (не обязательно экстента целиком) в изначальное место. И если нам надо обеспечить атомарность записи, нам придется прибегать к дополнительным механизмам (например журналированию).
Так работают снапшоты LVM.
CoW - механизм старый и появился в те времена, когда выбирая между производительностью и возможностью некоторой неконсистентности данных в очень-очень редких случаях, выбирали производительность, задач поддержки большого количества версий/снапшотов не стояло, а сам снапшот предполагался как короткоживущая сущность на время бэкапа или каких-то работ.
Заключение
Если подытожить всё то, что было описано выше, то становится понятно, что:
-
Механизм CoW является технически более простым, может быть включен и отключен при необходимости, но платой за эту простоту будут потенциальные проблемы с целостностью данных и атомарностью записи в граничных случаях.
-
Redirect-Write позволяет достичь того же результата, что и CoW, но при этом обеспечивает лучшую надежность и гарантию записи, но требует существенно больше ресурсов - особенно для регулярной (обычной) конвенционной записи.
-
Называть ZFS и BTRFS Cow-based файловыми системами некорректно - они не CoW, они Redirect-Write. Они дают те же самые возможности, но они работают по совершенно другим принципам, но при этом потребляют намного больше ресурсов при обычной записи.
-
Если вам нужна быстрая обычная запись и снапшоты и клоны редки и короткоживущи - ваш выбор Copy-on-Write (LVM). Если снапшоты и клоны для вас скорее постоянное состояние - ваш выбор Redirect-Write (ZFS и BTRFS).