Skip to content

Cold Start

ゲーム系の大規模運用には特有の作法がある。

メンテナンス明けは戦場だ。ユーザーは待っている。メンテが終わった瞬間にログインが殺到する。このタイミングでDBが冷えていると即死する。

サーバーを再起動した直後、DBの性能は大きく低下する。原因はOSのディスクキャッシュが空だからだ。Linuxは空きメモリをページキャッシュとして使い、ディスクの読み書きを透過的にキャッシュする。freeコマンドで見るとメモリがほとんど使われているように見えるが、大半はキャッシュだ。アプリケーションがメモリを要求すればキャッシュを解放して渡す。知らないと「メモリが足りない」と騒ぐことになる。

MySQLやPostgreSQLはデータをディスクから読むが、一度読んだデータはこのページキャッシュに乗る。二度目以降はメモリから返すから速い。サーバーを再起動するとこのキャッシュが空になる。全クエリがディスクI/Oになる。

だからメンテ明け直前には儀式がある。ウォームアップだ。

ウォームアップスクリプトと言えば聞こえはいいが、中身はcat /var/lib/mysql/... > /dev/nullでデータファイルを読み込ませているだけだったりする。catで読むだけでページキャッシュに乗る。InnoDBのバッファプールをダンプして復元する方法もある。

キャッシュが温まったことを確認してから、ロードバランサにトラフィックを流す。冷えたDBに本番トラフィックを流してはいけない。ゲーム運用で最初に叩き込まれた作法だった。