読者です 読者をやめる 読者になる 読者になる

続 カッコの付け方

AWSを始めとしたクラウドコンピューティング全般と、唯一神emacsにおける()の付け方についてだらだら書きます

RDSのMySQLキャッシュウォーミングって何?

AWS RDS MySQL InnoDB cache

AWSブログにて、RDS MySQLにおけるキャシュウォーミングがサポートされました。

http://aws.typepad.com/aws_japan/2014/09/rds-mysql-cache-warming.html

で、キャッシュウォーミングってなんぞやということですが、上記ブログから抜粋させてもらうと。

MySQLを実行しているAmazon RDSのDBインスタンスをシャットダウンする際、バッファープールの状態を保存し、後でインスタンスを起動する際に、リロードするよう設定することができます。 インスタンスはウォームアップを必要とせずに、効率的な方法で、一般的なクエリを処理できるようになります。

う~ん、私の知る限りでは、RDSはシャットダウンは出来ないはずですが(EC2と異なり、Stopという概念がありません。つまり稼働か削除のいずれかで、削除する場合は、スナップショットをとっておきます。)どこで生きてくるのだろう?と思いましたが、パターンとしてはパラメータセットを変更したり、マイナーアップグレードが走った時に、MySQLは確実にリブートしているはずなので、その時にうまみが有ります。

この機能のついて少し掘り下げます。

MySQLとくにInnoDBは、バッファ/キャッシュの設定がパフォーマンスに大きく出ます。このキャッシュはメモリに保存されるので、簡単に言うと、メモリをきちんと使いきらないと損だということです。で、このキャッシュですが、当然 mysqldの再起動が行われると、削除されます。再起動後にクエリが走った時に、再度キャッシュされることになりますが、この一発目の問い合わせは遅くなってしまいます。これを何とかしようというわけです。

つまり、シャットダウン直前に、バッファ/キャッシュをディスクにDumpして、起動時にそのDumpファイルをメモリにロードするというわけです。早速試してみます。

とりあえず、そこそこ大きなレコード数のテーブルを作ってください。50万レコード位のものをつくり、インデックスをつけて count(*) するだけの環境で試しました。大量レコードの作製方法は、2つテーブルを作り、JoinやWhere条件を付けずに2つのテーブルから create xxx (select xxx) で表を作ればあっという間です。

キャッシュウォーミングの無いとき。下記はリブート直後の状態で検証しました。

mysql> select count(*) from imatest_hoge where hoge='aaa'

+----------+

| count(*) |

+----------+

| 10772 |

+----------+

1 row in set (0.27 sec)

mysql> select count(*) from imatest_hoge where hoge='aaa'

+----------+

| count(*) |

+----------+

| 10772 |

+----------+

1 row in set (0.01 sec)

一発目はキャッシュが効いていないので遅いです。

では早速、パラメータグループを作り、キャッシュウォーミングの設定をします。

rds.png

キャッシュウォーミングの有るとき。一回Selectした後に、リブートしました。

mysql> select count(*) from imatest_hoge where hoge='aaa'

+----------+

| count(*) |

+----------+

| 10772 |

+----------+

1 row in set (0.03 sec)

mysql> select count(*) from imatest_hoge where hoge='aaa'

+----------+

| count(*) |

+----------+

| 10772 |

+----------+

1 row in set (0.01 sec)

こちらは一発目からキャッシュが効いているので速いです。さすがに二発連続と同じ速さでは無いですが。

それほど劇的な効果が期待できるわけではないですが、やっておいて損はないので、設定しておくことをオススメします。