WAL writer — асинхронно сбрасывает WAL-записи из памяти на диск, обеспечивая баланс между производительностью и надёжностью.
Периодически сбрасывать содержимое
wal_buffers(буфера WAL в shared memory) в файлы WAL на диске (pg_wal/), даже если клиенты ещё не вызвалиCOMMIT. WAL файлы пишутся по 16 МБ. в директориюpg_wal/WAL writer не гарантирует durability, но ускоряет массовую запись.
Как это работает (по шагам)
- Backend-процесс (при
INSERT/UPDATE/DELETE) формирует WAL-запись и кладёт её вwal_buffers(разделяемая память). - WAL writer (фоновый процесс) периодически:
- Просыпается (по таймеру, по умолчанию — каждые 200 мс, см.
wal_writer_delay), - Проверяет, есть ли новые записи в
wal_buffers, которые ещё не записаны на диск, - Вызывает
write()→ данные попадают в кэш ОС, - Если нужно (например, при
synchronous_commit = off) — может вызватьfsync(), но обычно этого не делает.
- Просыпается (по таймеру, по умолчанию — каждые 200 мс, см.
- При
COMMITсsynchronous_commit = on:- Backend сам вызывает
fsync(), чтобы гарантировать, что WAL на диске, - WAL writer в этом случае не участвует в синхронизации коммита.
- Backend сам вызывает
Ключевые параметры WAL writer
| Параметр | По умолчанию | Назначение |
|---|---|---|
wal_writer_delay | 200ms | Как часто WAL writer просыпается и сбрасывает WAL |
wal_writer_flush_after | 1MB | Если накопилось больше этого объёма, WAL writer делает write() сразу (без ожидания таймера) |
Важные нюансы
- WAL writer не делает
fsync()по умолчанию — он только вызываетwrite().
→ Данные попадают в кэш ОС, но не обязательно на физический диск. - Надёжность (
durability) обеспечивается backend’ом приCOMMIT, еслиsynchronous_commit = on. - При
synchronous_commit = offWAL 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() самостоятельно |