OceanBaseデータベースでは、待機イベント(Wait Event)を使用して、アクティブなセッションが待機状態にあることを示します。待機イベントは、ワーカースレッドがCPU計算を行っている状態や、I/O待機、ネットワーク待機、クリティカルセクション待機などの待機状態を記録するために使用されます。待機イベントを記録し統計を取ることで、システムのパフォーマンスボトルネックを特定するのに役立ち、特に高同時実行・小規模クエリのパフォーマンスシナリオにおいて有効です。待機イベントはパフォーマンス分析において重要な役割を果たし、システムパフォーマンスの最適化を支援します。
使用シナリオ
一般的に以下のような典型的なシナリオがあります:
現在のシステムでは、負荷がどれほど増加してもCPU使用率は比較的低くなります。これは通常、システム内に特定の同時実行のボトルネック、例えばホットスポットとなるクリティカルセクションなどが存在するためです。これらのクリティカルセクションでの待機時間を記録することで、この問題(Top Wait)を特定できます。
業務用SQLは通常RT<1msですが、時折>100msの尖った値が発生します。このような問題が発生する原因は、通常、SQL実行中に何らかの箇所で詰まっているためです。このSQLの実行過程での待機状況、特に最も時間の長い待機の詳細情報を記録することで、この問題(Max Wait)を特定できます。
システムが突然実行を停止する場合、その原因は通常、特定のセッションがブロックされているためです。例えば、ホットスポット行がある場合や、何らかの不明な理由によるデッドロックが発生した場合などです。セッションが現在待機している詳細情報を記録することで、この問題(Current Wait)を特定できます。
待機イベントのプロパティ
各待機イベントには、以下のプロパティが含まれます:
- 待機イベント名。
- 待機時間:各待機イベントがどのくらい続いたか。
- parameter1(p1)、parameter2(p2)、parameter3(p3):各待機イベントには3つの追加の待機イベントパラメータが付属しており、これらのパラメータは待機イベントに関する追加情報を提供し、待機が発生したコンテキストや原因を深く理解するのに役立ちます。
待機イベントの種類
待機イベントは、それらが表すリソースや操作の種類に基づいていくつかのカテゴリーに分類することができます。この分類により、データベース管理者はパフォーマンス問題の診断および解決時に問題の領域をより明確に特定することができます。
| 待機イベントのタイプ名 | 待機カテゴリ番号ID | 説明 |
|---|---|---|
| OTHER | 100 | 他のタイプに属さない待機イベント |
| APPLICATION | 101 | クライアントコードによって引き起こされる待機イベント |
| CONFIGURATION | 102 | データベースまたはインスタンスのリソース設定が不足しているために発生する待機イベント |
| ADMINISTRATIVE | 103 | データベース管理者がコマンドを入力したためにユーザーが待機する待機イベント |
| CONCURRENCY | 104 | データベース内部リソースを待機する待機イベント |
| COMMIT | 105 | ログコミットに関連する待機イベント |
| IDLE | 106 | セッションが非アクティブ状態で、タスクを待機する待機イベント |
| NETWORK | 107 | ネットワーク通信に関連する待機イベント |
| USER_IO | 108 | ユーザーI/Oを待機する待機イベント |
| SYSTEM_IO | 109 | バックグラウンドプロセスのI/Oを待機する待機イベント |
| CLUSTER | 111 | クラスタに関連する待機イベント |
OceanBaseデータベースには現在、11の主要なカテゴリと300以上の待機イベントがあり、ネットワーク、スケジューリング、クリティカルセクション、ロック、クラスタ、トランザクションコミット、ユーザーI/O(キャッシュページ不足など、ユーザーが直接引き起こすI/O待機)、システムI/O(メジャーコンパクションなど、バックグラウンドタスクによって引き起こされるI/O待機)などを網羅しています。すべての待機イベント関連の監視情報は、4つのビューで表示でき、待機統計と待機詳細に分かれています。待機統計にはセッションレベルとテナントレベルが含まれ、待機回数と待機時間を表示できます。外部モニタリングシステムの可視化ダッシュボードでの表示を推奨します。待機詳細にはセッションレベルが含まれ、一つは各セッションの現在の待機詳細(Current Wait)を表示し、現在のセッションが待機中でない場合は、直近で発生した1回の待機詳細を表示します。もう一つは、各セッションの履歴における直近10回の待機詳細を表示します。
イベント関連ビュー
OceanBaseデータベースにおけるすべてのイベントおよび対応するイベントパラメータは、ビューV$EVENT_NAMEから取得できます。システムテナント内でSQL文を使用して、すべてのイベントとそれらが属するイベントタイプをアルファベット順に表示できます。例:
obclient> SELECT name, wait_class FROM V$EVENT_NAME ORDER BY name;
OceanBaseデータベースにおけるイベントのクエリビューには、以下のものがあります:
| ビュー | 表示内容 |
|---|---|
| V$EVENT_NAME | テナント内のすべての待機イベントと、それぞれの待機イベントの詳細情報を表示します。 |
| GV$SYSTEM_EVENT | テナント(Tenant)の観点から待機イベントの集計情報を表示します。 |
| GV$SESSION_EVENT | セッション(Session)の観点から待機イベントの集計情報を表示します。これはすべてのセッションにおける過去のWait Eventの統計情報を示し、合計で何回待機イベントに入ったか、総待機時間、平均待機時間などを表示します。統計表であるため、p1,p2,p3などの情報は含まれません。 |
| GV$SESSION_WAIT | すべてのセッションの現在または最近完了した待機イベントの詳細情報を表示します。セッションレベルの待機詳細。 |
| GV$SESSION_WAIT_HISTORY | 各セッションの最近10回の待機イベントの詳細情報を表示します。セッションレベルの待機詳細履歴。 |
| V$OB_ACTIVE_SESSION_HISTORY | テナント内の現在のOBServerノードのアクティブセッション履歴を表示します。 |
| GV$OB_ACTIVE_SESSION_HISTORY | テナント内のすべてのOBServerノードのアクティブセッション履歴を表示します。 |
用途によって、イベント関連のモニタリング情報は待機統計と待機詳細の2種類に分類されます。
待機統計
主にパフォーマンスの最適化に使用され、各種待機イベントの合計待機回数、合計待機時間、合計タイムアウト回数、平均待機時間などを含みます。
GV$SYSTEM_EVENTビューはテナントレベルの待機イベント統計を説明しており、その主要なフィールドは以下のとおりです:
CON_ID:テナントID。SVR_IP:ノードIPアドレス。WAIT_CLASS:待機イベントのカテゴリ。EVENT_ID:待機イベントID。EVENT:待機イベント名。TOTAL_WAITS:合計待機回数。TIME_WAITED:合計待機時間。TOTAL_TIMEOUTS:合計タイムアウト回数。AVERAGE_WAIT:平均待機時間。
以下のステートメントを使用して、テナントの待機イベント統計を照会できます:
obclient> select tenant_id, tenant_name, sum(total_waits) as total_waits, sum(time_waited_micro) / 1000000 as time_waited_seconds
from v$system_event join DBA_OB_TENANTS
on v$system_event.con_id = DBA_OB_TENANTS.tenant_id
where v$system_event.wait_class <> 'IDLE' and DBA_OB_TENANTS.tenant_type!='META'
group by tenant_name;
クエリ結果は次のとおりです:
+-----------+---------------+-------------+---------------------+
| tenant_id | tenant_name | total_waits | time_waited_seconds |
+-----------+---------------+-------------+---------------------+
| 1 | sys | 14669140176 | 522012421.8556 |
| 1008 | mq_t1 | 3234084699 | 32159617.6839 |
+-----------+---------------+-------------+---------------------+
2 rows in set (0.06 sec)
待機の詳細
主に問題診断に使用され、特定の待機イベントの待機開始時間、現在の状態、残り時間などを含みます。問題の特定を容易にするため、待機の詳細では3つの特定のパラメータを指定できます。例えば、ロック操作によって引き起こされる待機の場合、誰がロックをかけるのか、どのモードのロックをかけるのか、現在誰がロックを保持しているのかといった詳細情報を待機の詳細に記録し、待機発生時にこれらの詳細情報を直接表示できます。
GV$SESSION_WAITビューはセッションレベルの待機の詳細を説明しており、その主要なフィールドは以下の通りです:
SID:セッションID。WAIT_CLASS:待機イベントのカテゴリ。EVENT:待機イベント名。P1TEXT、P1、P2TEXT、P2、P3TEXT、P3:待機の詳細で指定できる3つのパラメータ。STATE:現在の状態。WAIT_TIME_MICRO:既に待機している時間、単位はマイクロ秒。TIME_REMAINING_MICRO:残りの待機時間、単位はマイクロ秒。
以下のステートメントは、待機状態のセッションの待機の詳細情報を示しています:
obclient> select * from GV$SESSION_WAIT where STATE='WAITING' limit 1 \G
クエリ結果は次のとおりです:
*************************** 1. row ***************************
SID: 3222786366
CON_ID: 1
SVR_IP: xx.xx.xx.xx
SVR_PORT: 2882
EVENT: px loop condition wait
P1TEXT: address
P1: 140578612358640
P2TEXT:
P2: 0
P3TEXT:
P3: 0
WAIT_CLASS_ID: 104
WAIT_CLASS#: 4
WAIT_CLASS: CONCURRENCY
STATE: WAITING
WAIT_TIME_MICRO: 926
TIME_REMAINING_MICRO: 74
TIME_SINCE_LAST_WAIT_MICRO: 0
1 row in set (0.06 sec)
よくある待機イベント
現在、OceanBaseデータベースV4.xバージョンでは約309種類の待機イベントがあります。よく使われる待機イベントを以下に挙げます:
| 待機イベント名 | 待機イベントID | 待機イベントカテゴリ | 説明 |
|---|---|---|---|
| sync rpc | 13000 | NETWORK | データベースが同期RPCリクエストを送信した後、同期RPCの返信を待機します。 |
| das wait remote response | 13002 | NETWORK | SQL分散実行中、データベースはリモートDASタスクの実行結果を待機します。 |
| wait for network request in queue | 13004 | NETWORK | データベースシステムは特定のセッションリクエストを受信しましたが、そのリクエストはワーカースレッドによる処理を待機しています。 |
| db file data read | 10001 | USER_IO | ユーザーSQLリクエストがディスクから読み取り、データの返却を待機します。 |
| memstore memory page alloc wait | 11015 | SYSTEM_IO | ユーザーSQLはMEMStoreへの書き込みが必要であり、MEMStoreの書き込み領域割り当てを待機します。通常の原因はダンプ完了前でMEMStoreが利用可能でないことです。 |
| db file compact read | 11001 | SYSTEM_IO | データベースのダンプ時にディスク読み取り完了を待機します。 |
| db file compact write | 11002 | SYSTEM_IO | データベースのダンプ時にディスク書き込み完了を待機します。 |
| palf read | 11016 | SYSTEM_IO | データベースがclogログを読み取り、ディスク読み取り完了を待機します。 |
| palf write | 11017 | SYSTEM_IO | データベースがclogログを書き込み、ディスク書き込み完了を待機します。 |
| async commiting wait | 16018 | COMMIT | ログの非同期コミット完了を待機します。つまり、ClogがOceanBaseデータベースのコンセンサスプロトコルによってコミットされます。 |
| sleep: wait refresh schema | 30100 | CONFIGURATION | データベースの実行過程でSchema情報を取得する必要があり、Schemaが指定バージョンにリフレッシュされるのを待機します。 |
| mysql response wait client | 13001 | NETWORK | OceanBaseデータベースは、クライアントからの結果セットの送信完了を待機します。OceanBaseデータベースとクライアントがMySQLプロトコルでやり取りする場合、OceanBaseデータベースがクライアントに最後の結果セット以外を返信する際、その返信プロセスは同期されます。そのため、OceanBaseデータベースは結果セットの送信完了を同期待機しなければ、その後の操作を続けることができません。 |
| async rpc proxy condition wait | 15111 | NETWORK | OceanBaseデータベースは、内部ノード間の非同期ネットワーク通信の結果を待機します。 |
| exec inner sql wait | 30000 | OTHER | OceanBaseデータベースは、実行中に発行された内部テーブルへのアクセスSQLの結果返却を待機します。例えば、ユーザーテーブルの位置やSchema情報などを取得する場合です。 |
| sync get gts timestamp wait | 18101 | CONCURRENCY | ユーザーSQLの実行中、同期によるGTS(Global Timestamp Service)取得を待機します。 |