Chia nhỏ checkpoint để ghi đều, cấp transaction log (redo log, WAL) rộng rãi, dùng ổ đĩa nhanh.
Trên đồ thị
Vọt lên theo chu kỳ · Độ trễ query DB, lượng ghi ổ đĩa
Chỗ cần xem
PostgreSQL: xem thời điểm checkpoint và số buffer đã ghi trong log của log_checkpoints (bật mặc định ở các phiên bản gần đây), số lần checkpoint (từ 17 là num_timed, num_requested trong pg_stat_checkpointer; 16 trở xuống là checkpoints_timed, checkpoints_req trong pg_stat_bgwriter), cảnh báo checkpoint_warning. MySQL: xem chênh lệch giữa Log sequence number và Last checkpoint at trong phần LOG của SHOW ENGINE INNODB STATUS. Đặt chồng cả lượng ghi và độ trễ ghi ổ đĩa của server
Đúng nếu
thời điểm độ trễ query vọt lên trùng với thời điểm checkpoint, và lúc đó lượng ghi cùng độ trễ ghi ổ đĩa vọt lên. Ở PostgreSQL, nếu checkpoint theo yêu cầu (num_requested) nhiều hơn hẳn checkpoint theo thời gian (num_timed) thì coi là WAL hay chạm max_wal_size nên checkpoint bị đẩy lên sớm
Loại trừ nếu
vọt lên theo chu kỳ không khớp thời điểm checkpoint → sao lưu hoặc batch (dk-backup, db-batch)
Cách kiểm tra
Kiểm tra bằng công cụ hạ tầng (không cần code game)
Tìm hiểu thêm
Nếu transaction log chứa bản ghi thay đổi (redo log của MySQL, WAL của PostgreSQL) quá nhỏ, mỗi lần log đầy DB phải vội vàng chạy checkpoint dồn một lượt, khiến thông lượng ghi thỉnh thoảng giảm mạnh.
Nguồn
WAL Configuration (PostgreSQL Documentation)PostgreSQL Checkpoint chạy mặc định mỗi 5 phút hoặc mỗi 1 GB WAL (max_wal_size), ghi toàn bộ dirty page nên tốn kém. checkpoint_completion_target rải việc ghi để tránh I/O dồn dập. Nếu khoảng cách giữa các checkpoint ngắn hơn checkpoint_warning thì ghi cảnh báo vào log, khuyên tăng max_wal_size
Configuring Buffer Pool FlushingMySQL redo log đầy thì checkpoint gấp (sharp) làm thông lượng giảm trong chốc lát; adaptive flushing chia đều việc ghi