[English]
作者:
fuyuncat
来源:
www.HelloDBA.com
4. Dump内存解析
下面以shared pool为例,解释一下dump出来的内存结构。
SQL> conn sys/sys as sysdba
Connected.
SQL> oradebug setmypid
Statement processed.
SQL> oradebug dump heapdump 2
Statement processed.
SQL>
以下时trace文件的内容,我们分别解释各个部分:
Dump file c:\oracle\product\10.2.0\admin\fuyuncat\udump\fuyuncat_ora_4032.trc
Tue Jul 11 16:03:26 2006
ORACLE V10.2.0.1.0 - Production vsnsta=0
vsnsql=14 vsnxtr=3
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
Windows XP Version V5.1 Service Pack 2
CPU : 2 - type 586
Process Affinity : 0x00000000
Memory (Avail/Total): Ph:885M/2039M, Ph+PgF:2702M/3890M, VA:1590M/2047M
Instance name: fuyuncat
Redo thread mounted by this instance: 1
Oracle process number: 18
Windows thread id: 4032, image: ORACLE.EXE (SHAD)
*** SERVICE NAME:(SYS$USERS) 2006-07-11 16:03:26.322
*** SESSION ID:(159.7) 2006-07-11 16:03:26.322
这部分是关于trace文件的基本信息,oracle版本、资源情况、用户和会话等。
KGH Latch Directory Information
ldir state: 2 next slot: 75
Slot [ 1] Latch: 03C3D280 Index: 1 Flags: 3 State: 2 next: 00000000
Slot [ 2] Latch: 1EC9D4B0 Index: 1 Flags: 3 State: 2 next: 00000000
Slot [ 3] Latch: 1EC9D540 Index: 1 Flags: 3 State: 2 next: 00000000
Slot [ 4] Latch: 03C3E100 Index: 1 Flags: 3 State: 2 next: 00000001
Slot [ 5] Latch: 1ED65CE4 Index: 1 Flags: 3 State: 2 next: 00000000
Slot [ 6] Latch: 1ED65F14 Index: 1 Flags: 3 State: 2 next: 00000000
... ...
这部分记录的是shared pool中的latch信息。每个latch的具体信息可以通过视图V$LATCH、V$LATCH_PARENT、V$LATCH_CHILDREN或者表x$ksllt查出
******************************************************
HEAP DUMP heap name="sga heap" desc=03C38510
extent sz=0x32c8 alt=108 het=32767 rec=9 flg=-126 opc=0
parent=00000000 owner=00000000 nex=00000000 xsz=0x10
******************************************************
这是堆dump信息的头部,heap name说明了内存所述的堆,shared pool是属于SGA区的,因此,这里是"sga heap";
extent sz记录的是所有扩展段的大小。
HEAP DUMP heap name="sga heap(1,0)" desc=04EC131C
extent sz=0xfc4 alt=108 het=32767 rec=9 flg=-126 opc=0
parent=00000000 owner=00000000 nex=00000000 xsz=0x400000
EXTENT 0 addr=1CC00000
Chunk 1cc00038 sz= 24 R-freeable "reserved stoppe"
Chunk 1cc00050 sz= 212888 R-free " "
Chunk 1cc33fe8 sz= 24 R-freeable "reserved stoppe"
Chunk 1cc34000 sz= 3977544 perm "perm " alo=3977544
Chunk 1cfff148 sz= 3768 free " "
EXTENT 1 addr=1D000000
Chunk 1d000038 sz= 24 R-freeable "reserved stoppe"
Chunk 1d000050 sz= 212888 R-free " "
Chunk 1d033fe8 sz= 24 R-freeable "reserved stoppe"
Chunk 1d034000 sz= 2097168 perm "perm " alo=2097168
这部分信息是trace文件中的主要部分,它详细记录了shared pool中各个chunk的信息。
首先看它的头部信息,注意到这里heap name是"sga heap(1,0)"。这是什么意思呢?我们前面提到,oracle 10g会将shared pool分为几个区来管理,这里就是其中的一个区。共有4个区。通过表X$KGHLU可以看到对应的LRU链表。
EXTENT 0 addr=1CC00000
这一行说明下面的chunk都属于这个扩展段(extent),0是它的编号,addr是它的起始地址。
Chunk 1cc00038 sz= 24 R-freeable "reserved stoppe"
这是一个chunk的信息,sz是这个chunk的大小(24字节)。R-freeable是这个chunk的状态,"reserved stoppe"是这个chunk的用途。Chunk有4种可能状态,以下是这四种状态的含义:
free:即空闲chunk,可以随时分配给适合大小的请求;
freeable:这种状态的chunk表示它当前正在被使用,但是这种使用是短期的,比如在一次调用中或者一个会话中,会话或者调用解释就可以被释放出来。这种状态的chunk是不放在LRU链表中的,一旦使用结束,自动成为free状态,放到空闲列表中;
recreatable:这种状态的chunk正在被使用,但是它所包含的对象是可以被暂时移走、重建,比如解析过的语句。它是被LRU链表管理的。
permanent:顾名思义,这种状态的chunk所包含的对象是永远不会被释放的。即使flush shared pool也不会释放。
我们注意到,这里还有一些状态是有前缀“R-”的。带有这种前缀的chunk说明是shared pool中的保留区的chunk。
Total heap size = 41942480
最后是这一shared pool区的总的大小。
FREE LISTS:
Bucket 0 size=16
Bucket 1 size=20
Chunk 166ed050 sz= 20 free " "
Chunk 167de068 sz= 20 free " "
Chunk 164b9c10 sz= 20 free " "
Chunk 1f2776f8 sz= 20 free " "
接下来便是这个shared pool区的空闲列表。Bucket是一个空闲列表的范围,例如Bucket 1,它的最小值是上一个Bucket的最大值,即16,最大值为20。Bucket下面是空闲列表中chunk,后面的信息和前面解释chunk的信息一样,8位的16进制数字是它的地址;sz是chunk的大小;free是chunk的状态,因为是空闲列表中的chunk,这里只有一个状态;最后是chunk的用途,因为都是free,所以肯定为空。
Total free space = 1787936
最后是这块shared pool区中空闲chunk的总的大小。
RESERVED FREE LISTS:
Reserved bucket 0 size=16
Reserved bucket 1 size=4400
Reserved bucket 2 size=8204
Reserved bucket 3 size=8460
Reserved bucket 4 size=8464
Reserved bucket 5 size=8468
Reserved bucket 6 size=8472
Reserved bucket 7 size=9296
Reserved bucket 8 size=9300
Reserved bucket 9 size=12320
Reserved bucket 10 size=12324
Reserved bucket 11 size=16396
Reserved bucket 12 size=32780
Reserved bucket 13 size=65548
Chunk 1b800050 sz= 212888 R-free " "
Chunk 16c00050 sz= 212888 R-free " "
Chunk 1ac00050 sz= 212888 R-free " "
Total reserved free space = 638664
Shared pool的普通区的空闲列表下面就是关于这块shared pool区中保留区的空闲列表的描述,其中除了在名字上bucket前面都有一个Reserved标识,和状态前面有“R-”前缀外,含义和普通空闲列表相同。
UNPINNED RECREATABLE CHUNKS (lru first):
Chunk 1aee99c0 sz= 4096 recreate "sql area " latch=1D8BDD48
Chunk 1ae4aeec sz= 4096 recreate "sql area " latch=1D8BDDB0
... ...
SEPARATOR
Chunk 166e8384 sz= 540 recreate "KQR PO " latch=1DD7F138
Chunk 1f333a5c sz= 284 recreate "KQR PO " latch=1DC7DFC8
Chunk 166e9340 sz= 540 recreate "KQR PO " latch=1DE00A70
Chunk 1f0fe058 sz= 284 recreate "KQR PO " latch=1DC7DFC8
Chunk 1f2116b4 sz= 540 recreate "KQR PO " latch=1DE81910
Chunk 1f21127c sz= 540 recreate "KQR PO " latch=1DE81910
... ...
Unpinned space = 1611488 rcr=645 trn=864
空闲列表后面就是LRU链表了。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数。
此外,有一点提示,如果是有多个shared pool区,第一个区是不含LRU链表信息的。
PERMANENT CHUNKS:
Chunk 1d234010 sz= 1884144 perm "perm " alo=1728440
Chunk 1cc34000 sz= 3977544 perm "perm " alo=3977544
Chunk 1d034000 sz= 2097168 perm "perm " alo=2097168
Chunk 1d434000 sz= 3117112 perm "perm " alo=3117112
... ...
Chunk 1f434000 sz= 3917704 perm "perm " alo=3917704
Permanent space = 38937696
最后是永久chunk的信息。Chunk部分解释和前面一致。alo表示已经分配的大小。
如果有多个shared pool区,永久chunk信息则只存在于第一个shared pool区。
上一篇:什么时候使用绑定变量性能反而更差 | 下一篇:Oracle内存全面分析(11) |
本类中的所有文章 |