查看: 10504|回复: 15

[精华] 关于shared pool的深入探讨(二)

[复制链接]
论坛徽章:
117
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主7段
日期:2012-05-15 15:24:11ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:32紫蛋头
日期:2013-03-04 17:00:07优秀写手
日期:2013-12-18 09:29:09
发表于 2004-8-22 21:50 | 显示全部楼层 |阅读模式
link:
http://www.eygle.com/internal/shared_pool-2.htm

我们继续把前面的问题展开一下.

其实我们可以从数据库内部监控shared pool的空间碎片情况.
这涉及到一个内部视图x$ksmsp

X$KSMSP的名称含义为: [K]ernal [S]torage [M]emory Management [S]GA Hea[P]
其中每一行都代表着shared pool中的一个chunk

首先记录一下测试环境:

[php]
SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.3.0 - Production
PL/SQL Release 9.2.0.3.0 - Production
CORE    9.2.0.3.0       Production
TNS for Linux: Version 9.2.0.3.0 - Production
NLSRTL Version 9.2.0.3.0 - Production'

[/php]

我们看一下x$ksmsp的结构:

[php]
SQL> desc x$ksmsp
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
ADDR                                               RAW(4)
INDX                                               NUMBER
INST_ID                                            NUMBER
KSMCHIDX                                           NUMBER
KSMCHDUR                                           NUMBER
KSMCHCOM                                           VARCHAR2(16)
KSMCHPTR                                           RAW(4)
KSMCHSIZ                                           NUMBER
KSMCHCLS                                           VARCHAR2(8)
KSMCHTYP                                           NUMBER
KSMCHPAR                                           RAW(4)
[/php]

我们关注以下几个字段:

KSMCHCOM是注释字段,每个内存块被分配以后,注释会添加在该字段中.
x$ksmsp.ksmchsiz代表块大小

x$ksmsp.ksmchcls列代表类型,主要有四类,说明如下:

free
Free chunks--不包含任何对象的chunk,可以不受限制的被分配.

recr
Recreatable chunks--包含可以被临时移出内存的对象,在需要的时候,这个对象可以
被重新创建.例如,许多存储共享sql代码的内存都是可以重建的.

freeabl
Freeable chunks--包含session周期或调用的对象,随后可以被释放.这部分内存有时候
可以全部或部分提前释放.但是注意,由于某些对象是中间过程产生的,这些对象不能
临时被移出内存(因为不可重建).

perm
Permanent memory chunks--包含永久对象.通常不能独立释放.

我们可以通过查询x$ksmsp视图来考察shared pool中存在的内存片的数量
不过注意:Oracle的某些版本(如:10.1.0.2)在某些平台上(如:HP-UX PA-RISC 64-bit)查
询该视图可能导致过度的CPU耗用,这是由于bug引起的.

我们看一下测试:

[php]
初始启动数据库,x$ksmsp中存在2259个chunk

SQL> select count(*) from x$ksmsp;

  COUNT(*)
----------
      2259


执行查询:

SQL> select count(*) from dba_objects;

  COUNT(*)
----------
     10491

此时shared pool中的chunk数量增加

SQL> select count(*) from x$ksmsp;

  COUNT(*)
----------
      2358
.
[/php]
这就是由于shared pool中进行sql解析,请求空间,进而导致请求free空间,分配、分割
从而产生了更多,更细碎的内存chunk

由此我们可以看出,如果数据库系统中存在大量的硬解析,不停请求分配free的shred pool内存
除了必须的shared pool latch等竞争外,还不可避免的会导致shared pool中产生更多的内存碎片
(当然,在内存回收时,你可能看到chunk数量减少的情况)

我们看以下测试:

[php]
首先重新启动数据库:

SQL> startup force;
ORACLE instance started.

Total System Global Area   47256168 bytes
Fixed Size                   451176 bytes
Variable Size              29360128 bytes
Database Buffers           16777216 bytes
Redo Buffers                 667648 bytes
Database mounted.
Database opened.

