天天看點

"汽車中的前置箱"SGA是怎麼進行記憶體管理的?

學習學習再學習&&思考思考再思考

實踐實踐再實踐@@複盤複盤再複盤

"汽車中的前置箱"SGA是怎麼進行記憶體管理的?

每個oracle資料庫執行個體都有一個很大的記憶體結構,稱為系統全局區(System Global Area),這是一個大型的共享記憶體結構,每個oracle程序都會通路它。在Linux/Unix作業系統上,SGA是一個實體實體,使用作業系統指令能“看到它”。

01

它被實體地劃分為一個共享記憶體段,程序可以附加到這段獨立的記憶體上。你可以把SGA想象成小汽車的前置箱,在這個前置箱裡面會有發動機程序,軸轉動程序等。SGA也是可以脫離Oracle程序而存在的,正如即使發動機,轉軸不裝載到前置箱裡面,前置箱也可以獨立存在。但是,在生産環境中,如果真的隻有SGA而沒有任何Oralce程序,那說明資料庫以某種方式奔潰了,這種情況類似小汽車已經靜止不能動态運轉了。我們可以通過ipcs -m|grep ora檢視SGA:

"汽車中的前置箱"SGA是怎麼進行記憶體管理的?

在資料庫内部,無論在什麼作業系統平台(可以類比為馬路),可以通過動态性能視圖v$sgastat來檢視:

"汽車中的前置箱"SGA是怎麼進行記憶體管理的?
"汽車中的前置箱"SGA是怎麼進行記憶體管理的?

02

在一份oracle骨骼剖解,請查收中我們說過SGA包括share_pool,db_buffer,cache_buffer,java_pool,large_pool,stream_pool六大元件,前三個為核心元件,後三個為非核心元件。對SGA整體大小影響最大的參數是以下這些。

java_pool_size:控制java池的大小。

shared_pool_size:在某種程度上控制共享池的大小。

large_pool_size:控制大池的大小。

streams_pool_size:控制流池的大小。

db_*_cache_size:共有8個cache_size參數,控制各個可用的緩沖區緩存的大小。

log_bufer:在某種程度上控制重做日志緩沖區的大小。

sga_target:在oracle DB 10g及更高版本中用于自動SGA記憶體管理,可動态調整。

sga_max_size:用于控制SGA的大小。

memory_target:在oracle DB 11g及更高版本中用于自動記憶體管理。

memory_max_size:在oracle DB 11g及更高版本中對于采用自動記憶體管理的資料庫,使其PGA和SGA的記憶體總用量盡可能達到(并且不超出)memory_max_size的值。這些參數的設定和優化就涉及到了oracle的SGA的管理和優化。

03

需要注意的是,不論是使用手動記憶體管理還是自動記憶體管理,都會發現各個池的記憶體是基于一種被稱為顆粒granule的機關來配置設定的。一個顆粒大小為4MB,8MB,16MB的記憶體區。比如你想要一個5MB的java池,而你的顆粒大小為4MB,oracle實際上會為這個java池配置設定8MB。通過查詢V$SGA_DYNAMIC_COMPONENTS,可以檢視各個池中的顆粒大小。

SQL> show parameter sga_target;

NAME                                 TYPE        VALUE

sga_target                           big integer 1020M

SQL> select component, granule_size from v$sga_dynamic_components;

COMPONENT                                                        GRANULE_SIZE

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

shared pool                                                           4194304

large pool                                                              4194304

java pool                                                                4194304

streams pool                                                          4194304

DEFAULT buffer cache                                          4194304

KEEP buffer cache                                                 4194304

RECYCLE buffer cache                                          4194304

DEFAULT 2K buffer cache                                      4194304

DEFAULT 4K buffer cache                                      4194304

DEFAULT 8K buffer cache                                      4194304

DEFAULT 16K buffer cache                                    4194304

DEFAULT 32K buffer cache                                       4194304

ASM Buffer Cache                                                      4194304

13 rows selected.

sga大小決定了顆粒的大小。可以通過調整sga_tartet的大小來實驗一把:

SQL> alter system set sga_target=1035m scope=spfile;

System altered.

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup

ORACLE instance started.

Total System Global Area 1090519040 bytes

Fixed Size                  2083304 bytes

Variable Size             301991448 bytes

Database Buffers          771751936 bytes

Redo Buffers               14692352 bytes

Database mounted.

Database opened.

再次檢視sga_target大小:

SQL> show parameter sga_target

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

sga_target                           big integer 1040M

現在再來看看sga各元件顆粒度:

"汽車中的前置箱"SGA是怎麼進行記憶體管理的?

可以看到,SGA為1.01G時,會以16MB的顆粒為池配置設定空間,是以池大小都将是16MB的某個倍數。這充分證明了SGA的大小決定了顆粒的大小。

繼續閱讀