• 共享内存 share pool (2):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

  • 相关阅读:
    jquery的$().each,$.each的区别
    前端面试题整理
    JS中Null与Undefined的区别
    LESS介绍及其与Sass的差异(转载自伯乐在线,原文链接:http://blog.jobbole.com/24671/)
    APP 弱网测试
    ADB命令
    pytest之参数化parametrize的使用
    APP测试
    python 异常捕捉
    pip 安装依赖 requirements.txt
  • 原文地址:https://www.cnblogs.com/polestar/p/4356298.html
Copyright © 2020-2023  润新知