Что такое fsync linux

8.4. Функции fsync() и fdatasync(): очистка дисковых буферов

8.4. Функции fsync() и fdatasync(): очистка дисковых буферов

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

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

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

Для реализации такого поведения ОС Linux предоставляет системный вызов fsync(). Эта функция принимает один аргумент — дескриптор записываемого файла — и принудительно переносит на диск все данные этого файла, находящиеся в кэш-буфере. Функция не завершается до тех пор, пока данные не окажутся на диске.

В листинге 8.3 показана функция, использующая данный системный вызов. Она записывает переданную ей строку в журнальный файл.

Листинг 8.3. (write_journal_entry.c) Запись строки в журнальный файл с последующей синхронизацией

const char* journal_filename = «journal.log»;

void write_journal_entry(char* entry) <

O_WRONLY | O_CREAT | O_APPEND, 0660);

write(fd, entry, strlen(entry));

Аналогичное действие выполняет другой системный вызов: fdatasync(). Но если функция fsync() гарантирует, что дата модификации файла будет обновлена, то функция fdatasync() этого не делает, а лишь гарантирует запись данных. В принципе это означает, что функция fdatasync() способна выполняться быстрее, чем fsync(), так как ей требуется выполнить одну операцию записи на диск, а не две. Но в настоящее время в Linux обе функции работают одинаково, обновляя дату модификации.

Файл можно также открыть в режиме синхронного ввода-вывода, при котором все операции записи будут немедленно фиксироваться на диске. Для этого в функции open() следует указать флаг O_SYNC.

Читайте также

Буферы и заголовки буферов

Буферы и заголовки буферов Когда блок хранится в памяти (скажем, после считывания или в ожидании записи), то он хранится в структуре данных, называемой буфером (buffer). Каждый буфер связан строго с одним блоком. Буфер играет роль объекта, который представляет блок в

3.2 СТРУКТУРА ОБЛАСТИ БУФЕРОВ (БУФЕРНОГО ПУЛА)

3.2 СТРУКТУРА ОБЛАСТИ БУФЕРОВ (БУФЕРНОГО ПУЛА) Ядро помещает информацию в область буферов, используя алгоритм поиска буферов, к которым наиболее долго не было обращений: после выделения буфера дисковому блоку нельзя использовать этот буфер для другого блока до тех пор,

Читайте также:  Caramba switcher для mac os аналоги

3.4 ЧТЕНИЕ И ЗАПИСЬ ДИСКОВЫХ БЛОКОВ

3.4 ЧТЕНИЕ И ЗАПИСЬ ДИСКОВЫХ БЛОКОВ Теперь, когда алгоритм выделения буферов нами уже рассмотрен, будет легче понять процедуру чтения и записи дисковых блоков. Чтобы считать дисковый блок (Рисунок 3.13), процесс использует алгоритм getblk для поиска блока в буферном кеше. Если

4.7 ВЫДЕЛЕНИЕ ДИСКОВЫХ БЛОКОВ

4.7 ВЫДЕЛЕНИЕ ДИСКОВЫХ БЛОКОВ Когда процесс записывает данные в файл, ядро должно выделять из файловой системы дисковые блоки под информационные блоки прямой адресации и иногда под блоки косвенной адресации. Суперблок файловой системы содержит массив, используемый для

Очистка диска

Очистка диска Говорят, что жесткий диск – «зеркало души» пользователя. Файлы у нерях всегда разбросаны как попало, «чайники» вообще с трудом представляют, что и где у них вообще может находиться. И лишь у опытных пользователей все разложено по полочкам, удобно и

Очистка диска

Очистка диска Для удаления информации с CD-RW щелкните мышью на команде Очистка диска меню Инструменты. Откроется окно Очистка диска (рис. 9.14).С помощью переключателя Выберите необходимый способ очистки укажите нужный способ очистки перезаписываемого

Очистка ячеек

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

10.11. Несколько буферов

10.11. Несколько буферов Во многих программах, обрабатывающих какие-либо данные, можно встретить цикл видаwhile ((n = read(fdin, buff, BUFFSIZE)) > 0) < /* обработка данных */ write(fdout, buff, n);>Например, программы, обрабатывающие текстовые файлы, считывают строку из входного файла, выполняют с ней

