Amazon Performance Insightsをとりあえず触ってみる

これは PostgreSQL Advent Calendar 2017 の Day4 の記事です。 昨日はsnagaさんの「Dockerを使ってデータ分析用にPostgreSQLを使ってみる」でした。

さて私からは、先般正式リリースされたAmazon Aurora with PostgreSQL Compatibilityで使用出来るモニタリングツール、Aurora Performance insightを使ってみましたという(だけの)記事になります。 Aurora Performance Insight自体はまだPreview版(2017/12/04現在)という扱いなので、データは最長一日間しか保存されず対象エンジンはPostgreSQLのみで、使用出来るリージョンも限られています。

docs.aws.amazon.com

利用方法は簡単でAurora Postgresqlインスタンス作成時にパフォーマンスインサイトを有効化するチェックボックスがあるので有効を選択するだけです。追加料金もかかりませんが、GAになったらどうなるのかな?

インスタンスが立ち上がったらおもむろにEC2インスタンスからPgbenchを投げてみます。

-- psql pgbench インストール
$ sudo yum install postgresql96
$ sudo yum install postgresql96-contrib
-- pgbench初期化
$ pgbench -i -s 1000 -U awsuser -h xxxxxx.xxxxxx.us-east-1.rds.amazonaws.com -d sampledb
-- pgbench実行
$ pgbench -r -c 100 -j 10 -t 1000 -U awsuser -h xxxxxx.xxxxxx.us-east-1.rds.amazonaws.com -d sampledb

で、RDSコンソールからまず待機(イベント)・SQL・Hostname・Userの中から表示したいものを選択し、右側のスライス基準という所でさらに切り口を指定すると欲しいグラフが表示されます。

SQL毎の待機イベント種別を表示 f:id:vidaisuki:20171204114104p:plain 待機イベント毎の実行User f:id:vidaisuki:20171204124328p:plain ロック解除待ちのクエリも確認できます。 f:id:vidaisuki:20171204041842p:plain

AWSコンソールからしかアクセス出来ず機能も簡素なものですが、正式リリース版では収集データ保持期間の長期化やAPIの提供も予定されているようなので今後に期待です。ここからは私の妄想ですが、さらにSQLチューニングアドバイザ的なものがもし加わってきたら、この手の機能を追加オプションと位置づけているEnterprise系ソリューションにもAuroraが食い込んでくるのでは〜と考える私なのでした。

明日はtjtakahashiさんです。よろしくお願い致します。

参考資料

pgbench で RDS PostgreSQL のマスターに負荷をかけてリードレプリカのレプリケーションラグを計測する - ablog

old_hash_valueからSQL全文を出力

statspackのSQL統計ではOLD_HASH_VALUEしか表示されないので、そこからSQL全文を出力する。

statspackから

  Elapsed                Elap per            CPU                        Old
  Time (s)   Executions  Exec (s)  %Total   Time (s)  Physical Reads Hash Value
---------- ------------ ---------- ------ ---------- --------------- ----------
     57.13            4      14.28    3.4      57.10               2  123456789
Module: sample@sample-db01 (TNS V1-V3)
SELECT * FROM hogehoge;

対象SQLのOld Hash Valueを指定

SYS@localhost>SELECT
 stxt.sql_text
FROM
 (SELECT
 st.sql_text,st.piece
FROM
 v$sqltext st,
 v$sql s
WHERE
 st.sql_id = s.sql_id
 AND s.old_hash_value = '123456789'
GROUP BY st.sql_text,st.piece) stxt
ORDER BY stxt.piece;

結果

SQL_TEXT
----------------------------------------------------------------
 SELECT * FROM hogehoge;