RDS ファーストタッチペナルティに関して

AWS, RDS

この記事は最終更新日から1年以上が経過しています。

あるDBインスタンスのスレーブをもう一台作成しないといけなくなったので、
作成し、できたてホヤホヤのDBに対して、SELECTしてみると、ものすごく重かった。。

ファーストタッチペナルティと呼ばれるもので、詳しい説明は以下、公式ドキュメントから。

#ファーストタッチペナルティ

DB インスタンスが初めて起動され、初めてのディスク領域にアクセスするとき、そのプロセスは、
それ以降のプロセスが同じディスク領域にアクセスするよりも時間がかかります。
これは、「ファーストタッチペナルティ」と呼ばれます。一度ファーストタッチペナルティが発生したディスク領域では、
DB インスタンスが再起動または再開されたり、DB インスタンスクラスが変更された場合でも、
DB インスタンスの存続中はこのペナルティが再度発生することはありません。
スナップショット、ポイントインタイムリカバリ、またはリードレプリカから作成される DB インスタンスは、
新しいインスタンスであるため、このファーストタッチペ>ナルティが発生します。

上記を解決するために行ったことは、事前ウォーミング。
テーブル一個、一個に対して「select count(*) from テーブル」を行った。
テーブルに対して、limit 1000とかで一度アクセスするだけだと、ファーストタッチペナルティは解消されないっぽい挙動をしたので、仕方なくすべての行に対してcountを行った。
上記を、地道に作業することで、ファーストタッチペナルティは解消された。

事前ウォーミングを行ってくれる機能は、Amazon側にはないそうです。
代替案として、オーロラを使うと、ファーストタッチペナルティはないそうです。

その他、何かいい案を持っている方は教えていただければと思います。

この記事を書いた人

にょこた
PM(プロダクトマネージャー)目指して奮闘中、プログラムから、アーキテクト設計、サービス検討から、チームマネジメント、DevOps、いろいろやってます。

AWS, RDS