ORACLEASMMおよびAMMの概要



Summary Oracle Asmm

ORACLEASMMおよびAMMの概要

概念の比較



ORACLEのAMM(自動メモリ管理)とASMM(自動共有メモリ管理)について混乱したり混乱したりする人もいると思います。両者の類似点と相違点はわかりません。この記事では、2つの側面の類似点と相違点を要約します。不備や欠落がある場合は、私を訂正してください!

ORACLEによってリリースされたバージョン履歴(タイムライン)から、ORACLEメモリ管理の一般的な履歴は次のとおりです。



ORACLE 9i PGA自動管理、SGA手動管理

ORACLE 10g PGA自動管理、SGA自動管理(ASMM、自動共有メモリ管理)

ORACLE 11g PGA、SGA統合自動管理(AMM、自動メモリ管理)



ORACLE 12cは11gと同じですが、変更はありません

公式文書は次のとおりです。

Oracle 9i

・Oracle9i以降、動的SGAインフラストラクチャにより、データベースをシャットダウンすることなく、バッファキャッシュ、共有プール、およびラージプールのサイズ設定が可能になりました。主な機能は次のとおりです。

o動的メモリのサイズ変更

oDB_BLOCK_BUFFERSの代わりにDB_CACHE_SIZE

o複数のブロックサイズのDB_nK_CACHE_SIZE

oPGA_AGGREGATE_TARGET自動PGAメモリ管理の導入

・Oracle Database 10g

・自動共有メモリ管理(ASMM)が10gで導入されました。 SGA_TARGETパラメータをゼロ以外の値に設定することにより、自動共有メモリ管理機能を有効にします。

・Oracle Database 11g

・自動メモリ管理は11gで導入されています。これにより、MEMORY_MAX_TARGETおよびMEMORY_TARGETという名前の2つの新しいパラメーターを使用して、PGAおよびSGAの自動調整が可能になります。

・Oracle Database 12c

Automatic Memory Management keeps the same behaviour as in 11g.

自動共有メモリ管理(ASMM)は、ORACLE10gによって導入された新しいテクノロジです。 ASMMは、SGAの自動管理を実装するために使用されます。 。自動共有メモリ管理が有効になっている場合、各メモリコンポーネントに値を設定する必要はなくなりました。もちろん、SGA_TARGETを設定し、パラメーターdb_cache_sizeとshared_pool_sizeを設定すると、db_cache_sizeとshared_pool_sizeの値が最小値になります。自動共有メモリ管理の正式な紹介は次のとおりです。

自動共有メモリ管理

以前のデータベースリリースでは、データベース管理者(DBA)は、SHARED_POOL_SIZE、DB_CACHE_SIZE、JAVA_POOL_SIZE、およびLARGE_POOL_SIZEパラメーターを含むいくつかの初期化パラメーターを設定することにより、さまざまなSGAコンポーネントサイズを手動で指定する必要がありました。 Oracle Database 10gには、SGAメモリ管理を大幅に簡素化する自動共有メモリ管理機能が含まれています。 Oracle Database 10gでは、DBAはSGA_TARGET初期化パラメータを使用してインスタンスで使用可能なSGAメモリの合計量を指定するだけで、Oracle Databaseはこのメモリをさまざまなサブコンポーネントに自動的に分散して、最も効果的なメモリ使用率を確保します。

自動SGAメモリ管理が有効になっている場合、さまざまなSGAコンポーネントのサイズは柔軟であり、追加の構成を必要とせずにワークロードのニーズに適応できます。データベースは、必要に応じて利用可能なメモリをさまざまなコンポーネントに自動的に分散し、システムが利用可能なすべてのSGAメモリを最大限に活用できるようにします。

ORACLE 10Gバージョンでは、ASMM、自動SGA管理、DBAがSGAの管理の問題を解決するのにある程度役立つようになり、パラメータSGA_TARGETを設定してASMMを制御するようになりました。 ASMM。ただし、10G R1などの初期バージョンでは、ASMMは十分に成熟しておらず、バグが多く、問題が増えていました。 ORACLE 10g R2の後続バージョンでは、ASMMは徐々に改善され、成熟してきました。

