Statspackとは
Statspack設定
statspackでの情報収集
statspackレポートの出力
便利スクリプト
Oracleチューニング講座
第21章 自動共有メモリー管理とは
第9章「Oracleメモリー構造とプロセスについて復習する」
で説明した、システム・グローバル領域(SGA)を自動的にチューニングしてくれるという、自動共有メモリー管理機能がOracle10gより追加されています。
自動共有メモリー管理機能を使用することにより、メモリー管理が容易になります。
本章では、この機能について説明します。
概要
第10章から第18章までで記述したような、共有プールやデータベース・バッファ・キャッシュなどのSGAコンポーネントをそれぞれ手動で設定するというチューニング方法は、データベース管理者にとって大きな負荷になると考えられます。
そこでOracle10gからは、これらの管理を大幅に簡素化することができる、自動共有メモリー管理機能が追加されました。
この機能はデータベース管理者が、SGAのいくつかのコンポーネント(shared_pool、buffer_cache、large_pool、java_poolなど)に対して個々にサイズ設定する必要がなく、その代わりとして初期化パラメータsga_targetでSGAの合計サイズのみを指定するだけで、Oracle Databaseのメモリー使用率が最も効率的になるように様々なコンポーネントに自動的に分配してくれます。
sga_target>0(かつstatistics_level = typical or all)の場合、sga_targetで指定されたサイズが全てのSGAコンポーネントの合計サイズとなります。
しかし、初期化パラメータsga_targetを0に設定した場合は自動共有メモリー管理機能が無効となりますので、その場合は今まで通り各コンポートネントのサイズを個別に指定するという方法で、SGAの合計サイズを決定する事になりますのでご注意ください。
自動共有メモリー機能により自動調整されるコンポーネントはSGAを構成するコンポーネントのうちの以下です。
インスタンスの内部ビューと統計情報から、以下のコンポーネントに割り当てる適切なメモリーサイズを決定し、変化に応じて再分配も行います。
・共有プール
・データベース・バッファ・キャッシュ
・ラージ・プール
・Javaプール
・ストリームス・プール (初期化パラメータ:STREAMS_POOL_SIZE)
※OracleR10.2リリース以降
以下のコンポーネントは、自動で管理されませんので、引き続き初期化パラメータを設定してください。
・REDOログ・バッファ
・KEEP/RECYCLEバッファ・非標準ブロック用のバッファ
・ストリーム・プール((初期化パラメータ:STREAMS_POOL_SIZE)
※OracleR10.1のみ
以下に図で説明します。
図1:SGA内の自動調整されるコンポーネント
自動共有メモリー機能を有効とした場合、具体的には以下のような場合に各コンポーネントの自動調整が行われます。
■使用可能なメモリー領域が不足していてエラーが発生してしまうような場合。
動的に調整されることによりORA-4031(共有プールの領域不足)の発生を回避できる可能性が高くなりま
す。しかし、SGA_TARGETパラメータの範囲で領域を拡大しても足りないような場合は、やはりORA-4031
が発生するので注意が必要です。
■内部チューニング・アルゴリズムによってワークロードのパフォーマンスが監視され、サイズを調整したほうが
良いと判断されたとき。
サイズ変更の動作
メモリー不足となった領域に対するメモリーを供給元は、データベース・バッファ・キャッシュからのみです。
他のコンポーネントの領域が縮小・移動されることはありません。また、データベース・バッファ・キャッシュのサイズが増加することもありません。
この動作の理由としては、データベース・バッファ・キャッシュはサイズが不足したような場合、待機が発生することはあってもエラーになることが無いからです。それに対して、その他の領域はサイズ不足のエラーが発生する可能性があので、データベース・バッファ・キャッシュからメモリーが提供される仕組みになっています。
よって、SGA_TARGETパラメータの値を動的に大きな値に変更した場合は、増加分はまずデータベース・バッファ・キャッシュに必ず割当てられます。
ただし、他のコンポーネントの負荷が下がったと判断されれば、バッファキャッシュにメモリを戻すという動作は行われています。
NOTE
:
自動共有メモリー管理機能は、新しいバックグラウンド・プロセスであるMMAN(メモリー・マネージャ)プロセスを使用します。MMANプロセスは統計を定期的に収集し、各コンポーネントが必要とするサイズを状況に応じて調整します。
自動共有メモリー管理の設定
SGA合計サイズは、SGA_TARGETパラメータで設定します。このパラメータの値を0より大きな値に設定した場合、自動共有メモリー管理機能が使用されます。
SGA_TARGETパラメータ
概要
すべてのSGAコンポーネントの合計サイズを設定
構文
SGA_TARGET = n [ K | M | G ]
デフォルト
0 (自動共有メモリー管理は無効の状態)
最小値
64以上
変更の可/不可
可/ALTER SYSTEM
SGA_TARGETで設定するサイズは、自動管理されないREDOログ・バッファや、インスタンスで必要とする固定SGA領域などを全て含んだSGAの合計サイズです。そのため、これらの領域サイズをSGA_TARGETから引いた残りの領域が自動共有メモリーとして使用されることになります。
また、関連パラメータとして初期化パラメータSGA_MAX_SIZEがあります。
このパラメータには動的に変更できるSGA_TARGETパラメータの最大サイズを設定します。
ただし、起動時にSGA_TARGETの値がSGA_MAX_SIZEの値を超えていた場合は、SGA_TARGETの値がSGA_MAX_SIZEに上書きされます。
また、自動共有メモリー管理を使用している際、以下のパラメータは無効となるわけではなく各コンポーネントの最小サイズになります。
・共有プール(SHARED_POOL_SIZE)
・データベース・バッファ・キャッシュ(DB_CACHE_SIZE)
・ラージ・プール(LARGE_POOL_SIZE)
・Javaプール(JAVA_POOL_SIZE)
NOTE
:
SPFILEを使用している場合、インスタンスを停止してもその時点の各コンポーネントサイズは保持され、次回起動時に継承されます。
この実装は以下の(アンダースコアが2つ付く)パラメータで制御しています:
__db_cache_size
__shared_pool_size
__large_pool_size
__java_pool_size
各コンポーネントサイズが大きくなる毎にこのパラメータが更新され、今までの最大サイズがこのパラメータに設定されます。DB再起動時に共有プール、ラージプール、JAVAプールに関してはこのパラメータの値を採用して起動時に領域を割り当てます(残りをバッファ・キャッシュに割り当てます)。
自動共有メモリーに関する情報を示すビュー
以下に自動共有メモリー管理を使用している際に確認できるビューを記します。
現在のSGAコンポーネントの割当てを確認したい場合などに確認するビューです。
ビュー名
説明
V$SGA_CURRENT_RESIZE_OPS
現在進行中のSGAサイズ変更に関する情報。
V$SGA_DYNAMIC_COMPONENTS
インスタンス起動後のすべてのSGAサイズ変更に関する情報。
V$SGA_DYNAMIC_FREE_MEMORY
将来の動的SGAサイズ変更に使用可能なSGAメモリーの量に関する情報。
V$SGA_RESIZE_OPS
これまでに完了した400回のSGAサイズ変更操作に関する情報。
V$SGAINFO
GAのサイズ情報を示す。
以下に自動メモリー管理を使用した際の確認例を記します。OracleR10.1でのテスト例です。
例:自動共有メモリー管理を使用する
/* SGA_TARGETパラメータを120MBで設定 */
SQL> SHOW PARAMETER sga_target
NAME
TYPE
VALUE
----------
----------
-----------------
sga_target
big integer
120M
/* 現在のSGAコンポーネントの割当てを確認 */
SQL> SELECT * FROM v$sgainfo;
NAME
TYPE
VALUE
------------------------
----------
-----------------
Fixed SGA Size
777736
No
Redo Buffers
262144
No
Buffer Cache Size
62914560
Yes
Shared Pool Size
46137344
Yes
Large Pool Size
4194304
Yes
Java Pool Size
8388608
Yes
Streams Pool Size
0
Yes
Granule Size
4194304
No
Maximum SGA Size
125829120
No
Startup overhead in Shared Pool
33554432
No
Free SGA Memory Available
0
/* しばらくして再確認 */
SQL> SELECT * FROM v$sgainfo;
NAME
TYPE
VALUE
------------------------
----------
-----------------
Fixed SGA Size
777736
No
Redo Buffers
262144
No
Buffer Cache Size
58720256
Yes
Shared Pool Size
50331648
Yes
←バッファ・キャッシュ
の4Mが共有プール
に移行されている
Large Pool Size
4194304
Yes
Java Pool Size
8388608
Yes
Streams Pool Size
0
Yes
Granule Size
4194304
No
Maximum SGA Size
125829120
No
Startup overhead in Shared Pool
33554432
No
Free SGA Memory Available
0
また、各コンポーネントのサイズは、_SHARED_POOL_SIZE、_DB_CACHE_SIZE、
_LARGE_POOL_SIZE、_JAVA_POOL_SIZEに設定されている値で確認できます。
NOTE
:
SGA_TARGETを0にして自動共有メモリー管理を無効化した場合、SHARED_POOL_SIZEパラメータなどには、現在のサイズが自動的に設定されます。
以上で共有メモリー管理についての説明はこれで終了です。
メモリー管理の作業負荷軽減およびメモリ使用の効率化のためにご利用いただければと思います。
第22章では、データ・ブロックのサイズによるパフォーマンスへの影響について説明します。
第22章 データ・ブロックのサイズによるパフォーマンスへの影響を知る