【AWS/RDS】今夜勝ちたいスロークエリログ出力


AWSにapi作ったんだけど(非公開)、相当数の同時接続時に速さが足りないと言われたんで、
とりま原因究明のためにRDS(MariaDB)からスロークエリログを吐き出してCloudWatchで眺めてみた。
その軌跡です。

深奥まで知る必要はないけどとりあえず今夜勝ちたい人向けです。

環境

本記事はAWS RDS(MariaDB10.2)で試しています。
以降はこの前提で進めますがバージョン違いやMysqlでも基本同じな模様。
Auroraは若干微妙に違うので他の記事をご参照下さい。

作業工程

やることは大きく2つ。

  • パラメータグループの設定(DBエンジンのパラメータ設定)
  • ログエクスポートの設定(CloudWatchへの出力設定)

tips

RDSでは新しくデータベースを作成する際に、エンジン毎にデフォルトで用意されているパラメータ&オプショングループを選択できます。

できますが下記理由からオリジナルを作ることをお勧めします。(特にパラメータ)

  • デフォルトグループは設定値が変更不可
  • グループの付け替えは再起動が必要

パラメータグループの設定

「RDS > パラメータグループ > パラメータグループの作成」より

  1. パラメータグループを作成
  2. 作成したパラメータグループを選択
  3. パラメータの編集で以下の値を設定
    • slow_query_log = 1 (スロークエリ出力の有無)
    • long_query_time = 1 (スロークエリと判定する秒数。お好みで)
    • log_output = FILE  (ログの出力方法)

グループ作成時のパラメータグループファミリーには使用するDBエンジンを指定。
他は適当でおk。(嘘、あとでわかりやすい名前を設定して)

デフォルトではslow_query_log=0(false)なのでスロークエリは出力されません。
また、log_output = TABLEの場合、DB接続して下記でログは参照可能です。

select * from mysql.slow_log

ちなみにここで設定した値は適用タイプがdynamicなので即時適用されます。
ここがstaticのパラメータはDBの再起動が必要です。

ログエクスポートの設定

新規DB作成:「RDS > データベース > データベースの作成」より
既存DB変更:「RDS > データベース > {当該DB} > 変更」より

どちらの場合も下記を設定します。

  • DBパラメータグループ = 作成したパラメータグループ
  • ログのエクスポート > スロークエリログ = ON

新規作成の場合、追加設定というところに折り畳まれてるんで見逃してそのまま作成しないように気をつけてください。
俺はやった。

結果

これで「CloudWatch > ログ」/aws/rds/instance/{DB名}/slowquery
というログが出力されるようになるはずです。

あとはスロークエリから遅延の原因を探すだけです!やったね!
僕はクエリが原因ではなさそうと判定されたので来週も戦い続けます。