11g以降、ORACLEはPGAとSGAの統合された自動管理を実現しました。これは自動メモリ管理(AMM)と呼ばれます。これらの進化の観点から、オラクルは最初からさまざまなコンポーネントパラメータを手動で構成し、インテリジェンス、バカ、自動化の方向に向かって徐々に着実に進歩しました。これは避けられない歴史的傾向です。 AMMの公式ドキュメントは次のとおりです。

自動メモリ管理について

インスタンスメモリを管理する最も簡単な方法は、OracleDatabaseインスタンスがインスタンスメモリを自動的に管理および調整できるようにすることです。これを行うには(ほとんどのプラットフォームで)、ターゲットメモリサイズ初期化パラメータ(MEMORY_TARGET)と、オプションで最大メモリサイズ初期化パラメータ(MEMORY_MAX_TARGET)のみを設定します。次に、インスタンスはターゲットメモリサイズに調整し、必要に応じてシステムグローバル領域(SGA)とインスタンスプログラムグローバル領域(インスタンスPGA)の間でメモリを再配布します。ターゲットメモリの初期化パラメータは動的であるため、データベースを再起動せずにいつでもターゲットメモリのサイズを変更できます。最大メモリサイズは上限として機能するため、誤ってターゲットメモリサイズを大きく設定しすぎないようにします。また、将来的に合計インスタンスメモリを増やしたい場合に備えて、OracleDatabaseインスタンス用に十分なメモリを確保します。特定のSGAコンポーネントは簡単に縮小できないか、最小サイズのままにする必要があるため、インスタンスはターゲットメモリサイズを低く設定しすぎることも防ぎます。

Database Configuration Assistant(DBCA)を使用してデータベースを作成し、基本的なインストールオプションを選択すると、自動メモリ管理が有効になります。高度なインストールを選択した場合、データベース構成アシスタント(DBCA)を使用すると、自動メモリ管理を選択できます。

ORACLE 11g AMMの導入には、5種類のメモリ管理があります。

Automatic Memory Management (AMM): memory_target=non-zero is automatic memory management. If the initialization parameter LOCK_SGA=TRUE, AMM is not available. Automatic Shared Memory Management (ASMM): Automatic memory management in the case where memory_target=0 and sga_target are non-zero Manual shared memory management: memory_target=0 and sga_target=0 Specify sga parameters such as share_pool_size and db_cache_size Automatic PGA management : memory_target=0 and workarea_size_policy=auto and PGA_AGGREGATE_TARGET=value Manual PGA management: memory_target=0 and workarea_size_policy=manal Then specify PGA parameters such as SORT_AREA_SIZE, generally do not use manual management PGA.

Oracle Database 11gは、初期化パラメータ設定によって選択されるさまざまなメモリ管理方法をサポートしています。自動メモリ管理方式を有効にすることをお勧めします。

自動メモリ管理–SGAとインスタンスPGAの両方
自動共有メモリ管理–SGA用
手動共有メモリ管理–SGAの場合
自動PGAメモリ管理–インスタンスPGAの場合
手動PGAメモリ管理–インスタンスPGAの場合

ASMMがAMMに切り替わります

以下に示すように、自動メモリ管理は現在の実験環境では無効になっています(memory_target = 0)

SQL> select * from v $ version

バナー

Oracle Database 11g EnterpriseEditionリリース11.2.0.1.0-64ビット本番
PL / SQLリリース11.2.0.1.0-本番
CORE11.2.0.1.0プロダクション
TNS for Linux:バージョン11.2.0.1.0-本番環境
NLSRTLバージョン11.2.0.1.0-本番

SQL> show parameter memory_target

名前タイプ値


memory_target長整数0
SQL> show parameter memory_max_target

名前タイプ値


memory_max_target長整数0
SQL>
SQL> show parameter sga

名前タイプ値


lock_sgaブール値FALSE
pre_page_sgaブール値FALSE
sga_max_size長整数1G
sga_target大整数1G