创建一张临时表用以保存之前x$ksmsp的状态:

SQL> CREATE GLOBAL TEMPORARY TABLE e$ksmsp ON COMMIT PRESERVE ROWS AS
  2  SELECT      a.ksmchcom,
  3           SUM (a.CHUNK) CHUNK,
  4           SUM (a.recr) recr,
  5           SUM (a.freeabl) freeabl,
  6           SUM (a.SUM) SUM
  7      FROM (SELECT   ksmchcom, COUNT (ksmchcom) CHUNK,
  8                     DECODE (ksmchcls, 'recr', SUM (ksmchsiz), NULL) recr,
  9                     DECODE (ksmchcls, 'freeabl', SUM (ksmchsiz), NULL) freeabl,
10                     SUM (ksmchsiz) SUM
11                FROM x$ksmsp GROUP BY ksmchcom, ksmchcls) a
12  where 1 = 0
13  GROUP BY a.ksmchcom;

Table created.

保存当前shared pool状态:

SQL> INSERT INTO E$KSMSP
  2  SELECT      a.ksmchcom,
  3           SUM (a.CHUNK) CHUNK,
  4           SUM (a.recr) recr,
  5           SUM (a.freeabl) freeabl,
  6           SUM (a.SUM) SUM
  7      FROM (SELECT   ksmchcom, COUNT (ksmchcom) CHUNK,
  8                     DECODE (ksmchcls, 'recr', SUM (ksmchsiz), NULL) recr,
  9                     DECODE (ksmchcls, 'freeabl', SUM (ksmchsiz), NULL) freeabl,
10                     SUM (ksmchsiz) SUM
11                FROM x$ksmsp
12            GROUP BY ksmchcom, ksmchcls) a
13  GROUP BY a.ksmchcom
14  /

41 rows created.

执行查询:

SQL> select count(*) from dba_objects;

  COUNT(*)
----------
     10492
     
比较前后shared pool内存分配的变化:

SQL> select a.ksmchcom,a.chunk,a.sum,b.chunk,b.sum,(a.chunk - b.chunk) c_diff,(a.sum -b.sum) s_diff
  2  from
  3  (SELECT   a.ksmchcom,
  4           SUM (a.CHUNK) CHUNK,
  5           SUM (a.recr) recr,
  6           SUM (a.freeabl) freeabl,
  7           SUM (a.SUM) SUM
  8      FROM (SELECT   ksmchcom, COUNT (ksmchcom) CHUNK,
  9                     DECODE (ksmchcls, 'recr', SUM (ksmchsiz), NULL) recr,
10                     DECODE (ksmchcls, 'freeabl', SUM (ksmchsiz), NULL) freeabl,
11                     SUM (ksmchsiz) SUM
12                FROM x$ksmsp
13            GROUP BY ksmchcom, ksmchcls) a
14  GROUP BY a.ksmchcom) a,e$ksmsp b
15  where a.ksmchcom = b.ksmchcom and (a.chunk - b.chunk) <>0
16  /

KSMCHCOM              CHUNK        SUM      CHUNK        SUM     C_DIFF     S_DIFF
---------------- ---------- ---------- ---------- ---------- ---------- ----------
KGL handles             313     102080        302      98416         11       3664
KGLS heap               274     365752        270     360424          4       5328
KQR PO                  389     198548        377     192580         12       5968
free memory              93    2292076         90    2381304          3     -89228
library cache          1005     398284        965     381416         40      16868
sql area                287     547452        269     490052         18      57400

6 rows selected.


[/php]
我们简单分析一下以上结果:
首先free memory的大小减少了89228,这说明sql解析存储占用了一定的内存空间
而chunk从90增加为93,这说明内存碎片增加了.

