
enq: US – contention - 日本エクセム株式会社 Oracle待機イベント情報
目次[非表示]
基本情報
enq: US – contention待機イベントを説明する前に、自動UNDO管理でUNDOセグメントがオンラインまたはオフラインになるタイミングについて理解しておく必要があります。自動UNDO管理を設定すると、UNDOセグメントが自動的に管理されます。この場合、UNDOセグメントがオンラインまたはオフラインになるタイミングは下記の3つです。
このようにUNDOセグメントがオンラインまたはオフラインになる場合、該当作業を実行するサーバー・プロセスやバックグラウンド・プロセスは、同期を取るためUSロックを獲得しなければなりません。USロックはUNDOセグメントごとに一つずつ割り当てられ、ID1はUNDOセグメント番号となります。USロックを獲得する時、競合が発生すると、enq: US – contention待機イベントで待機します。サーバー・プロセスには、トランザクションを開始する時点でUNDOセグメントが割当られますが、使用可能なUNDOセグメントが存在しない場合は新らしくUNDOセグメントを生成したり、オフラインのUNDOセグメントをオンラインにする必要があります。この作業が行われる間、サーバー・プロセスはUNDOセグメントが確保されるまでUSロックを獲得するため待機することになります。
トランザクション量が激しく変化する場合、UNDOセグメントをオンラインにする作業によりUSロック競合が広い範囲で発生する可能性があります。データベースが起動されてからしばらくの間は、オンラインのUNDOセグメント数が少ないです。この状況で突然トランザクション量が増えると、複数のユーザー・セッションではUNDOセグメントがオンラインになるまで待機します。また、一定時間トランザクションが発生せずUNDOセグメントがオフラインになった状態でトランザクション量が増えた時も同じです。この時、ユーザー・セッションにはUSロックによる待機が発生します。UNDOセグメントがオンラインになると、アラート・ログには下記のような情報が記録されます。
待機パラメータと待機時間
待機パラメータ
待機時間
1回の待機で最大3秒まで待ちますが、USロックを獲得するまで待機します。
チェックポイントとソリューション
10511イベントの適用
通常のシステムでは突然多くのUNDOセグメントがオンラインになる可能性は低いため、一般的にはUSロックが発生する場合はほとんどありません。しかし、トランザクションの変化が激しくUSロックが発生するシステムでは、下記のように10511イベントを実行することを推奨します。10511イベントは、SMONがUNDOセグメントをオフラインにする機能を無効にするコマンドです。
このコマンドを実行すると、Oracleを再起動しても一度オンラインとなったUNDOセグメントは再びオフラインになりません。従って、UNDOセグメントのオンライン化によるUSロックの発生もなくなります。
Oracle再起動が許されない環境で、この機能を適用しなければならない場合は、ORADEBEGユーティリティを利用します。ORADEBEGユーティリティのコマンドは下記の通りです。
分析事例
UNDOセグメントとenq:US – contention待機イベント発生現象
性能低下区間の分析
アラート・ログ・ファイルで障害時点を確認すると、UNDOセグメントがオンラインになったり、新規UNDOセグメントも急増しています。
9時24分から30個のUNDOセグメントがオンラインになり、11個のUNDOセグメントが新規に生成されています。
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の機能を無効化します。
このコマンドを実施することによって、一回オンラインになったUNDOセグメントはOracleを再起動した後もオフラインになりません。そのため、UNDOセグメントの頻繁なオンライン化作業が原因で発生したUSロックは発生しなくなります。ユーザーの接続数が急増し、enq: US – contention待機イベントが発生するシステムの場合には、適用することを推奨します。