11gでは、ASMMが使用されている場合、対応するメモリ共有セグメントは実際の共有セグメントです。

SQL>!
[root @ xxxxx〜] $ ipcs -m

------共有メモリセグメント--------
キーshmid所有者パーマバイトnattchステータス
0x000000004128770ルート64480 2
0x000000004161540ルート64416384 2
0x000000004194309ルート6442802
0xfc5d1940 7012369 oracle 660 1075838976 49

以下に示すように、最初にパラメータファイルタイプを確認してから、パラメータsga_target、memory_max_target、memory_targetを変更します。一部のパラメーターは静的パラメーターであるため、パラメーターを変更した後、データベースを再始動する必要があります。

SQL> show parameter spfile

名前タイプ値


spfile文字列/u01/app/oracle/product/11.1.0
/dbhome_1/dbs/spfilegsp.ora
SQL>システムセットの変更sga_max_size = 0 scope = spfile

システムが変更されました。

SQL>システムセットの変更sga_target = 0 scope = spfile

システムが変更されました。

SQL>システムセットの変更pga_aggregate_target = 0 scope = spfile

SQL>システムセットの変更memory_max_target = 1G scope = spfile

システムが変更されました。

SQL>システムセットの変更memory_target = 1G scope = spfile

システムが変更されました。

SQL>

データベースを再起動した後、対応するパラメータを確認してください。

SQL>即時シャットダウン
データベースが閉じられました。
データベースがマウント解除されました。
ORACLEインスタンスがシャットダウンしました。
SQL>スタートアップ
ORACLEインスタンスが開始されました。

システムグローバル領域の合計517816320バイト
固定サイズ2214776バイト
可変サイズ159384712バイト
データベースバッファ348127232バイト
やり直しバッファ8089600バイト
データベースがマウントされました。
SQL>パラメータメモリを表示

名前タイプ値


hi_shared_memory_address integer 0
memory_max_target長整数1G
memory_target長整数1G
shared_memory_address integer 0
SQL>

自動メモリ管理(AMM)が開始されると、システム共有セグメントは「仮想」共有セグメントになります。

[root @ xxxxx〜] $ ipcs -m

------共有メモリセグメント--------
キーshmid所有者パーマバイトnattchステータス
0x000000004128770ルート64480 2
0x000000004161540ルート64416384 2
0x000000004194309ルート6442802
0xfc5d1940 7077905 oracle 660 4096 0

11gMEMORY_TARGETパラメータの依存関係

次に、自動メモリ管理(AMM)モードで、パラメーターsga_max_size、sga_target、memory_max_target、memory_target、pga_aggregate_targetの間の関係は何ですか?実際、公式文書は精巧に作られています。

MEMORY_TARGETがゼロ以外の値に設定されている場合:

・SGA_TARGETとPGA_AGGREGATE_TARGETが設定されている場合、それらはそれぞれSGAとPGAのサイズの最小値と見なされます。 MEMORY_TARGETの値の範囲は、SGA_TARGET + PGA_AGGREGATE_TARGETからMEMORY_MAX_TARGETまでです。

・SGA_TARGETが設定されていて、PGA_AGGREGATE_TARGETが設定されていない場合でも、両方のパラメーターを自動調整します。 PGA_AGGREGATE_TARGETは、MEMORY_TARGET-SGA_TARGETの値に初期化されます。

・PGA_AGGREGATE_TARGETが設定されていて、SGA_TARGETが設定されていない場合でも、両方のパラメーターを自動調整します。 SGA_TARGETは、MEMORY_TARGETのゼロ以外の最小値(PGA_AGGREGATE_TARGETおよびSGA_MAX_SIZE)に初期化され、そのコンポーネントを自動調整します。

・どちらも設定されていない場合、最小値またはデフォルト値なしで自動調整されます。初期化時に、MEMORY_TARGETパラメータで設定された合計メモリをSGAおよびPGAに固定比率で分散するポリシーがあります。ポリシーは、起動時にSGAに60%、PGAに40%を与えることです。