在下面的部分中,我会着手介绍一下KGL handles,   KGLS heap这两个非常重要的shared pool中的内存结构.
论坛徽章:
30
ITPUB元老
日期:2005-10-06 13:25:212011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:082012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:522012新春纪念徽章
日期:2012-02-13 15:11:52马上有车
日期:2014-02-19 11:55:14
发表于 2004-8-22 22:05 | 显示全部楼层
恩,eygle老师又开始写东西了
支持一下

又有文章可以看了

使用道具 举报

回复
论坛徽章:
86
ITPUB元老
日期:2005-02-28 12:57:002012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20咸鸭蛋
日期:2012-05-08 10:27:19版主8段
日期:2012-05-15 15:24:112013年新春福章
日期:2013-02-25 14:51:24
发表于 2004-8-23 00:03 | 显示全部楼层
好,偶一直都想把这块仔细整理整理,就是没有这个决心,这下有现成的了  

使用道具 举报

回复
论坛徽章:
62
马上加薪
日期:2014-02-19 11:55:142011新春纪念徽章
日期:2011-02-18 11:43:332010广州亚运会纪念徽章:田径
日期:2011-02-17 18:03:352011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:41:012010广州亚运会纪念徽章:三项全能
日期:2010-11-15 13:36:51ITPUB9周年纪念徽章
日期:2010-10-08 09:34:02
发表于 2004-8-23 00:23 | 显示全部楼层
handle 表示该存在library cache中的对象的描述,相当于buffer head,记录了该对象的各种状态

使用道具 举报

回复
论坛徽章:
42
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:022011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:08ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:232012新春纪念徽章
日期:2012-02-13 15:09:23
发表于 2004-8-23 08:41 | 显示全部楼层
Cool!

使用道具 举报

回复
认证徽章
论坛徽章:
168
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:10:582012新春纪念徽章
日期:2012-01-04 11:49:54蜘蛛蛋
日期:2011-12-05 16:08:56ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41设计板块每日发贴之星
日期:2011-07-22 01:01:02ITPUB官方微博粉丝徽章
日期:2011-06-30 12:30:16管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:33
发表于 2004-8-25 23:06 | 显示全部楼层

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2005-10-30 17:05:33会员2006贡献徽章
日期:2006-04-17 13:46:34ITPUB元老
日期:2006-09-11 15:36:37
发表于 2004-12-29 14:51 | 显示全部楼层
灌水一下以下是我對比几種類型的被分配的內存塊.

[php]
'freeabl'                                    'recr'
KGFF heap                                    ..
KGK contexts                                 
KGK heap                                     ..
KQLS heap                                    .. \ KGL handles
LISTEN ADDRESS                                
PL/SQL DIANA                                 ..
PL/SQL MPCODE                                ..
PL/SQL SOURCE                                ..
PLS cca hp desc                              PLS non-lib hp
PX msg pool                                  ..
PX subheap                                   ..
REGISTRAR TABLE                              errors
SERVICE NAME EN                              fixed allocatio
SERVICE NAMES T
character set m
devs
dictionary cach                              row cache lru
dups
errors
joxs heap
ksfqpa
ksfqpar
ksfqpn
kzull
library cache                                ..
listener addres
multiblock rea
nods
partitioning d                               ..
session param v                              
sql area                                     ..
table definiti                               ..  table columns \ temporary tabl
trigger defini                               ..  trigger inform\ trigger source
                                             
'free';                                      'perm';
free memory                                  permanent memor  


[/php]

使用道具 举报

回复
论坛徽章:
0
发表于 2005-1-4 13:58 | 显示全部楼层
engle老師真厲害!!

使用道具 举报

回复
论坛徽章:
0
发表于 2005-1-4 14:12 | 显示全部楼层
好好學習.

使用道具 举报

回复
论坛徽章:
62
马上加薪
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-01-04 11:49:54ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28现任管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-02-18 11:42:472011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:41:01
发表于 2005-1-5 21:55 | 显示全部楼层
eygle老大真酷.

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表