Oracle SGA internals 猜

分析对象Oracle 10.2.0.4 64bit for linux。先声明一下,分析过程和结论都是个人理解,不一定是正确的。


如果有疑问和建议,欢迎一起讨论学习。


SGA 包含fixed sgabuffer pool(db cache)shared poollarge pooljava poolstreams pool  redo buffers


SGA 中的pool 由多个granule 组成。每个granule 的大小和SGA_MAX_SIZE 的值相关。在Oracle 10.2上,若SGA_MAX_SIZE<=1024MB ,则granule 的值为4MB ;若SGA_MAX_SIZE>1024MB ,则granule 的值为16MB


(miki西游 @mikixiyou 原文链接: http://mikixiyou.iteye.com/blog/1660044 )


SGA 中的fixed sgaredo buffers 区域是独立分配的,其实它们也存在于某个granule 中。

查询v$sga 视图,显示sga 中的各个部分大小。

SQL> select name,value,to_char(value,'xxxxxxxxxxxxxx') value_hex from v$sga;

 

NAME                       VALUE VALUE_HEX

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

Fixed Size               1220432           129f50

Variable Size          335544496         140000b0

Database Buffers      1795162112         6b000000

Redo Buffers            15556608           ed6000















 

 

再查询v$sgainfo 中,显示更具体的pool 的大小和granule 的值。

SQL> select name,bytes/1024/1024/16 as "bytes(16M)" FROM v$sgainfo;

 

NAME                              bytes(16M)

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

Fixed SGA Size                    .072743416

Redo Buffers                      .927246094

Buffer Cache Size                        107

Shared Pool Size                          16

Large Pool Size                            1

Java Pool Size                             2

Streams Pool Size                          1

Granule Size                               1

Maximum SGA Size                         128

Startup overhead in Shared Pool            5

Free SGA Memory Available                  0















 

 

第一个"granule"  包含Fixed SGA  Granule directoryHeap headers

最后一个  "granule"  包含Guard pagesRedo bufferOperating system specific overheadRemaining space unused

(这是juliandyke.com 上的结论,摘录于此,未证实。)

X$KSMGE 中可以查到sgagranule 的组成,但结果数比sga_max_size 要少一个granule

也可以通过“ALTER SESSION SET EVENTS ‘immediate trace name granulelist level <level>’  ”将granule 的结果dump 出来。

fixed sga area 位于第一个granule 中,它包含的内容如下:

  • Containing all fixed variables
  • Contains pointers to all other structures in SGA
  • Variable name, type, address and size determined when Oracle executable is linked
  • Located at start of first granule of SGA

SGA 分成若干个heap ,根据隐含参数”_kghdsidx_count “来判断heap 的个数。

 

heap heap header 和若干extent 组成。

heap extent extent header 和若干chunk 组成。

chunk chunk headerchunk body 一一对应。chunk 的类型分为permanentrecreatablefreeablefree 等等。

每个extent 占用一个granule 。但是,dump 出来的结果显示extent 大小不固定,不一定是一个granul

每一个heapheap header ,包含used chunkslistfree chunkslist

free chunks list 是一个hash table ,由255bucket 组成。每一个bucket 中存一个double linked list ,指向free chunk

 

隐含参数'_kghdsidx_count' 的值为2SGA_TARGET 也配置了值,所以SGA 中各部分内存是oracle 自动配置的。


SQL> r

   1* select name,value from gv_$parameter t where t.name like '_kghdsidx_count'

 

NAME                  VALUE

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

_kghdsidx_count       2

 

 

SQL> show parameter sga

 

NAME                                  TYPE         VALUE

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

lock_sga                              boolean      FALSE

pre_page_sga                          boolean      FALSE

sga_max_size                          big integer 2G

sga_target                            big integer 2G















 

使用dump heapdump 方法将sga 分一下。

ALTER SESSION SET EVENTS 'immediate trace name heapdump level 2';

SGA heap 有两个,但每个heap 又分成4 个部分。

HEAP DUMP heap name="sga heap"   desc=0x2000002c

HEAP DUMP heap name="sga heap(1,0)"   desc=0x2001a960

FIVE LARGEST SUB HEAPS for heap name="sga heap(1,0)"    desc=0x2001a960

HEAP DUMP heap name="sga heap(1,1)"   desc=0x2001b598

FIVE LARGEST SUB HEAPS for heap name="sga heap(1,1)"    desc=0x2001b598

HEAP DUMP heap name="sga heap(1,2)"   desc=0x2001c1d0

FIVE LARGEST SUB HEAPS for heap name="sga   heap(1,2)"    desc=0x2001c1d0

HEAP DUMP heap name="sga heap(1,3)"   desc=0x2001ce08

FIVE LARGEST SUB HEAPS for heap name="sga heap(1,3)"    desc=0x2001ce08

HEAP DUMP heap name="sga heap(2,0)"   desc=0x2001fa50

FIVE LARGEST SUB HEAPS for heap name="sga heap(2,0)"    desc=0x2001fa50

HEAP DUMP heap name="sga heap(2,1)"   desc=0x20020688

FIVE LARGEST SUB HEAPS for heap name="sga heap(2,1)"    desc=0x20020688

HEAP DUMP heap name="sga heap(2,2)"   desc=0x200212c0

FIVE LARGEST SUB HEAPS for heap name="sga heap(2,2)"    desc=0x200212c0

HEAP DUMP heap name="sga heap(2,3)"   desc=0x20021ef8

FIVE LARGEST SUB HEAPS for heap name="sga heap(2,3)"    desc=0x20021ef8















 

 

参数”_enable_shared_pool_durations” 控制是否启用10g 中特有的shared pool duration 特性,当我们设置sga_target0 时该参数为false

同时在10.2.0.5 前若cursor_space_for_time 设置为true 时该参数也为false ,不过在10.2.0.5 以后cursor_space_for_time 参数被废弃

总而言之,SGA 的内存物理结构是以granule 为组成单元,以heap 为分区的。SGA 中的buffer cacheshared poollarge pool 等都是按照  heap manager 来配置的。

猜你喜欢

转载自mikixiyou.iteye.com/blog/1660044
今日推荐