OceanBaseデータベースでは、ウェイトイベント(Wait Event)を用いて、アクティブなセッションが待機状態にあることを示します。ウェイトイベントは、ワーカースレッドがCPU計算中であるか、I/O待ち、ネットワーク待ち、クリティカルセクション待ちなどの状態を記録するために使用されます。ウェイトイベントの記録と統計により、システムのパフォーマンスボトルネックを特定するのに役立ち、特に高並行性でクエリが短いパフォーマンスシナリオにおいて有効です。ウェイトイベントはパフォーマンス分析において重要な役割を果たし、システム性能の最適化を支援します。
適用シナリオ
一般的に以下の典型的なシナリオがあります:
現在のシステムでは、負荷がどの程度増加してもCPU使用率が比較的低いままです。これは通常、システム内に並行処理のボトルネック、例えばホットスポットとなるクリティカルセクションなどが存在するためです。これらのクリティカルセクションでの待機時間を記録することで、この問題(Top Wait)を特定できます。
業務SQLの応答時間は通常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データベースでは現在、ネットワーク、スケジューリング、クリティカルセクション、ロック、クラスタ、トランザクションコミット、ユーザーI/O(キャッシュのページ不足など、ユーザーが直接引き起こすI/O待機)、システムI/O(メジャーコンパクションなど、バックグラウンドタスクが引き起こすI/O待機)など、11の大カテゴリ、300種類以上の待機イベントがあります。すべての待機イベント関連の監視情報は、待機統計と待機詳細の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、グローバルタイムスタンプサービス)の同期取得を待機しています。 |