MEMORY_MAX_TARGETが明示的に設定されていないが、MEMORY_TARGETが設定されている場合、インスタンスはMEMORY_MAX_TARGETをMEMORY_TARGETと同じ値に自動的に設定します。 MEMORY_TARGETが明示的に設定されていないが、MEMORY_MAX_TARGETが設定されている場合、MEMORY_TARGETはデフォルトで0になります。インスタンスの起動後、MEMORY_MAX_TARGETの値を超えない限り、MEMORY_TARGETをゼロ以外の値に動的に変更できます。

MEMORY_TARGETが設定されていないか、明示的に0に設定されていない場合(11gのデフォルト値は0):

・SGA_TARGETが設定されている場合、SGAのコンポーネントのサイズのみを自動調整します。 PGAは、明示的に設定されているかどうかに関係なく自動調整されます。ただし、SGAとPGAの組み合わせは自動調整されません。つまり、MEMORY_TARGETがゼロ以外の値に設定されている場合のように、SGAとPGAはメモリを共有せず、サイズも変更されません。

・SGA_TARGETもPGA_AGGREGATE_TARGETも設定されていない場合は、現在と同じポリシーに従います。PGAは自動調整され、SGAは自動調整されず、一部のSGAコンポーネントのパラメーターを明示的に設定する必要があります( SGA_TARGET)。

・MEMORY_MAX_TARGETのみが設定されている場合、MEMORY_TARGETはデフォルトで0になり、SGAとPGAは自動調整されません。デフォルトでは10gR2の動作になります。

・SGA_MAX_SIZEがユーザー設定でない場合、内部的にMEMORY_MAX_TARGETに設定されます。

実験して1つずつ確認してみましょう。

1:MEMORY_TARGETが0より大きい場合、SGA_TARGETおよびPGA_AGGREGATE_TARGETの値をゼロ以外に設定できます。対応する意味は次のとおりです。

If SGA_TARGET and PGA_AGGREGATE_TARGET are set, they represent the minimum value of the SGA and the minimum value of the PGA, respectively. The MEMORY_TARGET value can range from SGA_TARGET + PGA_AGGREGATE_TARGET to MEMORY_MAX_TARGET. Of course, the sum of SGA_TARGET + PGA_AGGREGATE_TARGET must be less than or equal to memory_target. In addition, if the values ​​of sga_target and pga_aggregate_target are set at the same time, the value of memory_target must be greater than or equal to the sum of sga_target and pga_aggregate_target. As shown in the following test:

SQL>システムセットの変更pga_aggregate_target = 200m scope = both

システムが変更されました。

SQL> show parameter pga_aggregate_target

名前タイプ値


pga_aggregate_target大整数200M
SQL>

SQL> show parameter sga

名前タイプ値


lock_sgaブール値FALSE
pre_page_sgaブール値FALSE
sga_max_size big integer 496M#sga_max_sizeが0に設定されていない理由の背後にある
sga_target大整数0
SQL>システムセットの変更sga_target = 400m scope = both

システムが変更されました。

SQL> show parameter sga

名前タイプ値


lock_sgaブール値FALSE
pre_page_sgaブール値FALSE
sga_max_size長整数496M
sga_target大整数400M
SQL>
clip_image001

SQL> show parameter sga

名前タイプ値


lock_sgaブール値FALSE
pre_page_sgaブール値FALSE
sga_max_size長整数496M
sga_target大整数400M
SQL> show parameter pga_aggregate_target

名前タイプ値


pga_aggregate_target大整数200M
SQL>システムセットの変更memory_target = 696m scope = both

システムが変更されました。

SQL>システムセットの変更memory_target = 600m scope = both

システムが変更されました。

SQL>システムセットの変更memroy_target = 500m scope = both
システムセットの変更memroy_target = 500m scope = both
*
1行目のエラー。
ORA-02065:ALTERSYSTEMのオプションが無効です

