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

ゲームラグ白書 › 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)クラスターでの競合

出典

  1. Saving and Restoring the Buffer Pool State MySQL
    再起動後のウォームアップ時間を短くするため、停止時に最近使ったページの一覧(デフォルト25%)を保存し、起動時に読み込み直す、どちらもデフォルトで有効
  2. pg_prewarm — preload relation data into buffer caches PostgreSQL
    共有バッファの内容を定期的に記録しておき、再起動後に読み込み直す(autoprewarm)
  3. Initialize Amazon EBS volumes AWS
    スナップショットから作成したボリュームは、全ブロックを取得し終えるまで遅延が増え、性能が落ちる
  4. Server Status Variables MySQL
    Innodb_buffer_pool_reads(バッファプールになくディスクから直接読んだ論理読み込みの数)、Innodb_buffer_pool_read_requests、Innodb_buffer_pool_load_status(ウォームアップの進行状況)
  5. The Cumulative Statistics System (PostgreSQL Documentation) PostgreSQL
    pg_stat_databaseのblks_read(ディスクから読んだブロック数)・blks_hit(バッファキャッシュで見つかったブロック数)

あわせて読みたい原因

同じ層:L12 データベース

同じ症状(接続不可・無限ロード)を起こすほかの層の原因

図と実験のあるメインページでこのカードを見る