ゲームラグ白書 › L12 データベース
チェックポイント・ログフラッシュ Checkpoint / log flush stalls
原因ID db-checkpoint · 主担当 インフラチーム・DBインフラ
図と実験のあるメインページでこのカードを開く →
DBがメモリ上の変更分を定期的にまとめてディスクに書き込む瞬間、クエリが遅くなります。
なぜ 変更分がたまり、定期的にディスクへ書き出す → すると その瞬間ディスクの負荷が上がり、クエリが遅延 → 画面では 定期的に保存・ロードが遅くなる
- 症状
- 入力遅延, カクつき
- 要因
- 遅延
- 誰に起きるか
- サーバー全体, 特定の機能だけ
- いつ
- 一定の周期で
- 担当
- 主担当 インフラチーム・DBインフラ
- インフラチームの対応
- チェックポイントを細かく分けて平準化、トランザクションログ(redoログ、WAL)を十分な大きさに、高速なディスク。
- グラフでは
- 周期的なスパイク · DBクエリの遅延、ディスク書き込み量
- 確認箇所
- PostgreSQLはlog_checkpoints(最近のバージョンはデフォルトで有効)のログにあるチェックポイントの時刻と書き込んだバッファ数、チェックポイントの回数(17以降はpg_stat_checkpointerのnum_timed・num_requested、16以前はpg_stat_bgwriterのcheckpoints_timed・checkpoints_req)、checkpoint_warningの警告を確認。MySQLはSHOW ENGINE INNODB STATUSのLOGセクションで、Log sequence numberとLast checkpoint atの差を確認。サーバーのディスク書き込み量・書き込み遅延も重ねて確認
- 該当する場合
- クエリ遅延が跳ねた時刻がチェックポイントの時刻と重なり、そのときディスク書き込み量と書き込み遅延が跳ね上がる。PostgreSQLで要求によるチェックポイント(num_requested)が時間によるチェックポイント(num_timed)よりはるかに多ければ、WALが頻繁にmax_wal_sizeに達してチェックポイントが前倒しになっているとみなす
- 該当しない場合
- チェックポイントの時刻と無関係な周期で跳ねるなら、バックアップ・バッチ(dk-backup、db-batch)
- 確認手段
- インフラのツールで確認(ゲームコード不要)
- もっと詳しく
- 変更の記録を保持するトランザクションログ(MySQLのredoログ、PostgreSQLのWAL)を小さく設定しすぎると、ログが満杯になるたびに、DBが急いでチェックポイントをまとめて実行するため、書き込みスループットが一時的に大きく落ちます。
出典
- WAL Configuration (PostgreSQL Documentation) PostgreSQL
チェックポイントはデフォルトで5分ごと、またはWALが1GB(max_wal_size)に達するごとに実行され、ダーティページをすべて書き出すため高コスト。checkpoint_completion_targetで書き込みを分散し、I/Oの急増を避ける。チェックポイントの間隔がcheckpoint_warningより短いと、max_wal_sizeを増やすよう促す警告をログに出力 - Configuring Buffer Pool Flushing MySQL
redoログが満杯になると急な(sharp)チェックポイントでスループットが一時的に落ちる、アダプティブフラッシュで平準化して書き出す - Error Reporting and Logging (PostgreSQL Documentation) PostgreSQL
log_checkpoints:チェックポイントごとに書き込んだバッファ数とかかった時間をログに出力、デフォルト有効 - The Cumulative Statistics System (PostgreSQL Documentation) PostgreSQL
pg_stat_checkpointerのnum_timed(時間到達で実行したチェックポイント)・num_requested(要求されたチェックポイント) - PostgreSQL 17 Release Notes PostgreSQL
pg_stat_checkpointerを新設、チェックポイント関連のカラムをpg_stat_bgwriterから移動 - The Cumulative Statistics System (PostgreSQL 16 Documentation) PostgreSQL
16まではpg_stat_bgwriterのcheckpoints_timed・checkpoints_req - InnoDB Standard Monitor and Lock Monitor Output MySQL
LOGセクション:現在のログシーケンス番号と最後のチェックポイントの位置
あわせて読みたい原因
同じ層:L12 データベース
同じ症状(入力遅延)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る