Можно реализовать журнал с одним fsync per commits?

StackOverflow https://stackoverflow.com/questions/3800108

  •  25-09-2019
  •  | 
  •  

Вопрос

Допустим, вы создаете систему хранения журналов для журналов журнала / записи. Можете ли вы просто реализовать это по (для каждой транзакции), добавляя данные (с помощью записи (2)), добавляя маркер Commit, а затем fsync-ing?

Сценарий для рассмотрения, если вы сделаете большой набор пишет в этот журнал, то Fsync это, и есть сбой во время fsync.. Отказ Находятся ли прямые / косвенные блоки INODE, промывают только после того, как все блоки данных покрасны, или нет никаких гарантий, что блоки промываются в порядке? Если последний, то во время восстановления, если вы видите маркер фиксации в конце файла, вы не можете доверять, что данные между ним и предыдущим коммитным маркером имеют смысл. Таким образом, вы должны полагаться на другой механизм (с участием, по меньшей мере, еще одного fsync), чтобы определить, какую степень файла журнала соответствует (например, запись / fsyncing данных, затем запись / fsyning comment marker).

Если это имеет значение, в основном интересуясь о ext3 / ext4 в качестве контекста.

Это было полезно?

Решение

Обратите внимание, что FSYNC Linux и Mac OS и FSATASYNC неверны по умолчанию. Windows верна по умолчанию, но может эмулировать Linux для сравнительных целей.

Кроме того, FDatasync выпускает несколько пишет диска, если вы добавляете до конца файла, поскольку ему необходимо обновить файл inode с новой длиной. Если вы хотите, чтобы одна написать за совершение, ваша лучшая ставка состоит в том, чтобы предварительно распределить пространство журнала, хранить CRC записей журнала в маркеру Commit, а также выдать один FDatasync () в Commit. Таким образом, независимо от того, сколько стоит переупорядочить ОС / оборудование за спиной, вы можете найти префикс журнала, который фактически ударит диск.

Если вы хотите использовать журнал для прочных коммуникаций или писать вперед, все становится все сложнее, поскольку вам нужно убедиться, что Fsync на самом деле работает. Под Linux вы захотите отключить кэш-память диска с помощью HDPARM или установить раздел с помощью барьера настроен на TRUE. [РЕДАКТИРОВАНИЕ: Я постоянно исправляю, барьер, кажется, не дает правильную семантику. SATA и SCSI Введует ряд примитивов, таких как барьеры для записи и на родной очередь команды, которые позволяют операционным системам экспортировать примитивы, которые включают в себя журнал записи. От того, что я могу сказать от Mainpages и онлайн, Linux обнаруживает их только для разработчиков файловой системы, а не для пользовательского пространства.

Как ни парадоксально, отключение кэша записи на диске иногда приводит к лучшей производительности, поскольку вы получаете больше контроля над планированием записи в пространстве пользователя; Если дисковые очереди вверх по группам синхронных запросов на запись, вы в конечном итоге разоблачите странные латентные шипы на приложение. Отключение кэша записи предотвращает это.

Наконец, Real Systems используют группу Commit, и сделайте <1 Sync Write Per Commit с одновременными рабочими нагрузками.

Другие советы

Там нет гарантии на порядок, в котором блоки промывают на диск. В наши дни даже сам диск может заказать блоки на пути к плунду.

Если вы хотите обеспечить заказа, вам необходимо хотя бы fdatasync() между пишетами, которые вы хотите заказано. Все обещания синхронизации в том, что Когда он возвращает, Все написано до того, как синхронизация ударила хранилище.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top