Введение

Команда Unix commit all data in the kernel filesystem to non volatile storage buffers sync - стандартный системный вызов в операционной системе Unix, который передает все данные из буферов файловой системы ядра в нелетальное хранилище, то есть данные, которые были запланированы для записи через системные вызовы ввода-вывода низкого уровня. Высшие уровни ввода/вывода, такие как stdio, могут поддерживать отдельные собственные буферы. Как функция в C, вызов синхронизации обычно объявляется как void sync ((void) в <unistd. h>. Системный вызов также доступен через утилиту командной строки, также называемую sync, и аналогично названные функции в других языках, таких как Perl и Node. js (в модуле fs). Соответствующий системный вызов fsync записывает только буферизированные данные, относящиеся к определенному описателю файла. fdatasync также доступен для записи только изменений, внесенных в данные файла, и не обязательно связанных с ним метаданных файла. Некоторые системы Unix запускают своего рода флеш или обновление демона, который регулярно вызывает функцию синхронизации. На некоторых системах это делает демон cron, а на Linux это делал демон pdflush, который был заменен новой реализацией и, наконец, удален из ядра Linux в 2012 году. Буферы также очищаются, когда файловые системы демонтированы или перемонтированы только для чтения, например, до отключения системы. Некоторые приложения, такие как LibreOffice, также используют функцию синхронизации для сохранения информации о восстановлении в интервале.

Использование базы данных

Для обеспечения надлежащей долговечности базы данных должны использовать некоторую форму синхронизации, чтобы убедиться, что записанная информация попала в нелетучее хранилище, а не просто хранится в кэше записи на основе памяти, который будет потерян при отключении электроэнергии. Например, PostgreSQL может использовать множество различных вызовов синхронизации, включая fsync и fdatasync, чтобы коммиты были долговечными. К сожалению, для любого отдельного клиента, записывающего серию записей, вращающийся жесткий диск может совершать только один раз за вращение, что в лучшем случае составляет несколько сотен таких сделок в секунду. Поэтому отключение требования fsync может значительно улучшить производительность коммита, но за счет потенциального введения повреждения базы данных после сбоя. Базы данных также используют файлы журналов транзакций (обычно намного меньше, чем основные файлы данных), которые содержат информацию о недавних изменениях, так что изменения могут быть надежно переделаны в случае сбоя; тогда основные файлы данных могут синхронизироваться реже.

Отчет об ошибках и проверка

Чтобы избежать потери данных, следует проверить возвращаемые значения fsync, поскольку при выполнении операций ввода/вывода, буферируемых библиотекой или ядром, ошибки могут не сообщаться во время использования системного вызова записи или вызова fflush, поскольку данные могут не записываться в нелетучее хранилище, а только записываться в кэш страницы памяти. Ошибки от записей часто сообщаются во время системных вызовов fsync, msync или close До 2018 года поведение fsync в Linux при определенных обстоятельствах не сообщало о состоянии ошибки, изменение поведения было предложено 23 апреля 2018 года.

Споры о результатах

Жесткие диски могут по умолчанию использовать свой собственный летучий кэш для буфера записей, что значительно улучшает производительность, в то же время вводя потенциал для потерянных записей. Такие инструменты, как hdparm F, будут инструктировать контроллер жесткого диска очистить буфер кэша записи на дискете. Влияние на производительность отключения кэширования настолько велико, что даже обычно консервативное сообщество FreeBSD отказалось отключить кэширование записи по умолчанию в FreeBSD 4.3. В SCSI и SATA с Native Command Queuing (но не в обычном ATA, даже с TCQ) хост может указать, хочет ли он быть уведомленным о завершении, когда данные попадают на блюда диска или когда они попадают в буфер диска (в бортовом кэше). Предполагая правильную реализацию аппаратного обеспечения, эта функция позволяет использовать кэш-память диска, гарантируя правильную семантику для системных вызовов, таких как fsync. Эта аппаратная функция называется Force Unit Access (FUA) и позволяет обеспечить согласованность с меньшими накладными расходами, чем очистка всего кэша, как это делается для дисков ATA (или SATA, не NCQ). Хотя Linux включил NCQ около 2007 года, он не включил SATA/NCQ FUA до 2012 года, сославшись на отсутствие поддержки на ранних дисках. Firefox 3.0, выпущенный в 2008 году, ввел системные вызовы fsync, которые, как было установлено, ухудшали его производительность; вызов был введен для того, чтобы гарантировать целостность встроенной базы данных SQLite. Главный технический директор Linux Foundation Теодор Цо утверждает, что нет необходимости "бояться fsync", и что истинная причина замедления Firefox 3 - чрезмерное использование fsync. Он также признает, однако (цитируя Майка Шевера), что на некоторых довольно распространенных конфигурациях Linux, особенно используя файловую систему ext3 в режиме "data=ordered", вызов fsync не просто вычищает данные для файла, на который он вызван, а скорее на все буферные данные для этой файловой системы.