ゲームラグ白書 › L12 データベース
コールドキャッシュ(再起動直後) Cold buffer pool after restart
原因ID db-cold-cache · 主担当 インフラチーム・DBインフラ · 副担当 ゲーム開発チーム・サーバー開発
図と実験のあるメインページでこのカードを開く →
DBを再起動するとメモリ上のキャッシュが空になっているため、しばらくはすべての読み込みがディスクから行われます。
なぜ メンテナンスでDBを再起動 → すると よく使われていたデータがメモリになく、ディスクから読む → 画面では メンテ明けしばらくログイン・ロードが遅い
症状 接続不可・無限ロード , 入力遅延
要因 遅延
誰に起きるか サーバー全体
いつ 接続直後・メンテ明け
担当 主担当 インフラチーム・DBインフラ · 副担当 ゲーム開発チーム・サーバー開発
ゲーム開発チームの対応 段階的なオープン(ログイン待機列を使い、ログインできる人数を少しずつ増やす)。
インフラチームの対応 再起動後のキャッシュのウォームアップ(バッファプールの保存・復元設定を確認)、スナップショットから復元したDBはディスクも事前に読み込む。
グラフでは 接続直後・メンテ明けに急増 · ディスク読み込み、バッファキャッシュのヒット率
確認箇所 MySQLはInnodb_buffer_pool_reads(バッファプールになくディスクから読んだ回数)とInnodb_buffer_pool_read_requestsの比率、ウォームアップの進行状況Innodb_buffer_pool_load_statusを確認。PostgreSQLはpg_stat_databaseのblks_read・blks_hitを確認。DBサーバーのディスク読み込み数も合わせて確認 該当する場合 再起動直後にディスク読み込みが跳ね上がってヒット率が低く、時間とともに回復し、その間ログイン・ロードが遅い 該当しない場合 ヒット率が平常どおりなのにメンテ明けに遅いなら、ログイン殺到・N+1(db-login-storm)かコネクションプール(db-pool) 確認手段 インフラのツールで確認(ゲームコード不要)
もっと詳しく MySQLは停止時にバッファプールのページ一覧を保存し、起動時にバックグラウンドで読み込み直しますが、すべて埋まるまでには時間がかかります。クラウドでDBをスナップショット(ディスクのコピー)から復元した場合は、ディスク自体も初めて読むブロックごとに遅いため、さらに長引きます。
実際の事例 Roblox 2021: Robloxの73時間障害:サービスディスカバリ(Consul)クラスターでの競合
出典 Saving and Restoring the Buffer Pool State MySQL 再起動後のウォームアップ時間を短くするため、停止時に最近使ったページの一覧(デフォルト25%)を保存し、起動時に読み込み直す、どちらもデフォルトで有効 pg_prewarm — preload relation data into buffer caches PostgreSQL 共有バッファの内容を定期的に記録しておき、再起動後に読み込み直す(autoprewarm) Initialize Amazon EBS volumes AWS スナップショットから作成したボリュームは、全ブロックを取得し終えるまで遅延が増え、性能が落ちる Server Status Variables MySQL Innodb_buffer_pool_reads(バッファプールになくディスクから直接読んだ論理読み込みの数)、Innodb_buffer_pool_read_requests、Innodb_buffer_pool_load_status(ウォームアップの進行状況) The Cumulative Statistics System (PostgreSQL Documentation) PostgreSQL pg_stat_databaseのblks_read(ディスクから読んだブロック数)・blks_hit(バッファキャッシュで見つかったブロック数)
あわせて読みたい原因
同じ層:L12 データベース
同じ症状(接続不可・無限ロード)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る