SQL>システムセットの変更memory_target = 500m scope = both
システムセットの変更memory_target = 500m scope = both
*
1行目のエラー。
ORA-02097:指定された値が無効であるため、パラメータを変更できません
ORA-00838:MEMORY_TARGETの指定値が小さすぎます。少なくとも600Mである必要があります

clip_image002

SQL> show parameter memory_target

名前タイプ値


memory_target長整数600M
SQL> show parameter sga

名前タイプ値


lock_sgaブール値FALSE
pre_page_sgaブール値FALSE
sga_max_size長整数496M
sga_target大整数400M
SQL> show parameter pga

名前タイプ値


pga_aggregate_target大整数200M
SQL>
SQL>
SQL>システムセットの変更pga_aggregate_target = 201m scope = both
システムセットの変更pga_aggregate_target = 300m scope = both
*
1行目のエラー。
ORA-02097:指定された値が無効であるため、パラメータを変更できません
ORA-00840:PGA_AGGREGATE_TARGETを指定された値に変更することはできません

上記のテストに示されているように、pga_aggregate_targetとsga_targetが設定されている場合、pga_aggregate_target + sga_targetはmemory_target以下である必要があります。さらに、memory_targetは(pga_aggregate_target + sga_target)以上である必要があります。

SGA_TARGETが設定されていて、PGA_AGGREGATE_TARGETが設定されていない場合でも、データベースはこれら2つのパラメーターを自動的に調整します。 PGA_AGGREGATE_TARGETは、MEMORY_TARGET-SGA_TARGETの値に初期化されます。

PGA_AGGREGATE_TARGETが設定されていて、SGA_TARGETが設定されていない場合でも、データベースはこれら2つのパラメーターを自動的に調整します。 SGA_TARGETはMEMORY_TARGET-PGA_AGGREGATE_TARGETに初期化され、この値の範囲とSGA_MAX_SIZE内で自動的に調整されます

SGA_TARGETもPGA_AGGREGATE_TARGETも設定されていない場合、最小値またはデフォルト値なしで自動的に調整されます。初期化プロセス中に、MEMORY_TARGETパラメータによって設定された合計メモリをSGAとPGAに一定の割合で割り当てる戦略があります。ポリシーは、起動時にSGA 60%とPGA 40%をPGAに与えることです。

2:SGA_MAX_SIZEが設定されていませんが、SGA_MAX_SIZEが0に設定されているか、reset alter system set sga_max_size = 0 scope = spfileを使用している場合でも、SGA_MAX_SIZEが常に値を持っているのはなぜですか。 SGA_MAX_SIZEの正式な紹介は次のとおりです。

SGA_MAX_SIZEは、イン​​スタンスの存続期間中のSGAの最大サイズを指定します。

64ビットプラットフォームおよびWindows以外の32ビットプラットフォームでは、MEMORY_TARGETまたはMEMORY_MAX_TARGETのいずれかが指定されている場合、SGA_MAX_SIZEのデフォルト値は2つのパラメーターの大きい方に設定されます。これにより、SGAの拡張用に予約されるアドレス空間が増えます。

Windows 32ビットプラットフォームでは、SGA_MAX_SIZEのデフォルト値は次の値の中で最大です。

・MEMORY_TARGETの60%(指定されている場合)

・MEMORY_MAX_TARGETの60%(指定されている場合)

・利用可能な仮想アドレス空間全体の25%

つまり、64ビットプラットフォームおよびWindows以外の32ビットプラットフォームでは、MEMORY_TARGETまたはMEMORY_MAX_TARGETが指定されている場合、SGA_MAX_SIZEのデフォルト値は2つのパラメーターの大きい方に設定されます。これにより、SGAの拡張用に予約されるアドレス空間が増えます。

これはいつも私を混乱させてきた場所でもあります。さらに、公式ドキュメントでは、MEMORY_TARGETを使用してAMMに切り替える場合、パラメーターSGA_MAX_SIZE(ASMMの場合)を設定しないでください。設定すると、SGAのラージが修正されます。

