enq: US – contention

概要

enq: US – contention待機イベントを説明する前に、自動UNDO管理でUNDOセグメントがオンラインまたはオフラインになるタイミングについて理解しておく必要があります。 自動UNDO管理を設定すると、UNDOセグメントが自動的に管理されます。 この場合、UNDOセグメントがオンラインまたはオフラインになるタイミングは下記の3つです。

  • データベース起動時 : データベースの起動は大きくインスタンス起動、 データベース・マウント、データベース・オープンの3つの段階に分けられますが、 データベースがオープンになった時、UNDOセグメントはオンラインになります。
  • UNDO表領域の変更時: ALTER SYSTEM SET UNDO_TABLESPACEコマンドで、UNDO表領域を変更した時、 既存のUNDOセグメントはオフラインになり、新しいUNDOセグメントがオンラインになります。
  • トランザクション量の急増時 : トランザクション量が急増し、 既存のUNDOセグメントだけではトランザクション量を耐えられなくなった時は、 オフラインだったUNDOセグメントをオンラインに変更するか、新しいUNDOセグメントを生成します。 この現象を簡単に確認するため、初期サイズが小さいUNDO表領域を作成して、 トランザクション量を増やすテストをすると、オンラインUNDOセグメントが増えることが確認できます。 もし、ある一定の期間内にトランザクションが発生しなかったり、トランザクション量が減ると、UNDOセグメントが自動にオフラインされます。 このような作業はSMONが担当しています。 Oracle9.2.0.4バージョンまでは、長時間使われていないUNDOセグメントは自動に削除される場合があります。

このようにUNDOセグメントがオンラインまたはオフラインになる場合、該当作業を実行するサーバー・プロセスやバックグラウンド・プロセスは、 同期を取るためUSロックを獲得しなければなりません。 USロックはUNDOセグメントごとに一つずつ割り当てられ、ID1はUNDOセグメント番号となります。USロックを獲得する時、競合が発生すると、enq:US – contention待機イベントで待機します。 サーバー・プロセスには、トランザクションを開始する時点でUNDOセグメントが割当られますが、使用可能なUNDOセグメントが存在しない場合は新らしくUNDOセグメントを生成したり、オフラインのUNDOセグメントを オンラインにする必要があります。この作業が行われる間、サーバー・プロセスはUNDOセグメントが確保されるまでUSロックを獲得するため待機することになります。

トランザクション量が激しく変化する場合、UNDOセグメントをオンラインにする作業によりUSロック競合が 広い範囲で発生する可能性があります。データベースが起動されてからしばらくの間は、オンラインのUNDOセグメント数が少ないです。 この状況で突然トランザクション量が増えると、複数のユーザー・セッションではUNDOセグメントがオンラインになるまで待機します。 また、一定時間トランザクションが発生せずUNDOセグメントがオフラインになった状態でトランザクション量が増えた時も同じです。 この時、ユーザー・セッションにはUSロックによる待機が発生します。UNDOセグメントがオンラインになると、アラート・ログには下記のような情報が記録されます。

Thu Feb 23 09:24:11 2006
Undo Segment 22 Onlined
Thu Feb 23 09:24:11 2006
Undo Segment 23 Onlined
Thu Feb 23 09:24:11 2006
Undo Segment 24 Onlined
Thu Feb 23 09:24:12 2006
Undo Segment 25 Onlined
Thu Feb 23 09:24:12 2006
Undo Segment 26 Onlined
…

待機パラメータと待機時間

待機パラメータ

  • P1 : エンキュー情報(タイプとモードを含む)
  • P2 : UNDOセグメント番号
  • P3 : 0

待機時間

1回の待機で最大3秒まで待ちますが、USロックを獲得するまで待機します。

チェックポイントとソリューション

10511イベントの適用

通常のシステムでは突然多くのUNDOセグメントがオンラインになる可能性は低いため、一般的にはUSロックが発生する場合はほとんどありません。 しかし、トランザクションの変化が激しくUSロックが発生するシステムでは、下記のように10511イベントを実行することを推奨します。10511イベントは、SMONがUNDOセグメントをオフラインにする機能を無効にするコマンドです。

event="10511 trace name context forever, level 2" 

このコマンドを実行すると、Oracleを再起動しても一度オンラインとなったUNDOセグメントは再びオフラインになりません。 従って、UNDOセグメントのオンライン化によるUSロックの発生もなくなります。

Oracle再起動が許されない環境で、この機能を適用しなければならない場合は、ORADEBEGユーティリティを利用します。 ORADEBEGユーティリティのコマンドは下記の通りです。

oradebug setospid <smon_ospid>
oradebug event 10511 trace name context forever, level 1
oradebug setmypid 

豆知識

分析事例

UNDOセグメントとenq:US – contention待機イベント発生現象

性能低下区間の分析

アラート・ログ・ファイルで障害時点を確認すると、 UNDOセグメントがオンラインになったり、新規UNDOセグメントも急増しています。

9時24分から30個のUNDOセグメントがオンラインになり、11個のUNDOセグメントが新規に生成されています。


