shared_pool知识点整理

sub_pool的数量是Oracle根据shared_pool大小初始化出来的,也可以通过 _kghdsidx_count控制   

子缓冲池分配的算法很简单:

l 每个子缓冲池必须满足一定的内存约束条件;

l 每 4 颗 CPU 可以分配一个子缓冲池, 子缓冲池的数量最多 7 个。

Oracle 9i 中,每个 SubPool 容量至少 128MB, 而在 Oracle 10g 中,每个子缓冲池容量至少为 256MB。从 Oracle 11g 开始,每个 SubPool 至少为 512MB。

在 Oracle 10g 中, Oracle 仍然对共享池的管理做出了进一步改进,那就是对单个子缓冲池进行进一步的细分。现在默认 Oracle 10g 会将单个缓冲池分割为 4 个子分区进行管理(这可能是因为通常 4颗 CPU 才分配一个 SubPool)

pSub Pool:

启动时根据CPU个数和内存大小,会自动分为N个Sub Pool( N<=7)

目的是为了减少每个Latch管理的内存个数,减少搜索的争用

可用参数"_kghdsidx_count"控制

初始Free memory不属于任何子池、Sub Pool间内存不可共享 

pDurations:(也就是subpool中那四个内存组件)

随着自动SGA调整开启:​duration是否需要开启要根据实际情况来判断,开启后无法缩小,但可以避免单个duration满引起的4031

  11g及之前分为4个区域,存放不同保留期限的内存组件:instance, session, cursor, execution

  12c及打了补丁的变成两个区域instance+session+cursor, execution

目的用于自动SGA调整,原则上自从execution的durations里面减少内存(KGH: NO ACCESS)

可用参数"_enable_shared_pool_durations"控制

Duration之间内存不可共享

pReserved:

用于大内存块申请,避免碎片

_shared_pool_reserved_pct 、shared_pool_reserved_size、shared_pool_reserve_min_alloc 

为什么会在一个 subpool中还有4个 sub partition 如:

sga heap(1,0) sga heap(1,1) sga heap(1,2) sga heap(1,3)

这不是因为 cpu的数目 也不是因为_kghdsidx_count, 而是因为 在10g 中AUTO SGA 引入了 shared pool duration的概念,

duration 分成4类:

Session duration

Instance duration (never freed)

Execution duration (freed fastest)

Free memory

引入了 shared pool duration的目的是

在10gR1中Shared Pool的shrink收缩操作存在一些缺陷,造成缺陷的原因是在该版本中Buffer Cache还没有能力共享使用一个granule,这是因为Buffer Cache的granule的尾部由granule header和Metadata(可能是buffer header或者RAC中的Lock Elements)拼接组成,在其尾部不容许存在空洞。另一个原因是当时的shared pool允许不同生命周期duration(以后会介绍)的chunk存放在同一个granule中,这造成共享池无法完全释放granule。到10gR2中通过对Buffer Cache Granule结构的修改允许在granule header和buffer及Metadata(buffer header或LE)存在缝隙,同时shared pool中不同duration的chunk将不在共享同一个granule,通过以上改进buffer cache与shared pool间的内存交换变得可行。此外在10gr2中streams pool也开始支持内存交换(实际根据不同的streams pool duration存在限制)

转载请注明来处

 

流年笑掷 未来可期
原文地址:https://www.cnblogs.com/nadian-li/p/14667134.html