共享内存 share pool :BUCKET /FREE LISTS /RESERVED FREE LISTS /UNPINNED RECREATABLE CHUNKS (lru first)

相关概念

  • BUCKET :每个bucket上挂有一个 chunk list。同一个BUCKET中的chunk在物理地址上是不一定相邻的
  • FREE LISTS:按bucket划分,共有255个,bucket 0---bucket 254
  • RESERVED FREE LISTS:在SQL语句所需CHUNK大于4400bytes时,会在RESERVED FREE LISTS中查找空闲CHUNK。如果SQL语句所需CHUNK不大于4400bytes时,只会在free list 中查找CHUNK。

Shared pool中chunk的分配过程

  1. 当需要从shared pool中寻找chunk的时候,首先会定位一个bucket,然后遍历bucket,寻找最合适的chunk.如果chunk的空间比需要的空间大,那么这个chunk就拆分成两个,一个被分配、一个成为free,重新挂接到相应大小的bucket上。
  2. 在寻找chunk的过程中,如果一个bucket中没有合适的chunk,接着寻找另外一个非空的bucket,如果所有的bucket中都没有合适的chunk,那么就从rec类型的链表中释放一部分的空间,为free,或将free做适当合并。注意:只有rec类型的chunk能够被释放空间,即使释放了空间,这些空间可能都不是连续的,都是一些很小的chunk,这样可能形成这样一种情况,shared pool中有空间但是是大量的非常小的chunk,这样在寻找chunk的时候,也很难寻找到合适的chunk--共享池碎片

接着上一篇,继续解析dump文件

******************************************************
FREE LISTS:
 Bucket 0 size=16
 Bucket 1 size=20
 Bucket 2 size=24
 Bucket 3 size=28
  Chunk 363fffe4 sz=       28    free      "               "
 Bucket 4 size=32
 .......
 Bucket 98 size=408
 Bucket 99 size=412
  Chunk 36bffe64 sz=      412    free      "               "
  Chunk 387ffe64 sz=      412    free      "               "
 .......
 Bucket 100 size=416
 Bucket 251 size=12324
 Bucket 252 size=16396
 Bucket 253 size=32780
 Bucket 254 size=65548
Total free space   =     5432

  Bucket 不存在地址标识( EXTENT有地址标识 ),说明Bucket只是一个逻辑概念。
  Bucket 3,它的chunk最小值是上一个Bucket中chunk的最大值,即28,最大值为28

    每个Bucket容纳的size范围:
    Bucket 0~199 容纳size以 4 递增
    Bucket 200~249 容纳size以 64 递增

    从Bucket 249开始,Oracle各Bucket步长进一步增加:

    Bucket 249: 4012 ~4107 = 96
    Bucket 250: 4108 ~8203 = 4096
    Bucket 251: 8204 ~16395 = 8192
    Bucket 252: 16396~32779 = 16384
    Bucket 253: 32780~65547 = 32768
    Bucket 254: >=65548
******************************************************

RESERVED FREE LISTS:
 Reserved bucket 0 size=16
  Chunk 37bffbe0 sz=     1032  R-free      "               "
 Reserved bucket 1 size=4400
 Reserved bucket 2 size=8204
  Chunk 36ffdf78 sz=     8304  R-free      "               "
 Reserved bucket 3 size=8460
 Reserved bucket 4 size=8464
 ......
 Reserved bucket 14 size=1990630
Total reserved free space   =  3204600

    Shared pool的普通区的空闲列表下面就是关于这块shared pool区中保留区的空闲列表的描述,其中除了在名字上bucket前面都有一个Reserved标识,和状态前面有“R-”前缀外,含义和普通空闲列表相同。
******************************************************

  空闲列表后面就是LRU链表了。LRU链上挂的都是recreate、freeabl状态的chunk.一个SQL语句可能需要多个CHUNK,在LRU链上找到recreate状态的chunk,然后在recreate状态的chunk下再下挂freeabl状态的CHUNK,这样避免全部CHUNK在LRU链上导致LRU链太长

UNPINNED RECREATABLE CHUNKS (lru first):
  Chunk 246c9848 sz=      348    recreate  "KGLHD          "  latch=(nil)
  Chunk 237cb10c sz=     4096    recreate  "KGLH0^b9197c6e "  latch=(nil)
  Chunk 24bb5df0 sz=      364    recreate  "KGLHD          "  latch=(nil)
  Chunk 241aa1b8 sz=     4096    recreate  "KGLH0^59449e50 "  latch=(nil)
  Chunk 252640a0 sz=      364    recreate  "KGLHD          "  latch=(nil)
  Chunk 23a619a0 sz=     4096    recreate  "KGLH0^d5f1e0d7 "  latch=(nil)
  Chunk 23465600 sz=      348    recreate  "KGLHD          "  latch=(nil)
  Chunk 2346575c sz=     1036    recreate  "KGLHD          "  latch=(nil)
  Chunk 23465b68 sz=     4096    recreate  "KGLH0^c6e0d102 "  latch=(nil)  ---  一个recreate状态CHUNK下的多个freeable状态CHUNK
     ds 24bdecb0 sz=     4096 ct=        1
  Chunk 23466b68 sz=     4096    freeable  "SQLA^1536bb77  "  ds=0x23db5bd8
  Chunk 23467b68 sz=      144    freeable  "KGLDA          "
  Chunk 23467bf8 sz=     4096    freeable  "KGLH0^ba3f9b05 "  ds=0x2425e238

    LRU链表不是按照大小分的,因而没有Bucket。它的chunk是按照最近最少使用的顺序排列。其中chunk的信息和前面解释的一样。但是要注意一点,因为LRU链表中的chunk都是使用的,因为每个chunk根据用途不同,都会有一个latch来保护,Chunk信息最后便是latch的地址。注意,我们前面提到,shared pool中是有两种LRU链表的,一种循环LRU链表;另外一种是暂时LRU链表。在这里LRU信息中前面部分是循环LRU链表,SEPARATOR后面部分是暂时LRU链表信息。

    最后是LRU链表中chunk的总的大小,rcr是循环LRU链表中的chunk数,trn是暂时LRU链表中的chunk数

