Обратите внимание, что fuxync и fdatasync в linux и mac os по умолчанию некорректны. Windows верна по умолчанию, но может эмулировать linux для целей тестирования.
Кроме того, fdatasync выдает несколько операций записи на диск, если вы добавляете в конец файла, так как ему необходимо обновить inode файла с новой длиной. Если вы хотите иметь одну запись для каждого коммита, лучше всего заранее выделить место в журнале, сохранить CRC записей журнала в маркере фиксации и выполнить одну функцию fdatasync () при фиксации. Таким образом, независимо от того, сколько ОС / аппаратного упорядочения за вашей спиной, вы можете найти префикс журнала, который фактически ударил по диску.
Если вы хотите использовать журнал для длительных фиксаций или писать вперед, все становится сложнее, поскольку вам нужно убедиться, что fsync действительно работает. В Linux вы захотите отключить кэш записи диска с помощью hdparm или смонтировать раздел с установленным в true барьером. [Редактировать: Я исправлен, барьер, кажется, не дает правильную семантику. SATA и SCSI вводят ряд примитивов, таких как барьеры записи и собственные очереди команд, которые позволяют операционным системам экспортировать примитивы, которые позволяют вести запись с опережением записи. Судя по тому, что я могу узнать из man-страниц и онлайн, Linux предоставляет их только разработчикам файловых систем, а не пользователям.]
Как это ни парадоксально, отключение кэша записи на диск иногда приводит к повышению производительности, поскольку вы получаете больший контроль над планированием записи в пространстве пользователя; если диск ставит в очередь кучу синхронных запросов на запись, вы в конечном итоге подвергаете приложение странным скачкам задержки. Отключение кэша записи предотвращает это.
Наконец, реальные системы используют групповую фиксацию и выполняют <1 синхронную запись на коммит с одновременными рабочими нагрузками. </p>