Страницы

Поиск по вопросам

вторник, 13 ноября 2018 г.

Когда осуществляется запись на диск без close/fsync?

Допустим, есть программа, которая вызвала write(). Затем ушла в вечный цикл без вызова close() или fsync()/sync(). В каком случае произойдет реальная запись данных на диск? Файловая система без барьеров, паралельные процессы sync() не вызывают.


Ответ

Информация из write() попадает в "грязные" страницы кэша (Dirty). Через некоторое время (стандартно каждые 5 секунд = /proc/sys/vm/dirty_writeback_centisecs / 100) ядро проверяет не пора ли что записывать из грязных страниц. Ядро записывает страницы прождавшие более /proc/sys/vm/dirty_expire_centiseconds времени (стандартно 30 секунд) либо раньше, если осталось мало свободной памяти. Точнее второе условие задаётся в виде: Dirty * 100 / (MemFree + Cached - Mapped) > /proc/sys/vm/dirty_background_ratio либо Dirty > /proc/sys/vm/dirty_background_bytes в зависимости от того какой параметр установлен.
Кроме этого предусмотрен ещё крайний случай: когда грязный кэш разрастается больше /proc/sys/vm/dirty_ratio процентов от доступной памяти (MemFree + Cached - Mapped) либо больше /proc/sys/vm/dirty_bytes, то все процессы выполняющие запись приостанавливаются до фактической записи их данных (блокирующая запись).
Источники: https://www.kernel.org/doc/Documentation/sysctl/vm.txt http://www.westnet.com/~gsmith/content/linux-pdflush.htm

Комментариев нет:

Отправить комментарий