Using EDB Wait States

EDB Wait Statesが共有プリロードライブラリの1つとして登録されている場合、実行中の各セッションを定期的にプローブします。すべてのセッションについて、次のような情報を収集します。

  • 接続先のデータベース。

  • セッションのログインユーザー。

  • そのセッションで実行されているクエリ。

  • 待機している待機イベント。

この情報は、 edb_wait_states.directory パラメーターで指定されたユーザー構成可能なパスとディレクトリフォルダーにある一連のファイルに保存され、 postgresql.conf ファイルに追加されます。パスは、相対パスではなく、完全な絶対パスである必要があります。

インターフェイスを使用したデータの探索

EDB Wait Statesインターフェイスの各機能には、共通の入力パラメーターと出力パラメーターがあります。それらのパラメーターは次のとおりです。

Parameter(s)

Input or output

Description

start_ts and end_ts

Input

これらは一緒に、時間間隔と読み取るデータを指定します。 `start_ts`のみを指定した場合、`start_ts`以降のデータが出力されます。 `end_ts`のみを指定した場合、`end_ts`までのデータが出力されます。どちらも指定しない場合は、すべてのデータが出力されます。

query_id

Output

正規化されたクエリを識別します。これは、クエリから計算された内部ハッシュコードです。

session_id

Output

セッションを識別します。

ref_start_ts and ref_end_ts

Output

特定のデータポイントを含むファイルのタイムスタンプを提供します。データポイントは、待機イベントのサンプルレコード、クエリレコード、またはセッションレコードの場合があります。

次の例では、異なるユーザーを使用して異なるデータベースに接続された4つの異なるセッションで3つのクエリが同時に実行されるシナリオを使用します。これら3つのクエリは次のとおりです。

SELECT schemaname FROM pg_tables, pg_sleep(15) WHERE schemaname <>
pg_catalog; / *ranon2sessions* /
SELECT tablename FROM pg_tables, pg_sleep(10) WHERE schemaname <>
pg_catalog;
SELECT tablename, schemaname FROM pg_tables, pg_sleep(10) WHERE schemaname
<> pg_catalog;

edb_wait_states_data

この機能を使用して、BGWによって収集されたデータを読み取ります。

edb_wait_states_data(
  IN start_ts timestamptz default -infinity::timestamptz,
  IN end_ts timestamptz default infinity::timestamptz,
  OUT session_id int4,
  OUT <dbname> text,
  OUT <username> text,
  OUT <query> text,
  OUT <query_start_time> timestamptz,
  OUT <sample_time> timestamptz,
  OUT <wait_event_type> text,
  OUT <wait_event> text
)

この機能を使用して、次のことを確認できます。

  • すべてのセッションで指定された期間(start_ts およびend_ts で定義)実行されているクエリ、および待機していた待機イベント(ある場合)。例:

SELECT query, session_id, wait_event_type, wait_event
  FROM edb_wait_states_data(start_ts, end_ts);
  • 指定された期間内のセッションの進行状況、つまり、セッション(session_id = 100000 )で実行されたクエリと、クエリが待機した待機イベント。例:

SELECT query, wait_event_type, wait_event
  FROM edb_wait_states_data(start_ts, end_ts)
  WHERE session_id = 100000;
  • サンプルが利用可能な期間。例:

SELECT min(sample_time), max(sample_time)
  FROM edb_wait_states_data();

パラメーター

前述の一般的なパラメーターに加えて、出力の各行は次のことを示します。

dbname

セッションのデータベース。

username

セッションのログインユーザー。

query

セッションで実行されているクエリ。

query_start_time

クエリが開始された時刻。

sample_time

待ちイベントデータを収集した時刻。

wait_event_type

セッション(バックエンド)が待機している待機イベントのタイプ。

wait_event

セッション(バックエンド)が待機している待機イベント。

例

以下は、 edb_wait_states_data() 関数の出力例です。

edb=# SELECT * FROM edb_wait_states_data();
__OUTPUT__
- [ RECORD 1 ]----+-------------------------------------------------------------------------
session_id       | 4398
dbname           | edb
username         | enterprisedb
query            | SELECT schemaname FROM pg_tables, pg_sleep($1) WHERE schemaname <> $2
query_start_time | 17-AUG-18 11:56:05.271962 -04:00
sample_time      | 17-AUG-18 11:56:19.700236 -04:00
wait_event_type  | Timeout
wait_event       | PgSleep
- [ RECORD 2 ]----+-------------------------------------------------------------------------
session_id       | 4398
dbname           | edb
username         | enterprisedb
query            | SELECT schemaname FROM pg_tables, pg_sleep($1) WHERE schemaname <> $2
query_start_time | 17-AUG-18 11:56:05.271962 -04:00
sample_time      | 17-AUG-18 11:56:18.699938 -04:00
wait_event_type  | Timeout
wait_event       | PgSleep
- [ RECORD 3 ]----+-------------------------------------------------------------------------
session_id       | 4398
dbname           | edb
username         | enterprisedb
query            | SELECT schemaname FROM pg_tables, pg_sleep($1) WHERE schemaname <> $2
query_start_time | 17-AUG-18 11:56:05.271962 -04:00
sample_time      | 17-AUG-18 11:56:17.700253 -04:00
wait_event_type  | Timeout
wait_event       | PgSleep
                    .
                    .
                    .

