본문으로 건너뛰기

4.3 PostgreSQL write path

PostgreSQL write workload는 WAL flush, dirty buffer write, checkpoint, temporary file로 나눠 봅니다. 같은 device를 공유하면 서로의 queue를 늘릴 수 있습니다.

SELECT * FROM pg_stat_wal;
SELECT backend_type, writes, write_time, fsyncs, fsync_time
FROM pg_stat_io
WHERE object = 'wal';
SELECT * FROM pg_stat_checkpointer;
SELECT datname, temp_files, temp_bytes, blk_read_time, blk_write_time
FROM pg_stat_database;

blk_read_timeblk_write_timetrack_io_timing, WAL의 write_timefsync_timetrack_wal_io_timing이 활성화돼야 누적됩니다. PostgreSQL 18에서는 WAL write와 sync 시간을 pg_stat_ioobject = 'wal' 행에서 확인합니다. EXPLAIN (ANALYZE, BUFFERS, WAL)로 query가 buffer와 WAL을 얼마나 사용했는지도 볼 수 있습니다.

상관관계 예시

Checkpoint 시간대와 device write latency가 겹친다면 max_wal_size, checkpoint pacing, storage 성능을 검토합니다. 설정값 하나를 올리는 것으로 끝내지 말고 recovery time, WAL 보관량, replica 영향도 함께 계산합니다.

WAL과 data를 별도 volume에 둘 때 장애 domain과 restore 절차가 복잡해집니다. 단순히 benchmark 수치만으로 layout을 결정하지 않습니다.

참고: PostgreSQL statistics, WAL configuration