Enq: HW – contention

基本情報

 

HWM(High Water Mark)を複数のプロセスが同時に変更することを防ぐためのロックをHWロックと呼びます。HWMを移動させようとするプロセスは、必ずHWロックを獲得しなければならりません。HWロックを獲得する過程で競合が発生した場合enq:HW – contentionイベントで待機することになります。HWロック競合はほとんどが大量のInsertによって発生しますが、場合によっては大量のUpdateによって、UNDOセグメントのHWロック競合現象が発生する場合もあります。Updateの場合、テーブルのセグメントの追加拡張は大きくないのですが、UNDOデータを生成する過程でのUNDOセグメントの急速な拡大が必要なためです。HWロック競合は、セグメントの急速な空間の拡張が必要な場合に非常に普遍的に表示される待機現象であり、極端な性能低下を引き起こす場合もしばしば発生します。

 

パラメータと待機時間

 

待機パラメータ

 

enq:HW - contention待機イベントの待機パラメータは以下の通りです。

P1:Enqueue情報
P2:Tablespace#
P3:Segement Header Block#

 

待機時間

 

enqueue待機イベントと同一で、最大3秒まで待ちます。もしHWロックを獲得する場合、獲得するまで待機します。

 

Check Point&Solution

 

FLMを使用する場合

 

FLM(Free List Management)を使用している場合にHWロック競合が特によく観察されます。 FLMを使用する場合は、デフォルトの設定値が大量のInsert作業には適していないからです。 FLM環境でHWロック競合を減らす方法は、次のとおりです。

 

まず、Storage属性のFREELISTS属性値(デフォルトは1)を、同時トランザクションの数を考慮して十分に大きくとります。 FLMで発生する多くのパフォーマンスの問題がFREELISTS属性値に起因することがあります。 FREELISTSの値が大きければHWM移動時に割り当てられるブロックの数が増えるので、その分、HWロックの競合が減る効果があります。

 

第二に、_BUMP_HIGHWATER_MARK_COUNT隠しパラメータの値を大きく設定します。 _BUMP_HIGHWATER_MARK_COUNT値は、単一のフリーリストごとにHWMを移動するサイズを決定します。例えばFREELISTS値が10であり、_BUMP_HIGHWATER_MARK_COUNT値が20であれば、一度に200ブロック(10 * 20)だけHWMが移動することになります。

 

第三に、適切なサイズのエクステントを使用します。エクステントのサイズが小さいとHWMの移動時にエクステントを追加割り当て作業が頻繁に発生してHWロックを保持している時間も長くなるからです。したがって、トランザクションのサイズを考慮して、エクステントのサイズを適切に設定することが重要となります。ほとんどの場合、Extent Management Local Uniform Size 5M程度の設定値を勧告しています。

ASSMを使用している場合

 

  ASSM(Automatic Segment Space Management)を使用している場合には、HWロック競合が大きく問題になりません。ASSMの改善されたセグメント管理手法により、FLMを使用する場合と同じパフォーマンスの問題が生じないからです。たとえHWロック競合が発生して問題になってもチューニングできる要素はほとんどありません。ASSM管理手法では、ほぼすべてが自動化されていて、もしASSMを使用するセグメントでHWロック競合が原因でenq:HW – contentionイベントが発生した場合、エクステント(Extent)のサイズを増やす方法を試してみます。また、事前にエクステントを割り当てる受けておくのも良い方法です。エクステントのサイズが大きく、大きなサイズのエクステントを事前に割り当てられた場合には、HWMを移動する際のオーバーヘッドがそれほど減るからです。

Event Tip

 

セグメント、エクステント、HWMの概念

 

Oracleは、セグメントと呼ばれる概念を利用してデータベースの容量(Space)を管理します。したがって、Oracle空間に関連するパフォーマンスの問題を理解するには、セグメント管理手法についてある程度の知識が必要です。

 

セグメント(Segment)は、テーブル、インデックス、UNDO、LOBなどのOracleが提供するすべての種類の論理的な空間をいいます。セグメントは、再びエクステント(Extent)という論理的な要素で分けられ、エクステントはデータの追加に伴うセグメント領域の拡張を担当する役割をします。例えば、セグメントの既存の空き容量が消耗した状態で、追加のInsertが発生した場合、Oracleは、エクステントを追加で割り当てて、データを保存します。エクステントは、ブロック(Block)と呼ばれる連続した物理の部分からなります。一つのエクステントは、通常、複数のブロックからなります。ブロックは、Oracleの物理的/論理的なIOの最小単位です。

 

Oracleがエクステントによって新規に割り当てられたすべての領域をすべて実際に使用されているわけではないので、使用された空間と、まだ使用されていない領域を区別する標識が必要となります。このマーカーをハイウォーターマーク(High Water Mark。以下HWM)と呼びます。 HWMはセグメントヘッダブロックにその情報が格納されます。

 

HWMの概念を解説します。

 

現在合計500ブロックが割り当てられていて、すべてのブロックを使用中であるテーブル(セグメント)に1件のローを追加でInsertするとします。 使用可能な空間がないのでプロセスはエクステントを追加で割り当てなければなりません。 DMT(Dictionary Managed Tablespace)を使う場合にはSTラックを取得した後にだけエクステント割当作業が可能です。 STラックを取得する過程で競合が発生すればenq:ST – contentionイベントを待機します。 STラック競合はOpacle 9i以後ではほとんど発生しません。 エクステントが追加で割り当てられこれに伴い、合計50ブロック(1イクステント= 50ブロックだと仮定)がセグメントに追加されます。 50個のブロック中でOracleはいくつかのブロック(ここでは5個だと仮定)だけをフォーマット(Format)と使用可能空間を登録します。 すなわち、全体550ブロック中Used Block = 500 + 5 = 505,Unused Block = 45となります。 このような基準をOracleではHWMと呼びます。 すなわち、HWMはセグメントの全体空間のうち使用可能空間(フォーマットされた空間)と未使用空間(未フォーマット空間)を区分する基準になります。 万一、追加で引き続きInsertが成り立ってフォーマットされた5個のブロックを全て使用することになれば追加で5個のブロックをフォーマットしてこれを使用可能空間で切り替えてHWMを移動することになります。 HWMを移動する作業はHWラックを通じて保護されます。 HWMを移動しようと思うプロセスは必ずセグメントに対してHWラックを取得しなければなりません。 HWラックを取得する過程で競合が発生すればenq:HW – contentionイベントで待機します。 同時に色々なセッションが同一セグメントに対して大量のデータを追加する場合、頻繁なHWM移動によってHWラック競合現象が広範囲に発生する可能性があります。 HWMの移動は一つのエクステントが全部使われる時まで続きます。 万一、一つのエクステントをすべて使うことになればOracleは追加的に再びエクステントを割り当てます。

 

Oracleが提供するセグメント空間管理技法はFLM(手動管理)とASSM(自動管理)に分かれます。 テーブルスペース生成時付与するsegment space management属性によってFLMとASSMの使用の有無が決定されます。