******************************************************

参考blog:

http://blog.csdn.net/haibusuanyun/article/details/17804395

http://www.hellodba.com/reader.php?ID=111&lang=CN

时间: 2024-10-14 03:57:56

共享内存 share pool :BUCKET /FREE LISTS /RESERVED FREE LISTS /UNPINNED RECREATABLE CHUNKS (lru first)的相关文章

共享内存 share pool :heap /extent /chunk/

相关概念 CHUNK: Shared pool物理层面上由许多内存块组成,这些内在块称为chunk.但是chunk是大小不一的,在内存中一个chunk是连续的. EXTENT:由多个连续的chunk组成 HEAP: 堆由一个或多个大小不一的extent组成 将shool pool内存dump出来 将shool pool内存dump出来: [[email protected] ~]$ sqlplus /nolog SQL> conn /as sysdba SQL> alter session s

Oracle Share Pool内部管理机制

SHARE POOL利用堆(HEAP)的内存管理方式管理,在物理上由多个内存区(EXTENT)组成,内存区又由多个不同大小的CHUNK组成.而CHUNK又有可重用和空闲之分,并且它们分别有LRU LIST.FREE LIST.RESERVED LIST串联起来. 堆管理 Shared Pool是利用堆内存管理方式管理的(KGH:Kernel Generic Heap).从Oracle 9i开始,可以有多个最高级堆(TOP-LEVLE HEAP),最高级堆可以分成多个副堆,副堆下面还拥有子堆.堆和

调优3(share pool 调整)

第三章 share pool 调整 1.sga 组成部分 1)database buffer2)redolog buffer3)share pool :共享池,存放最近最常使用的sql和plsql语句及解析计划和数据字典信息---library cache: 存放最近最常使用的sql及plsql 语句和执行计划.解析代码(采用LRU算法)---Dictionary cache:存放最近最常使用的数据字典信息(表.字段.权限等)---uga :用户全局区(如果server process 是专有模

Linux进程间通信--共享内存

一.共享内存定义 (百度百科)共享内存指在多处理器的计算机系统中,可以被不同中央处理器访问的大量内存.由于多个CPU需要快速访问存储器,这样就要对存储器进程缓存.任何一个缓存的数据被更新后,由于其他处理器也可能要存取,共享内存就需要立即更新,否则,不同的处理器可能用到不同的数据. 在Linux系统中,共享内存允许一个进程或多个进程共享一个给定的存储区(共享内存).不同进程之间共享的内存通常安排为同一段物理地址.进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址

一张图深度解析Linux共享内存的内核实现

一张图深度解析Linux共享内存的内核实现 Sailor_forever  sailing_9806#163.com http://blog.csdn.net/sailor_8318/article/details/39484747 (本原创文章发表于Sailor_forever 的个人blog,未经本人许可,不得用于商业用途.任何个人.媒体.其他网站不得私自抄袭:网络媒体转载请注明出处,增加原文链接,否则属于侵权行为.如有任何问题,请留言或者发邮件给sailing_9806#163.com)

共享内存通讯

1.核心理论 共享内存是IPC机制中的一种,它允许两个不相关的进程访问同一段内存,这是传递数据的一种非常有效的方式. 2.函数学习 创建/获取共享内存 函数名:shmget 函数原型:int shmget(key_t key,size_t size,int shmflg) 函数功能:创建或者获取共享内存,并返回其描述符 头文件:<sys/ipc.h> <sys/shm.h> 返回值:成功:返回创建或获取到的共享内存的描述符 失败:-1 参数说明:key:共享内存的键值 size:共

在向server发送请求时发生传输级错误。 (provider: 共享内存提供程序, error: 0 - 管道的还有一端上无不论什么进程。

作者:卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/36425825 SQL Server 2008 + VS2010 用C#编写的代码,进行数据库还原的时候,出错: 错误内容: 在向server发送请求时发生传输级错误. (provider: 共享内存提供程序, error: 0 - 管道的还有一端上无不论什么进程. 解决方法: 将SQL链接语句构造成例如以下: string strLink = @"server=.;datab

Linux IPC实践(10) --Posix共享内存

1. 创建/获取一个共享内存 #include <sys/mman.h> #include <sys/stat.h> /* For mode constants */ #include <fcntl.h> /* For O_* constants */ int shm_open(const char *name, int oflag, mode_t mode); 参数: name:  共享内存名字; oflag: 与open函数类型, 可以是O_RDONLY, O_WR

管道,消息队列,共享内存!

2015.1.26星期一,阴天 linux中使用的较多的进程通信方式主要有一下几种:1.管道(Pipe):管道可用于具有亲缘关系进程间的通信,有名管道,除了具有管道所具有功能外,它 还允许无亲缘关系进程的通信2.信号(signal):信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程 有某事发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一样的3.消息队列:(Messge Queue):消息队列是消息的连接表,包括Posix消息队列SystemV消息队列