【記憶體管理】Oracle AMM自動記憶體管理詳解

恩強Boy發表於2020-08-27

一、  Oracle 的三種記憶體管理方式

oracle 記憶體管理有三種方式,每一個 instance 只能夠選擇一種。這三種管理方式分別是 AMM 自動記憶體管理( Automatic Memory Management )、 ASSM 自動共享記憶體管理( Auto Shared Memory Management )、 msmm 手動共享記憶體管理( Manual Shared Memory Management )。

本文針對AMM 自動記憶體管理進行詳細原理闡述。

二、  AMM 原理闡述

自動記憶體管理automatic memory management (以下均稱 AMM )是 oracle 11g 新推出的新特性,意在對例項中的 PGA SGA 進行自動管理。 AMM 是自動共享記憶體管理 automatic shared memory management ASMM )的擴充。

1.  AMM 中涉及到的引數

- memory_max_target

- memory_target

- sga_max_size

- sga_target

- pga_aggregate_target

2.  AMM 的啟用

方式一 DBCA 圖形介面下,要選擇 AMM 自動記憶體管理, step9 選擇 use Automatic Memory Management 即可。如下圖

方式二 :可以透過以下兩個引數之一啟用

 - memory_target :定義 sga pga 總和的上限

 - memory_max_taregt :定義 memory_target 的上限

假設memory_max_target 設定為 1400m memory_target 設定為 1000m ,那麼只有 1000m 會被用在 instance 中,剩下的 400m 會被 oracle 用做儲備。因為 memory_max_target 已經指定了,所以可以動態的修改 memory_target 引數,而不需要重啟資料庫。

如果memory_max_target memory_target 相同,或者 memory_max_target 沒有設定,那麼 memory_target 就不能動態增長,並且修改後需要重啟 instance

memory_max_target 將一直在引數檔案中顯式設定,或者被記憶體管理後臺程式隱式設定。 memory_max_target 會定義 instance 鎖定的記憶體。如果 memory_max_target 沒有在引數檔案中設定,那麼他的大小預設為 mrmory_target

3.  AMM 的選項引數

所有的SGA 記憶體引數都會設定在 AMM 環境,如果 SGA 引數沒有被設定,那麼記憶體管理器將會進行以下設定:

60% to sga_target

40% to pga_aggregate_target

其他選項引數如下:

- sga_max_size :這個引數設定 memory_target SGA 的上限

- sga_target :這個引數設定 memory_target 中的下限

- pga_aggregate_target :這個引數僅是 instance 允許所有程式使用記憶體的總量。在 AMM 中,這個引數將隨著 memory_target 的空閒空間進行浮動。

SGA PGA 的總量不能超過 memory_target 。如果 sga_target 在引數檔案中設定,它將代表著 SGA 的下限。此時 pga_aggregate_target 將會獲得的記憶體 = memory_target - sga_target

4.  透過memory_target 控制記憶體

DBA 可以透過一些選項去決定如何對記憶體中的各個元件進行分配。可以透過 MEMORY_TARGET 來控制 PGA SGA 的增長。由於 memory_target 同時管理者 PGA SGA ,記憶體控制器可以自由的在兩者之間進行記憶體控制,沒有任何的限制。如果要限制 PGA 的增長,可以設定 sga_target 引數大小,這就限制了 SGA 的最小值。在這種情況下, PGA 就算增長,也不能讓 SGA 縮小到超過他的最小值。如果要限制 SGA 的增長,可以設定 sga_max_size 的大小,這是 SGA 的上限值。

如果想要設定SGA 中某個元件的最小值,也可以進行單獨設定。 SGA 中重要的元件如下:

- shared pool (透過 shared_pool_size 引數管理)

- buffer cache (透過 db_cache_size 引數管理)

- streams pool (透過 streams_pool_size 引數管理)

- java pool (透過 java_pool_size 引數管理)

- large pool (透過 large_pool_size 引數管理)

三、  實驗測試

情況一

只設定memory_target

- memory_target =1G

memory_max_target 不設定,所以它會被預設設定大小為 memory_target

執行以下SQL

SQL> show parameter memory;

NAME                           TYPE        VALUE

-------------------- -- -- ----------- ----------------------

hi_shared_memory_address   integer     0

memory_max_target            big integer 1G

memory_target                 big integer 1G

shared_memory_address       integer     0

 

