web-dev-qa-db-ja.com

Google Cloud SQL PostgreSQLインスタンスでの遅いクエリのロギング

私が働いている会社では、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クエリをログに記録/監視するにはどうすればよいですか?それが不可能な場合、どのようなツール/方法論を使用して、同様の結果を達成することをお勧めしますか?

11

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"
  },
]

参照:

9

Cloud SQLインスタンスの遅いPostgreSQLクエリを監視する可能性は、現在利用できません。コメントすると、log_min_duration_statementフラグは現在、Cloud SQLではサポートされていません。

現在、この機能をCloud SQLに追加する作業が行われており、 このリンク を使用して進捗状況を追跡できます。左上にある星のアイコンをクリックすると、大きな進歩があったときにメール通知を受け取ることができます。

9
Rodrigo C.

どんな手段でも理想的ではありませんが、私たちが行うことは、毎分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の頻度と重複するクエリのみをキャッチしますが、おそらく何もしないよりは良いでしょうか?

2
depsypher

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の所有者とクエリテキストを確認できます。

1
materemias