한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Sách trắng lag game › L12 Cơ sở dữ liệu

Checkpoint, flush log Checkpoint / log flush stalls

ID nguyên nhân db-checkpoint · Phụ trách chính Hạ tầng DB (Đội hạ tầng)

Mở thẻ gốc có hình minh họa và thí nghiệm →

Đúng lúc DB định kỳ ghi dồn các thay đổi trong bộ nhớ xuống ổ đĩa, query chậm đi.

Vì sao Thay đổi tích tụ và định kỳ được ghi xuống ổ đĩa → Dẫn đến Lúc đó ổ đĩa bận, query bị trễ → Trên màn hình Lưu và loading chậm đi theo chu kỳ

Triệu chứng
Trễ thao tác, Giật khựng
Yếu tố
Độ trễ
Ai gặp phải
Cả server, Chỉ một tính năng
Khi nào
Theo chu kỳ đều
Phụ trách
Phụ trách chính Hạ tầng DB (Đội hạ tầng)
Việc cần làm (Đội hạ tầng)
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

  1. 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
  2. Configuring Buffer Pool Flushing MySQL
    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
  3. Error Reporting and Logging (PostgreSQL Documentation) PostgreSQL
    log_checkpoints: mỗi lần checkpoint ghi vào log số buffer đã ghi và thời gian mất, mặc định bật
  4. The Cumulative Statistics System (PostgreSQL Documentation) PostgreSQL
    num_timed (checkpoint chạy khi đến giờ) và num_requested (checkpoint được yêu cầu) trong pg_stat_checkpointer
  5. PostgreSQL 17 Release Notes PostgreSQL
    Thêm mới pg_stat_checkpointer, chuyển các cột liên quan tới checkpoint từ pg_stat_bgwriter sang
  6. The Cumulative Statistics System (PostgreSQL 16 Documentation) PostgreSQL
    Đến bản 16 là checkpoints_timed, checkpoints_req trong pg_stat_bgwriter
  7. InnoDB Standard Monitor and Lock Monitor Output MySQL
    Phần LOG: số thứ tự log (log sequence number) hiện tại và vị trí checkpoint gần nhất

Nguyên nhân nên xem cùng

Cùng tầng: L12 Cơ sở dữ liệu

Nguyên nhân ở tầng khác gây cùng triệu chứng (Trễ thao tác)

Xem thẻ gốc có hình minh họa và thí nghiệm