2.2.7.1 . Зеркалирование дисковых областей

2.2.7.1 . Зеркалирование дисковых областей Зеркалирование в INFORMIX-OnLine DS — это дублирование связной дисковой области, выделенной под базу данных, на такую же по размеру область. Исходная область называется первичной, а ее копия — зеркальной. Цели, для которых применяется

9.1. Очистка CD/DVD

9.1. Очистка CD/DVD Рассмотрим подробно задачу очистки дисков, которая находится в категории Extras (Дополнения). Прежде всего надо отметить, что не все диски можно очистить. Воспользоваться этой возможностью можно только для перезаписываемых CD-RW и DVD-RW. Чтобы очистить диски

5.3. Очистка реестра

5.3. Очистка реестра Под очисткой реестра понимается поиск и удаление неверных параметров реестра. Например, если в значении параметра указан путь, которого в вашей системе не существует, то этот параметр точно неверен, а значит, его следует

Очистка диска

Очистка диска Любой пользователь знает, что компьютер не только приносит пользу, но и вызывает головную боль. Все потому, что о нем, как и о домашнем любимце, нужно постоянно заботиться. Ежедневные разговоры с друзьями, серфинг в Интернете, установка и удаление

10.1. Очистка диска

10.1. Очистка диска Очистка диска – первый этап в его профилактике и ускорении работы.Существует множество программ для облегчения процесса поиска и очистки жесткого диска от ненужных данных. Примером такой программы может служить утилита The Mop (в переводе с английского

Очистка мыши

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

Очистка ячеек

Очистка ячеек В предыдущем уроке уже упоминалось, что для очистки ячейки достаточно сделать ее активной и нажать клавишу Delete. Таким же образом можно очистить сразу несколько ячеек, предварительно выделив нужный диапазон.Очистка приводит к удалению только имеющихся в

Читайте также:  Папки для windows как ios

Источник

Специфичный Linux. Тестирование Esync vs Fsync в играх

Игровой опыт на Linux весьма специфичен, ибо часто выливается в шаманство, но это шаманство всегда вознаграждается, и позволяет такое, о чем пользователи Windows могут только мечтать. Сегодня мы сравним разные методы синхронизации, которые используются в Linux при запуске Windows-игр для увеличения производительности, и попытаемся дать ответ на вопрос: какой же из них лучше? Но прежде чем начать, давайте узнаем, как работают две технологии.

В альтернативной системе реализации запуска кода Windows-программ — Wine, существует так называемый Wineserver, отвечающий за выполнение синхронизации объектов в игре (программе), но выполняющий их в однопоточном режиме. Для обхода этого ограничения и были созданы Esync и Fsync.

Esync — это ранняя система выноса задач многопоточной синхронизации за пределы Wineserver, которая следит за процессами ввода и вывода при работе с файловыми дескрипторами, что позволяет уменьшить нагрузку на центральный процессор и вместе с тем повысить производительность в играх. Требованиями технологии выступает ручное редактирование лимитов вашего дистрибутива, т.к. по умолчанию необходимые значения могут быть слишком малы.

Fsync — это более новая технология выноса задач многопоточной синхронизации за пределы Wineserver, разработанная компанией Valve, и которая работает уже с системными вызовами. Используется для обработки ожидания изменений в памяти, а не файловой системе. Такой принцип работы аналогичен Esync, но потенциально вызывает меньшие задержки и также способен увеличить производительность. Требованиями технологии выступает наличие пропатченного ядра Linux или базовой поддержки самим ядром.

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

Тестирование

Прежде чем начать тестирование, стоит отметить, что данные тесты не несут в себе идеи показать максимальную производительности Linux в играх и не являются лабораторными, а осуществляются лишь для прямого сравнения технологий Esync vs Fsync.

Genshin Impact

Отличная анимешная игра с обширным количеством сетевых функций. И несмотря на свою мобильную ориентированность, способна хорошо нагрузить центральный процессор.

Тестовый отрезок в самом оживленном городе игры отчетливо показывает, что новое — не всегда лучшее. Технология Fsync наглядно проигрывает Esync, график загруженности процессора просто сходит с ума, а фризы (зависания) следуют один за другим. Возможно, дело в том, что технология Fsync рассчитана на многоядерные процессоры.

S.T.A.L.K.E.R.: Зов Припяти

Cтарая игрушка с большим открытом Миром, которая должна показать, есть ли смысл задействовать новые методы синхронизации в однопоточных задачах.

И вновь ничего удивительного, производительность игры уперлась в процессор, конечно, DXVK пытается раскидать задачи по свободным ядрам, но это не снимает нагрузки с основного ядра. Применение каких-либо способов расширенной синхронизации не имеет смысла в однопоточных приложениях. Впрочем, если чуток углубиться, то Esync способен отрезать некоторые лишние запросы, но эффект в однопоточных задачах так же будет мизерным.

Grand Theft Auto IV

Всё ещё лучший бенчмарк 4 поточных процессоров, т.к. кривизна игры при работе с ресурсами позволяет отчетливо увидеть нагрузку на процессор.

Показатель загруженности процессора при технологии синхронизации Fsync вновь выше на

Читайте также:  Windows what you hear

20%, что подтверждает первичный тест с Genshin Impact.

Вывод

Применение расширенной технологии синхронизации Fsync на малоядерных процессорах лишена какого-либо смысла, и только дополнительно нагружает ядра и без того маломощного процессора. Смысл же Fsync обретает только при наличие многоядерного процессора, что заставляет распределять запросы по потокам более планомерно. Также нужно иметь в виду, что технология способна вдохнуть новую жизнь низкочастотным-многоядерным процессорам, которые не могут в нормальном режиме заготовить нужное число кадров для видеокарты. В иных случаях, используйте Esync, ибо он и вправду способен снять лишние запросы с вашего процессора и обеспечить плавность в играх под Linux (Wine) не требуя возни с дополнительными патчами

Видеоверсия

Источник

fsync(2) — Linux man page

fsync, fdatasync — synchronize a file’s in-core state with storage device

Synopsis

Feature Test Macro Requirements for glibc (see feature_test_macros(7)): fsync(): _BSD_SOURCE || _XOPEN_SOURCE
|| /* since glibc 2.8: */ _POSIX_C_SOURCE >= 200112L
fdatasync
(): _POSIX_C_SOURCE >= 199309L || _XOPEN_SOURCE >= 500

Description

fsync() transfers («flushes») all modified in-core data of (i.e., modified buffer cache pages for) the file referred to by the file descriptor fd to the disk device (or other permanent storage device) so that all changed information can be retrieved even after the system crashed or was rebooted. This includes writing through or flushing a disk cache if present. The call blocks until the device reports that the transfer has completed. It also flushes metadata information associated with the file (see stat(2)).

Calling fsync() does not necessarily ensure that the entry in the directory containing the file has also reached disk. For that an explicit fsync() on a file descriptor for the directory is also needed.

fdatasync() is similar to fsync(), but does not flush modified metadata unless that metadata is needed in order to allow a subsequent data retrieval to be correctly handled. For example, changes to st_atime or st_mtime (respectively, time of last access and time of last modification; see stat(2)) do not require flushing because they are not necessary for a subsequent data read to be handled correctly. On the other hand, a change to the file size (st_size, as made by say ftruncate(2)), would require a metadata flush.

The aim of fdatasync() is to reduce disk activity for applications that do not require all metadata to be synchronized with the disk.

Return Value

On success, these system calls return zero. On error, -1 is returned, and errno is set appropriately.

Errors

fd is not a valid open file descriptor.

An error occurred during synchronization. EROFS, EINVAL fd is bound to a special file which does not support synchronization.

Conforming To

Availability

On POSIX systems on which fdatasync() is available, _POSIX_SYNCHRONIZED_IO is defined in to a value greater than 0. (See also sysconf(3).)

Notes

On some UNIX systems (but not Linux), fd must be a writable file descriptor.

In Linux 2.2 and earlier, fdatasync() is equivalent to fsync(), and so has no performance advantage.

The fsync() implementations in older kernels and lesser used filesystems does not know how to flush disk caches. In these cases disk caches need to be disabled using hdparm(8) or sdparm(8) to guarantee safe operation.

Источник

Оцените статью