"汽車中的前置箱"SGA是怎麼進行內存管理的?

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

實踐實踐再實踐@@覆盤覆盤再覆盤數據庫

qrcode_for_gh_57fca887e14f_258.jpg



每一個oracle數據庫實例都有一個很大的內存結構,稱爲系統全局區(System Global Area),這是一個大型的共享內存結構,每一個oracle進程都會訪問它。在Linux/Unix操做系統上,SGA是一個物理實體,使用操做系統命令能「看到它」。緩存



01oracle

它被物理地劃分爲一個共享內存段,進程能夠附加到這段獨立的內存上。你能夠把SGA想象成小汽車的前置箱,在這個前置箱裏面會有發動機進程,軸轉動進程等。SGA也是能夠脫離Oracle進程而存在的,正如即便發動機,轉軸不裝載到前置箱裏面,前置箱也能夠獨立存在。可是,在生產環境中,若是真的只有SGA而沒有任何Oralce進程,那說明數據庫以某種方式奔潰了,這種狀況相似小汽車已經靜止不能動態運轉了。咱們能夠經過ipcs -m|grep ora查看SGA:QQ圖片20190711222848.pngapp

在數據庫內部,不管在什麼操做系統平臺(能夠類比爲馬路),能夠經過動態性能視圖v$sgastat來查看:ide

QQ圖片20190711222913.png

QQ圖片20190711222930.png



02性能

一份oracle骨骼剖解,請查收中咱們說過SGA包括share_pool,db_buffer,cache_buffer,java_pool,large_pool,stream_pool六大組件,前三個爲核心組件,後三個爲非核心組件。對SGA總體大小影響最大的參數是如下這些。學習

java_pool_size:控制java池的大小。優化

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

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

COMPONENT                                                        GRANULE_SIZE
---------------------------------------------------------------- ------------
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

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_target                           big integer 1040M

如今再來看看sga各組件顆粒度:

QQ圖片20190711222951.png


能夠看到,SGA爲1.01G時,會以16MB的顆粒爲池分配空間,因此池大小都將是16MB的某個倍數。這充分證實了SGA的大小決定了顆粒的大小。

相關文章
相關標籤/搜索