動的SGAと自動メモリ管理に関する検証 その3

投稿日: 2004年8月04日

<動的SGAと自動メモリ管理に関する検証 その3>
ペンネーム:アイスケーキ

先週までは動的SGAと自動メモリ管理の関連する主要ディクショナリを含めて
一般的な動作を実演してみました。

結局のところOracle9iとの差異は動的にサイズ変更した場合、即時にサイズ変
更が反映されていた部分がOracle10gでは内部モードが追加され、時間をおい
て徐々にメモリサイズが変更されていくことです。。。

今回は素朴な疑問を試してみようかと思います。

◎コンポーネントパラメータの限界値(最小値)

果たして何処まで、自由に変更できるものでしょうか?

☆★☆★☆★

◆限界値

(最大値)
shared_pool_size にサイズを設定した場合は、そのサイズがsahred_poolの
下限値となります。shared_pool_size を500MBに設定すると、sga_targetを
いくつに設定しても、shared_pool_size に500MBが割り当てられます。

コンポーネントパラメータ値の最大値はSGAコンポーネントの総計が
sga_max_size
を超えることはできないので必然とその範囲での指定になります。
無理に指定してもアラートがでるだけです。

コンポーネントパラメータ値を手動で変更した場合、エラーは画面へ出力さ
れますが指定のアラートログファイルにも出力されます。

———————————————————————
□shared_pool_size にsga_target(293MB)より大きな値を設定

SQL> alter system set shared_pool_size=500M scope=memory;

ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-04033: Insufficient memory to grow pool

□アラートログより一部抜粋

Wed Aug  4 13:56:08 2004
MEMORY TRACING: MANUAL request
MEMORY TRACING: FG request
MEMORY TRACING: Receiver of memory is shared pool
MEMORY TRACING: Receiver size is 30 granules
MEMORY TRACING: Donor of memory is DEFAULT buffer cache
MEMORY TRACING: Donor size is 39 granules
MEMORY TRACING: Amount of memory requested is 0 bytes
MEMORY TRACING: Amount of memory to be got is 0 bytes
MEMORY TRACING: Amount of memory received is 0 bytes
MEMORY TRACING: Min contig requirement is 0 bytes
MEMORY TRACING: Granule size is 4194304 bytes
MEMORY TRACING: Request status is ERROR due to 4033
---------------------------------------------------------------------

アラートログファイルのフォーマットとして固定化されているのは先頭の15
文字(”MEMORY TRACING:”)だけようです。かなり自由なフォーマットで出力
されるので、一度見てみるのもいいかもしれません。

(最小値)
これは少し気になるので、早速やってみます。

●○●○
先ずはjava_pool_sizeとlarge_pool_sizeです。不要な環境では真っ先に0サ
イズにしたいです。DBA次第でしょうけどデフォルトサイズで放置してあるシ
ステムも時々見受けられます。

しかし、これを設定するのは少し厄介です。なぜなら、コンポーネントパラ
メータ値を設定したとしてもそれは、あくまでも下限値として設定だからです。

つまり、上限値の設定を行なわなければなりませんが、ちょっと調べたとこ
ろこのような値は無いようです。ただし、shared pool は例外で隠しパラメ
ータ(_shared_pool_max_size)が存在しています。
これは、shared poolのサイズが必要以上に大きくなるケースが多く、これを
制御する為なのかもしれません。

が、このパラメータの設定をおこなって有効性の検証を行ないましたが思った
ようには動作しませんでした。。。
_shared_pool_max_sizeを約30MBに設定しましたが、80MBのshared poolが確保
されています。

———————————————————————
□以下のパラメータを設定

_shared_pool_max_size         =30000000
shared_pool_size              =0

□Oracleを再起動して、v$sgainfo よりshared pool サイズを確認

(今まで初期パラメータを見る癖がついているDBAは戸惑うでしょうね)
Oracle10gからはSGAコンポーネントパラメータのサイズを調査する時に初期パ
ラメータの値だけをチェックして失敗しないようにしないといけませんね。。。

SQL> select * from v$sgainfo where name = 'Shared Pool Size';

NAME                                BYTES RESIZE
------------------------------ ---------- ------
Shared Pool Size                 83886080 Yes

———————————————————————

☆★☆★☆★

今回はちょっと夏バテ気味だったかも知れません。

猛暑の夏から脱出したい茅ヶ崎より