edb_wait_states_queries

この関数は、 BGWによってサンプリングされたクエリに関する情報を提供します。例:

edb_wait_states_queries(
  IN start_ts timestamptz default -infinity::timestamptz,
  IN end_ts timestamptz default infinity::timestamptz,
  OUT query_id int8,
  OUT <query> text,
  OUT ref_start_ts timestamptz
  OUT ref_end_ts timestamptz
)

新しいクエリファイルは定期的に作成されます。特定の間隔に対応する複数のクエリファイルを生成できます。

この関数は、指定された時間間隔と重複するクエリファイル内のすべてのクエリを返します。クエリは、start_ts とend_ts の間でサンプリングされたクエリを含むクエリファイル内のすべてのクエリを提供します。

SELECT query FROM edb_wait_states_queries(start_ts, end_ts);

言い換えれば、この関数は、指定された間隔で実行されなかったクエリを出力できます。これを行うには、 edb_wait_states_data() を使用します。

パラメーター

前述の一般的なパラメーターに加えて、出力の各行は次のことを示します。

query

正規化されたクエリテキスト。

例

以下は、 edb_wait_states_queries() 関数の出力例です。

edb=# SELECT * FROM edb_wait_states_queries();
__OUTPUT__
- [ RECORD 1 ]+-----------------------------------------------------------------------------
query_id     | 4292540138852956818
query        | SELECT schemaname FROM pg_tables, pg_sleep($1) WHERE schemaname <> $2
ref_start_ts | 17-AUG-18 11:52:38.698793 -04:00
ref_end_ts   | 18-AUG-18 11:52:38.698793 -04:00
- [ RECORD 2 ]+-----------------------------------------------------------------------------
query_id     | 3754591102365859187
query        | SELECT tablename FROM pg_tables, pg_sleep($1) WHERE schemaname <> $2
ref_start_ts | 17-AUG-18 11:52:38.698793 -04:00
ref_end_ts   | 18-AUG-18 11:52:38.698793 -04:00
- [ RECORD 3 ]+-----------------------------------------------------------------------------
query_id     | 349089096300352897
query        | SELECT tablename, schemaname FROM pg_tables, pg_sleep($1) WHERE schemaname <> $2
ref_start_ts | 17-AUG-18 11:52:38.698793 -04:00
ref_end_ts   | 18-AUG-18 11:52:38.698793 -04:00

edb_wait_states_sessions

この機能は、BGWによってサンプリングされたセッションに関する情報を提供します。

edb_wait_states_sessions(
  IN start_ts timestamptz default -infinity::timestamptz,
  IN end_ts timestamptz default infinity::timestamptz,
  OUT session_id int4,
  OUT <dbname> text,
  OUT <username> text,
  OUT ref_start_ts timestamptz
  OUT ref_end_ts timestamptz
)

この機能を使用して、接続されたデータベースと、それらのセッションを開始したユーザーを特定できます。例:

SELECT dbname, username, session_id
  FROM edb_wait_states_sessions();

edb_wait_states_queries() と同様に、この関数は、指定された間隔でサンプリングされたセッションを含むセッションファイルに記録されたすべてのセッションを出力します。指定された間隔でサンプリングされたセッションのみを出力するとは限りません。それを識別するには、 edb_wait_states_data() を使用します。

パラメーター

前述の一般的なパラメーターに加えて、出力の各行は次のことを示します。

dbname

セッションが接続されているデータベース。

username

セッションのログインユーザー。

例

以下は、 edb_wait_states_sessions() 関数の出力例です。

edb=# SELECT * FROM edb_wait_states_sessions();
__OUTPUT__
- [ RECORD 1 ]+---------------------------------
session_id   | 4340
dbname       | edb
username     | enterprisedb
ref_start_ts | 17-AUG-18 11:52:38.698793 -04:00
ref_end_ts   | 18-AUG-18 11:52:38.698793 -04:00
- [ RECORD 2 ]+---------------------------------
session_id   | 4398
dbname       | edb
username     | enterprisedb
ref_start_ts | 17-AUG-18 11:52:38.698793 -04:00
ref_end_ts   | 18-AUG-18 11:52:38.698793 -04:00
- [ RECORD 3 ]+---------------------------------
session_id   | 4410
dbname       | db1
username     | user1
ref_start_ts | 17-AUG-18 11:52:38.698793 -04:00
ref_end_ts   | 18-AUG-18 11:52:38.698793 -04:00
- [ RECORD 4 ]+---------------------------------
session_id   | 4422
dbname       | db2
username     | user2
ref_start_ts | 17-AUG-18 11:52:38.698793 -04:00
ref_end_ts   | 18-AUG-18 11:52:38.698793 -04:00

