私が働いている会社では、Google Cloud SQLを使用して、本番環境のSQLデータベースを管理しています。
パフォーマンスの問題が発生しており、特定のしきい値(例:250ミリ秒)を超えるすべてのクエリを表示/監視することは(特に)良いアイデアだと思いました。
PostgreSQLドキュメント を見て、log_min_duration_statement
必要なフラグのようです。
log_min_duration_statement(整数)
ステートメントが少なくとも指定されたミリ秒の間実行された場合、完了した各ステートメントの期間がログに記録されます。これをゼロに設定すると、すべてのステートメント期間が出力されます。
しかし、Cloud SQLのドキュメントから判断すると、データベースフラグの狭いセット(各DBインスタンスの場合と同様)しか設定できないことがわかります ここlog_min_duration_statement
はサポートされているフラグの1つではありません。
だからここに質問があります。 Google Cloud SQLで低速のPostgreSQLクエリをログに記録/監視するにはどうすればよいですか?それが不可能な場合、どのようなツール/方法論を使用して、同様の結果を達成することをお勧めしますか?
2019年4月3日更新
Google Cloud SQL PostgreSQLインスタンスで低速のクエリをログに記録できるようになりました。詳細は https://cloud.google.com/sql/docs/release-notes#april_3_2019 :
database_flags = [
{
name = "log_min_duration_statement"
value = "1000"
},
]
参照:
log_min_duration_statement
の場合はCTRL + F): https://cloud.google.com/sql/docs/postgres/flags#postgres-lCloud SQLインスタンスの遅いPostgreSQLクエリを監視する可能性は、現在利用できません。コメントすると、log_min_duration_statement
フラグは現在、Cloud SQLではサポートされていません。
現在、この機能をCloud SQLに追加する作業が行われており、 このリンク を使用して進捗状況を追跡できます。左上にある星のアイコンをクリックすると、大きな進歩があったときにメール通知を受け取ることができます。
どんな手段でも理想的ではありませんが、私たちが行うことは、毎分1回、cronで次のようなものを実行し、結果をログアウトすることです。
SELECT EXTRACT(Epoch FROM now() - query_start) AS seconds, query
FROM pg_stat_activity
WHERE state = 'active' AND now() - query_start > interval '1 seconds' AND query NOT LIKE '%pg_stat_activity%'
ORDER BY seconds DESC LIMIT 20
クエリをいじってミリ秒単位の細かさを取得する必要があります。それでも、cronの頻度と重複するクエリのみをキャッチしますが、おそらく何もしないよりは良いでしょうか?
Cloud SQLでサポートされているpg_stat_statements
拡張機能を使用して、遅いクエリをログに記録する方法があります。
Cloud SQLはスーパーユーザー権限をユーザーに付与しないため、回避策を使用する必要があります。まず、拡張機能を有効にする必要があります
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
その後、次のようなクエリで遅いクエリをチェックできます
SELECT pd.datname,
us.usename,
pss.userid,
pss.query AS SQLQuery,
pss.rows AS TotalRowCount,
(pss.total_time / 1000) AS TotalSecond,
((pss.total_time / 1000) / calls) as TotalAverageSecond
FROM pg_stat_statements AS pss
INNER JOIN pg_database AS pd
ON pss.dbid = pd.oid
INNER JOIN pg_user AS us
ON pss.userid = us.usesysid
ORDER BY TotalAverageSecond DESC
LIMIT 10;
postgres
ユーザーとして、すべての遅いクエリを確認できますが、ユーザーはスーパーユーザーではないため、他のすべてのユーザーのクエリで<insufficient privilege>
が表示されます。この制限を回避するために、他のデータベースにも拡張機能をインストールでき(通常、postgres
ユーザーのみが拡張機能をインストールする権限があります)、dbの所有者とクエリテキストを確認できます。