Допустим, есть программа, которая вызвала 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
Комментариев нет:
Отправить комментарий