WAL writerасинхронно сбрасывает WAL-записи из памяти на диск, обеспечивая баланс между производительностью и надёжностью.

Периодически сбрасывать содержимое wal_buffers (буфера WAL в shared memory) в файлы WAL на диске (pg_wal/), даже если клиенты ещё не вызвали COMMIT. WAL файлы пишутся по 16 МБ. в директорию pg_wal/ WAL writer не гарантирует durability, но ускоряет массовую запись.

Как это работает (по шагам)

  1. Backend-процесс (при INSERT/UPDATE/DELETE) формирует WAL-запись и кладёт её в wal_buffers (разделяемая память).
  2. WAL writer (фоновый процесс) периодически:
    • Просыпается (по таймеру, по умолчанию — каждые 200 мс, см. wal_writer_delay),
    • Проверяет, есть ли новые записи в wal_buffers, которые ещё не записаны на диск,
    • Вызывает write() → данные попадают в кэш ОС,
    • Если нужно (например, при synchronous_commit = off) — может вызвать fsync(), но обычно этого не делает.
  3. При COMMIT с synchronous_commit = on:
    • Backend сам вызывает fsync(), чтобы гарантировать, что WAL на диске,
    • WAL writer в этом случае не участвует в синхронизации коммита.

Ключевые параметры WAL writer

ПараметрПо умолчаниюНазначение
wal_writer_delay200msКак часто WAL writer просыпается и сбрасывает WAL
wal_writer_flush_after1MBЕсли накопилось больше этого объёма, WAL writer делает write() сразу (без ожидания таймера)

Важные нюансы

  • WAL writer не делает fsync() по умолчанию — он только вызывает write().
    → Данные попадают в кэш ОС, но не обязательно на физический диск.
  • Надёжность (durability) обеспечивается backend’ом при COMMIT, если synchronous_commit = on.
  • При synchronous_commit = off WAL writer — единственный механизм сброса WAL, но возможна потеря последних транзакций при сбое.
  • Если WAL writer не справляется (очень высокая нагрузка), backend’ы могут начать сбрасывать WAL сами, чтобы не блокироваться.

Взаимодействие с другими компонентами

КомпонентВзаимодействие
WALПишет WAL-записи из wal_buffers на диск в файлы каталога pg_wal/
LWLocksИспользует WALWriteLock для синхронизации доступа к wal_buffers и координации с backend’ами
XLogCtlОбновляет LogwrtResult — структуру в shared memory, указывающую, до какого LSN WAL уже записан на диск (write и flush LSN)
pg_wal/Целевой каталог: выполняет write() и (иногда) fsync() для сброса WAL-файлов на диск
Backend процессыСлужит им: сбрасывает их WAL-записи асинхронно, разгружая от необходимости делать write() самостоятельно