SQL> select * from v$sgainfo where name like 'Maximum SGA%' or name like 'Free SGA%';

NAME                                  BYTES RES

-------------------------------- ---------- ---

Maximum SGA Size                 1068937216 No

Free SGA Memory Available         432013312

 

SQL> select component,current_size from v$memory_dynamic_components where component like '%Target%';

COMPONENT                                                CURRENT_SIZE

------------------------------------------------ ------------

SGA   Target                                                641728512

PGA Target                                                432013312

總結

1)  初始所有的記憶體(1G )會作為共享記憶體分配, v$sgainfo 顯示 SGA 最大值為 1G ,因為 sga_max_size 沒有設定,因此預設 sga 最大值為 memory_target

2)  v$sgainfo 顯示,有 412M 是空閒的記憶體,這些空閒的記憶體可以用在 PGA ,或者動態的設定 SGA

3)  記憶體的初始比是60% SGA,40% PGA 。在 sga_target pga_aggregate_target 沒有設定的情況下,這是預設的情況。這也就意味著,記憶體的 60% 612M )給 SGA ,記憶體的 40% 412M )給 PGA

4)  v$memory_dynamic_components 顯示sga_target 設定 612M pga_aggregate_target 設定 412M 。這裡的 pga_aggregate_target 設定為 412M 不意味著 PGA 已經達到了 412M 。而是說明有 412M 空間可以給 PGA 增長。如果它增長超過 412M ,那麼記憶體控制器將會從 SGA 中獲取記憶體。

情況二

設定以下引數

 - memory_target=1G

 - sga_target=300M

 - pga_aggregate_target=100M

memory_max_target 不設定,所以它預設值等於 memory_target

執行以下SQL

SQL> select * from v$sgainfo where name like 'Maximum SGA%' or name like 'Free SGA%';

NAME                                     BYTES         RES

-------------------------------- ---------- ---

Maximum SGA Size                      1068937216   No

Free SGA Memory Available         759169024

 

SQL> select component,current_size from v$memory_dynamic_components where component like '%Target%';

COMPONENT                                                   CURRENT_SIZE

------------------------------------------------- ------------

SGA Target                                                 314572800

PGA Target                                                 759169024

總結:

1)  初始所有記憶體(1G )會被作為共享記憶體分配。 v$sgainfo 顯示, SGA 最大值為 1G ,因為 SGA_MAX_SIZE 沒有設定,所以它預設大小等於 memory_target

2)  v$sgainfo 顯示 724M 為空閒記憶體,這個值是由 memory_target 減去 sga_target 得到的。這些空閒記憶體可以用於 PGA SGA ,並由 oracle 自動控制。

3)  v$memory_dynamic_components 檢視顯示SGA 設定為 300M, 但是 PGA 設定為 724M ,這個大小是 memory_target 分配後的剩餘部分。這裡的 PGA 的值為 724M ,並不意味著 PGA 已經佔有了 724M ,也是意味著 PGA 可以佔有最大值為 724M

4)  sga_target_size 預設值為 1G ,理論上這個就是 SGA 的最大值。

 

情況三

設定以下引數

 - memory_target=1G

 - sga_max_size=500m

 - sga_target=300m

 - pga_aggregate_target=100m

由於memory_max_target 沒有設定,所以它預設大小為 memory_target

SQL> select * from v$sgainfo where name like 'Maximum SGA%' or name like 'Free SGA%';

NAME                                  BYTES RES

-------------------------------- ---------- ---

Maximum SGA Size                  521936896 No

Free SGA Memory Available         209715200

 

SQL> select component,current_size from v$memory_dynamic_components where component like '%Target%';

COMPONENT                                       CURRENT_SIZE

---------------------------------------- ------------

SGA Target                                      314572800

PGA Target                                      759169024

總結:

1)  現在sga_target_size 設定為 500M v$sgainfo 顯示 SGA 最大值為 500M

2)  v$sgainfo 中顯示, SGA 可用值介於 sga_target sga_max_size 之間

3)  超過sga_max_size 500M )的記憶體不會給 SGA 使用,所以不會顯示在 v$sgainfo

4)  v$memory_dynamic_components 檢視中顯示SGA 設定為 300M PGA 設定為 700M 。這個 700M 的值,是 memory_target 減去 sga_target 得到的。

 



---- end ----


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31529886/viewspace-2715143/,如需轉載,請註明出處,否則將追究法律責任。

相關文章