小さいため、MEMORY_TARGETの予想される使用法と競合します。 (オリジナル:SGA_MAX_SIZEが設定されていることも確認してください。AMMに切り替える場合、つまりMEMORY_TARGETを使用する場合は、

パラメータSGA_MAX_SIZE(ASMMに使用)は設定しないでください。設定するとSGAのサイズが修正されるため、競合が発生します。

MEMORY_TARGETの使用目的で。)

clip_image003

SGA_MAX_SIZEの値は変更しないことをお勧めします。値がMEMORY_MAX_TARGETより大きい場合、ORA-00844およびORA-00851エラーが報告されます。次のように

SQL>システムセットの変更sga_max_size = 1025M scope = spfile

システムが変更されました。
SQL>即時シャットダウン
データベースが閉じられました。
データベースがマウント解除されました。
ORACLEインスタンスがシャットダウンしました。
SQL>スタートアップ
ORA-00844:MEMORY_TARGETを考慮しないパラメータ
ORA-00851:SGA_MAX_SIZE1090519040をMEMORY_TARGET637534208より大きく設定することはできません。
SQL>

この時点で、対応するpfile pfileファイルを生成してから、*。sga_max_sizeの値を見つけ、対応するspfileを削除し、データベースインスタンスを削除する必要があります。また、その値をMEMORY_TARGETより大きく設定することもできます。

AMMがASMMに切り替わります

SQL>パラメータターゲットを表示

名前タイプ値


archive_lag_target integer 0
db_flashback_retention_target integer 1440
fast_start_io_target integer 0
fast_start_mttr_target integer 0
memory_max_target整数1552M
memory_target整数1552M
parallel_servers_target integer 16
pga_aggregate_target大きな整数0
sga_target大整数0
SQL>システムセットの変更memory_max_target = 0 scope = spfile

システムが変更されました。

SQL>システムセットの変更memory_target = 0 scope = spfile

システムが変更されました。

SQL>システムセットの変更pga_aggregate_target = 200m scope = spfile

システムが変更されました。

SQL>システムセットの変更sga_max_size = 1g scope = spfile

システムが変更されました。

SQL>システムセットの変更sga_target = 1g scope = spfile

システムが変更されました。

SQL>

SQL>スタートアップ
ORA-00843:MEMORY_MAX_TARGETを考慮しないパラメータ
ORA-00849:SGA_TARGET1073741824をMEMORY_MAX_TARGET0より大きく設定することはできません。
SQL>

対応するspfileのpfileファイルを生成し、2つのパラメータmemory_max_targetとmemory_targetを削除してから、対応するspfileを生成し、最後にデータベースインスタンスを再起動します。

SQL> spfileからpfileを作成

ファイルが作成されました。

* .memory_max_target = 0

* .memory_target = 0

SQL> pfileからspfileを作成

ファイルが作成されました。

SQL>

AMMまたはHugePagesを選択します

ORACLE 11gは、ASMMに基づくORACLEのさらなるメモリ管理自動化の進化形であるAMMの導入を開始しました。 ASMMはSGAを自動的に管理し、AMMはSGAとPGAを組み合わせて自動的に管理および調整します。データベースインスタンスメモリ全体の構成を完了するには、memory_targetのパラメータを設定するだけで済みます。ただし、AMMの最大の問題は、標準の大きなページを使用できないことであるため、この機能は広く使用されていません。標準のラージページ機能を使用するために、一部のシステムではAMMが無効になる場合があります。それで、それはAMMを使用していますか、それとも大きなページを使用していますか?多くの人(マスター)は、AMMの代わりにビッグページ機能を使用する傾向があります。これについては、次のブログ投稿を参照できます。

MEMORY_TARGET(SGA_TARGET)またはHugePages –どちらを選択しますか?

AMMとLinuxの巨大なページ

Oracleメモリ管理とHugePage

AMMからHugePageに切り替える方法については、公式ドキュメント(ID 2128928.1)を参照してください。

AMM(自動メモリ管理)を使用してデータベースをHugepageで構成されたデータベースに変換する方法

著者:Xiaoxiang隠者
ソース: http://www.cnblogs.com/kerrycode/