Thu Feb 23 09:24:11 2006 Undo Segment 22 Onlined
Thu Feb 23 09:24:11 2006 Undo Segment 23 Onlined
Thu Feb 23 09:24:11 2006 Undo Segment 24 Onlined
Thu Feb 23 09:24:12 2006 Undo Segment 25 Onlined
Thu Feb 23 09:24:12 2006 Undo Segment 26 Onlined
Thu Feb 23 09:24:12 2006 Undo Segment 27 Onlined
Thu Feb 23 09:24:12 2006 Undo Segment 28 Onlined
Thu Feb 23 09:24:12 2006 Undo Segment 29 Onlined
Thu Feb 23 09:24:13 2006 Undo Segment 30 Onlined
Thu Feb 23 09:24:13 2006 Undo Segment 31 Onlined
Thu Feb 23 09:25:17 2006 Undo Segment 32 Onlined
Thu Feb 23 09:30:19 2006 Undo Segment 39 Onlined
Thu Feb 23 09:30:31 2006 Undo Segment 40 Onlined
Thu Feb 23 09:30:48 2006 Undo Segment 41 Onlined
Thu Feb 23 09:31:02 2006 Undo Segment 42 Onlined
Thu Feb 23 09:31:14 2006 Undo Segment 43 Onlined
Thu Feb 23 09:31:23 2006 Undo Segment 44 Onlined
Thu Feb 23 09:31:24 2006 Undo Segment 45 Onlined
Thu Feb 23 09:31:34 2006 Undo Segment 46 Onlined
Thu Feb 23 09:31:40 2006 Undo Segment 47 Onlined
Thu Feb 23 09:31:41 2006 Undo Segment 48 Onlined
Thu Feb 23 09:31:42 2006 Undo Segment 49 Onlined
Thu Feb 23 09:31:45 2006 Undo Segment 50 Onlined
Thu Feb 23 09:31:46 2006 Undo Segment 51 Onlined
Thu Feb 23 09:31:47 2006 Undo Segment 52 Onlined
Thu Feb 23 09:31:56 2006 Created Undo Segment _SYSSMU67$ Undo Segment 67 Onlined
Thu Feb 23 09:31:57 2006 Created Undo Segment _SYSSMU68$ Undo Segment 68 Onlined
Thu Feb 23 09:31:58 2006 Created Undo Segment _SYSSMU69$ Undo Segment 69 Onlined
Thu Feb 23 09:31:58 2006 Created Undo Segment _SYSSMU70$ Undo Segment 70 Onlined
Thu Feb 23 09:31:59 2006 Created Undo Segment _SYSSMU71$ Undo Segment 71 Onlined
Thu Feb 23 09:32:00 2006 Created Undo Segment _SYSSMU72$  
Thu Feb 23 09:32:01 2006 Created Undo Segment _SYSSMU73$
Thu Feb 23 09:32:01 2006 Created Undo Segment _SYSSMU74$
Thu Feb 23 09:32:02 2006 Created Undo Segment _SYSSMU75$
Thu Feb 23 09:32:03 2006 Created Undo Segment _SYSSMU76$
Thu Feb 23 09:32:03 2006 Created Undo Segment _SYSSMU77$

MaxGaugeの「Lock Tree」で障害発生時の時間帯を調べると、エンキューの待機が発生し、その原因がUSロックであることが確認できます。

マックスゲージ画面

enq:US – contention待機イベントを追跡すると、9時30分から9時54分まで最大1400秒まで待機しています。 このような情報を元に、先ほどアラート・ログ・ファイルのUNDOセグメントのオンライン作業が、 USロックの原因になっていると推論できます。

UNDO関連のUNDO_MANAGEMENT初期化パラメータを確認すると、AUTOになっており、自動的にUNDOが管理されています。

このような設定では、トランザクションの量が急増した場合、UNDOセグメントをオンラインにする必要があるため、 USロックの待機が発生する可能性があります。トランザクション量の変化が激しい原因を探るため、 障害が発生し始めた時点の9時20分の指標の推移を確認すると、この時点から接続ユーザー数が急増していることが確認されます。 (「logons current」指標を参照)

マックスゲージ画面

Oracleはトランザクション量が速い速度で増加した場合や、既に使っていたUNDOセグメントだけではトランザクション量を耐えられなくなった場合、 新しいUNDOセグメントを生成したり、オフライン状態のUNDOセグメントをオンラインにします。

ある一定の期間、トランザクションがほとんどなかったり、トランザクション量が減っていたりすると、 OracleはUNDOセグメントをオフラインにしますが、この作業を担当するのがSMONです。

セッションが急増し、トランザクション量も増えると、Oracle内部ではUNDOセグメントをオンラインにする作業が行われます。 この作業によりUSロック待機が発生する可能性は非常に高いです。

特に、Oracleが起動された直後のオンラインUNDOセグメントが少ない状態、もしくは、UNDOセグメントがオフラインになっていた状態で トランザクション量が急増すると、 複数のユーザー・セッションがUSロックを獲得するために待機します。 この時、複数のユーザー・セッションはUNDOセグメントがオンラインになるまでずっと待機することになります。

解決策

10511イベントはUNDOセグメントのオフライン化を担当するSMONの機能を無効化します。

Event = “10511 trace name context forever, level 2”

このコマンドを実施することによって、一回オンラインになったUNDOセグメントはOracleを再起動した後もオフラインになりません。 そのため、UNDOセグメントの頻繁なオンライン化作業が原因で発生したUSロックは発生しなくなります。 ユーザーの接続数が急増し、enq:US – contention待機イベントが発生するシステムの場合には、適用することを推奨します。