edb_wait_states_samples

この関数は、BGWによってサンプリングされた待機イベントに関する情報を提供します。

edb_wait_states_samples(
  IN start_ts timestamptz default -infinity::timestamptz,
  IN end_ts timestamptz default infinity::timestamptz,
  OUT query_id int8,
  OUT session_id int4,
  OUT <query_start_time> timestamptz,
  OUT <sample_time> timestamptz,
  OUT <wait_event_type> text,
  OUT <wait_event> text
)

通常、この関数を直接呼び出す必要はありません。

パラメーター

前述の一般的なパラメーターに加えて、出力の各行は次のことを示します。

query_start_time

このセッションでクエリが開始された時刻。

sample_time

待ちイベントデータを収集した時刻。

wait_event_type

セッションが待機している待機イベントのタイプ。

wait_event

セッション(バックエンド)が待機している待機イベント。

例

以下は、 edb_wait_states_samples() 関数の出力例です。

edb=# SELECT * FROM edb_wait_states_samples();
__OUTPUT__
- [ RECORD 1 ]----+---------------------------------
query_id         | 4292540138852956818
session_id       | 4340
query_start_time | 17-AUG-18 11:56:00.39421 -04:00
sample_time      | 17-AUG-18 11:56:00.699934 -04:00
wait_event_type  | Timeout
wait_event       | PgSleep
- [ RECORD 2 ]----+---------------------------------
query_id         | 4292540138852956818
session_id       | 4340
query_start_time | 17-AUG-18 11:56:00.39421 -04:00
sample_time      | 17-AUG-18 11:56:01.699003 -04:00
wait_event_type  | Timeout
wait_event       | PgSleep
- [ RECORD 3 ]----+---------------------------------
query_id         | 4292540138852956818
session_id       | 4340
query_start_time | 17-AUG-18 11:56:00.39421 -04:00
sample_time      | 17-AUG-18 11:56:02.70001 -04:00
wait_event_type  | Timeout
wait_event       | PgSleep
- [ RECORD 4 ]----+---------------------------------
query_id         | 4292540138852956818
session_id       | 4340
query_start_time | 17-AUG-18 11:56:00.39421 -04:00
sample_time      | 17-AUG-18 11:56:03.700081 -04:00
wait_event_type  | Timeout
wait_event       | PgSleep
                    .
                    .
                    .

edb_wait_states_purge

この関数は、 start_ts の後に作成され、 end_ts の前にエージング(ローテーション)されたすべてのサンプリングデータファイル(クエリ、セッション、および待機イベントサンプル)を削除します。

edb_wait_states_purge(
  IN start_ts timestamptz default -infinity::timestamptz,
  IN end_ts timestamptz default infinity::timestamptz
)

通常、この関数を実行する必要はありません。バックエンドは通常、保持期間に従ってそれらをパージします。ただし、何らかの理由でそれが起こらない場合、この機能を使用できます。

サンプルが保持された期間を調べるには、 edb_wait_states_data() を使用します。

例

このコードは、 edb_wait_states_purge() を実行する前に$PGDATA/edb_wait_states ディレクトリを示しています。

[root@localhost data]# pwd
/var/lib/edb/as14/data
[root@localhost data]# ls -l edb_wait_states
total 12
- rw------- 1 enterprisedb ...  253 Aug 17 11:56 edb_ws_queries_587836358698793_587922758698793
- rw------- 1 enterprisedb ... 1600 Aug 17 11:56 edb_ws_samples_587836358698793_587839958698793
- rw------- 1 enterprisedb ...   94 Aug 17 11:56 edb_ws_sessions_587836358698793_587922758698793

このコードは、 edb_wait_states_purge() を実行した後の$PGDATA/edb_wait_states ディレクトリを示しています。

edb=# SELECT * FROM edb_wait_states_purge();
__OUTPUT__
 edb_wait_states_purge
- ----------------------

(1 row)
[root@localhost data]# pwd
/var/lib/edb/as14/data
[root@localhost data]# ls -l edb_wait_states
total 0

非アクティブ化

EDB待機状態がより多くのデータを収集しないようにするには、次のように入力します。

ALTER SYSTEM SET edb_wait_states.enable_collection TO OFF;
SELECT pg_reload_conf();

EDB待機状態を再度有効にするには、 edb_wait_states.enable_collection をON に設定します。

SHOW コマンドを使用して、EDB待機状態がデータを収集しているかどうかを確認できます。次の例では、EDB待機状態でデータ収集が有効になっています。

edb=#SHOW edb_wait_states.enable_collection;
__OUTPUT__
 edb_wait_states.enable_collection
- ----------------------------------
 on
(1 row)