Cơ sở dữ liệu 22/09/2026 6 phút

WAL và checkpoint trong PostgreSQL: vì sao UPDATE 100k dòng sinh 48 MB WAL

Mọi thay đổi ghi vào WAL trước để đảm bảo độ bền; checkpoint dồn các trang bẩn ra đĩa. Đo thật: cùng một UPDATE 100k dòng sinh 48 MB WAL ngay sau checkpoint (2606 full-page image) nhưng chỉ 28 MB khi lặp lại — chênh 20 MB là chi phí full-page image. Và cách đọc checkpoints_req để biết max_wal_size quá nhỏ. PostgreSQL 16.

Lập trình 22/09/2026 8 phút

WAL và checkpoint đo thật: một dòng UPDATE ngay sau checkpoint tốn 6.160 byte nhật ký, lần hai 120 byte; full_page_writes chiếm 84% WAL của pgbench; max_wal_size 64 MB gây 66 checkpoint trong 40 giây, TPS giảm 39% và WAL gấp đôi

Đo WAL bằng pg_current_wal_lsn trước và sau từng lệnh trên PostgreSQL 16: insert 160 byte mỗi dòng, có index 226, update ngay sau checkpoint 381 so với 243 lần hai, đổi khoá index 453. Ở mức một dòng: update đầu tiên sau checkpoint ghi 6.160 byte vì chụp cả trang 8 KB, update thứ hai cùng trang 120 byte. pgbench 10 giây sinh 390 MB WAL với full_page_writes bật và 62 MB khi tắt. Bốn cấu hình checkpoint dưới cùng tải 40 giây: mặc định 10.632 TPS với 2 checkpoint; max_wal_size 64 MB gây 66 checkpoint, 6.483 TPS và 2.133 MB WAL; completion target 0.1 giữ TPS trung bình nhưng có giây tụt còn 2.966.