2012年2月14日火曜日

ASMインスタンスが使用するメモリサイズについて#2

DB設計の過程でOracleマニュアルを貪っていたら、
面白い内容があったので書いておきます。

以前にこんな記事を書きました。
ASMインスタンスが使用するメモリサイズについて

その時に
=================================================================
経験的にはDiskGroup(DG)の数が大量に存在するorサイズが大きいとかがない限り、
標準のMEMORY_TARGETで良いと思います。
DGの数が大量orサイズが大き目の場合、
LARGE_POOLやMEMORY_TARGETの引き上げを検討するのも悪くないと思います。
=================================================================
と書いています。

この時は、リストア&リカバリ試験の際に、
asmcmdからのDGリストア、DGのマウント時にORA-4031が発生し
ASMが起動しないという事象が発生したので、
LARGE_POOLへのメモリ割り当てを増加しました。
なお、その時のデータ量は1.5TB程度でした。

・・・


さて、ではなぜORA-4031が出て、LARGE_POOLへのメモリ割り当てで回避できたのか。
今日マニュアルを読んでいると、、

=================================================================
ラージ・プール

データベース管理者は、次の目的で大量のメモリーを割り当てるために、
ラージ・プールと呼ばれるオプションのメモリー領域を構成できます。

・共有サーバーおよびOracle XAインタフェース用のセッション・メモリー
 (トランザクションが複数のデータベースと対話する環境で使用)
・I/Oサーバー・プロセス
・Oracleのバックアップおよびリストア操作
=================================================================
出典:Oracle Database 概要 10gリリース2(10.2)


リストア操作!
なるほど。リストア時に、ここで使用されるメモリ領域を獲得できなかったからか。。


そしてリファレンスマニュアルを読むと

=================================================================
LARGE_POOL_SIZE

デフォルト値
SGA_TARGETが設定されているが、値が指定されていない場合のデフォルト値は0
(Oracle Databaseによって内部で決定される)。
LARGE_POOL_SIZEが指定されている場合は、プールの最小値を示す。
SGA_TARGETが設定されておらず、次の両方に該当する場合は0。

パラレル実行によって、プールが要求されない。
DBWR_IO_SLAVESが設定されていない。

それ以外の場合は、PARALLEL_MAX_SERVERS、PARALLEL_THREADS_PER_CPU、
CLUSTER_DATABASE_INSTANCES、DISPATCHERSおよびDBWR_IO_SLAVESの値から導出される。

この方法で導出される値には、自動ストレージ管理ファイルに使用される要件が
考慮されない。
一般的なガイドラインとして、ASMを使用するデータベース・インスタンスの
SGAのサイズに600KBを追加する

=================================================================
出典:Oracle Databaseリファレンス 11g リリース2(11.2)

ASMの場合は、600KB追加しておけと書いてある。
まぁ、600KB程度では足りなかっただろうけど、
ちゃんと指標が書いてある。。。


また、同マニュアルのSHARED_POOL_SIZEの項を見てみると、一番下の方に、、、

=================================================================
SHARED_POOL_SIZEと自動ストレージ管理

ASMを使用するデータベース・インスタンスでは、
エクステント・マップを格納するために追加メモリーが必要です。
一般的なガイドラインとして、次の問合せの値を集計して、
すでにASM上にあるか、これからASMに格納される、
現行のデータベース記憶域サイズを取得できます。
次に、使用されている(またはこれから使用される)冗長タイプを判断し、
集計した値を入力として使用して、SHARED_POOL_SIZEの値を計算します。

SELECT SUM(BYTES)/(1024*1024*1024) FROM V$DATAFILE;
SELECT SUM(BYTES)/(1024*1024*1024) FROM V$LOGFILE a, V$LOG b
WHERE a.group#=b.group#;
SELECT SUM(BYTES)/(1024*1024*1024) FROM V$TEMPFILE WHERE
status='ONLINE';
また、次のガイドラインに注意してください。

外部冗長性を使用するディスク・グループの場合:
(100GBの領域ごとに1MBの追加共有プールが必要)+ 2MB

通常の冗長性を使用するディスク・グループの場合:
(50GBの領域ごとに1MBの追加共有プールが必要)+ 4MB

高冗長性を使用するディスク・グループの場合:
(33GBの領域ごとに1MBの追加共有プールが必要)+ 6MB
=================================================================
出典:Oracle Databaseリファレンス 11g リリース2(11.2)


あの時は、1.5TBで外部冗長性だから、、、
1.5*1024/100=16↑ +2 = 18MBか。まぁ、問題ないな。
通常の冗長性だとこの2倍。
高冗長性だと約3倍。
むー


「Oracle ASM初期化パラメータの設定」節
「Oracle ASMの自動メモリー管理」項を読んでみると
注意というところに、


=================================================================
Oracle ASMのMEMORY_TARGETの最小値は256MBです
MEMORY_TARGETを100MBに設定すると、MEMORY_TARGETの値は自動的に256MBに増加します。
=================================================================
出典:Oracle Automatic Storage Management管理者ガイド 11gリリース2(11.2)


なるほど
読み進めると、ほとんどのパラメータは自動メモリ管理でおk。
となっているのですが、気になる記述も。。


=================================================================
PROCESSES
PROCESSES初期化パラメータはOracle ASMに影響しますが、
ほとんどの場合、デフォルト値が適しています。
ただし、複数のデータベース・インスタンスが1つのOracle ASMインスタンスに
接続している場合、次の式を使用できます


PROCESSES = 50 + 50*n

ここで、nはOracle ASMインスタンスに接続しているデータベース・インスタンスの数です。
=================================================================
出典:Oracle Automatic Storage Management管理者ガイド 11gリリース2(11.2)


ふーむ。インスタンス統合(インスタンスを複数起動する)によるDB統合環境や
プライベートクラウド環境では、注意が必要だなぁ。

更に読み進めると、、

=================================================================
Oracle ASMで使用するデータベース初期化パラメータの設定
・・・
自動メモリー管理を使用する場合、この項で説明するサイズ指定データは、
情報としてのみ、またはSGAに使用する適切な値を判断するための補足情報として扱うことができます。

・・・・

データベース・インスタンス上のSGAサイズ指定に関するガイドラインを次に示します。

PROCESSES初期化パラメータ: 現在の値に16を追加します。
LARGE_POOL_SIZE初期化パラメータ: 現在の値に600Kを追加します。
SHARED_POOL_SIZE初期化パラメータ: 次の問合せの値を集計して・・・
=================================================================
出典:Oracle Automatic Storage Management管理者ガイド 11gリリース2(11.2)


なんてこったい!!
ほとんどのパラメータは自動メモリ管理でおk。とか言っときながら、
同じことが書いてあるじゃないか。。



ということで何が言いたかったというと、
調子こいて、MEMORY_TARGETいんじゃん?
とか言っちゃってすみません。。

正しくは、マニュアルちゃんと読もうぜ。(おまえも俺も)

でしたとさ。

0 件のコメント:

コメントを投稿