eygle.com   eygle.com
eygle.com  
 

« ITPUB年会印象-相会朋友们 | Blog首页 | Oracle11g数据库的认证体系结构 »

关于《深入浅出Oracle》中granule的补充

作者:eygle |【转载时请以超链接形式标明文章和作者信息及本声明
链接:

在《深入浅出Oracle》一书的P110页,关于Oracle的Granule我有这样一段描述:

自9i开始,Oracle引入新的初始化参数db_cache_size;该参数定义主Block Size(db_block_size定义的块大小)的default缓冲池的大小;
Db_cache_size最小值为一个粒度(granule)。
粒度(granule):粒度是连续虚拟内存分配的单位,粒度是9i新引入的参数,其大小取决于SGA_MAX_SIZE参数所定义的SGA总的大小
当SGA<128M时,粒度值为4M;
否则粒度值为16M
粒度大小受内部隐含参数_ksmg_granule_size的控制

有朋友在Windows2003上测试得出了不同的结论:

SQL> show sga

Total System Global Area 319888364 bytes
Fixed Size 453612 bytes
Variable Size 310378496 bytes
Database Buffers 8388608 bytes
Redo Buffers 667648 bytes
SQL> set linesize 120
SQL> col name for a30
SQL> col value for a20
SQL> col describ for a60
SQL> SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ
2 FROM SYS.x$ksppi x, SYS.x$ksppcv y
3 WHERE x.inst_id = USERENV ('Instance')
4 AND y.inst_id = USERENV ('Instance')
5 AND x.indx = y.indx
6 AND x.ksppinm LIKE '%&par%'
7 /
Enter value for par: _ksmg_granule_size
old 6: AND x.ksppinm LIKE '%&par%'
new 6: AND x.ksppinm LIKE '%_ksmg_granule_size%'

NAME VALUE DESCRIB
------------------------------ -------------------- ---------------------------
_ksmg_granule_size 8388608 granule size in bytes

SQL> alter system set sga_max_size=100M scope=spfile;

System altered.

SQL> startup force
ORACLE instance started.

Total System Global Area 114367248 bytes
Fixed Size 453392 bytes
Variable Size 109051904 bytes
Database Buffers 4194304 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。

SQL> SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ
2 FROM SYS.x$ksppi x, SYS.x$ksppcv y
3 WHERE x.inst_id = USERENV ('Instance')
4 AND y.inst_id = USERENV ('Instance')
5 AND x.indx = y.indx
6 AND x.ksppinm LIKE '%&par%'
7 /
输入 par 的值: _ksmg_granule_size
原值 6: AND x.ksppinm LIKE '%&par%'
新值 6: AND x.ksppinm LIKE '%_ksmg_granule_size%'

NAME VALUE DESCRIB
------------------------------ -------------------- ----------------------------
_ksmg_granule_size 4194304 granule size in bytes

其实这个granule_size在不同平台、不同版本中,Oracle的设置的缺省值都可能不同,书中提到的是一种通常设置,具体的我们知道了Oracle的内存管理方式就好。

Oracle9i的官方文档如下描述:

Granule size is determined by total SGA size. On most platforms, the size of a granule is 4 MB if the total SGA size is less than 128 MB, and it is 16 MB for larger SGAs. There may be some platform dependency, for example, on 32-bit Windows NT, the granule size is 8 MB for SGAs larger than 128 MB.

Oracle10gR2文档如下描述:

Granule size is determined by total SGA size. On most platforms, the size of a granule is 4 MB if the total SGA size is less than 1 GB, and granule size is 16MB for larger
SGAs. Some platform dependencies arise. For example, on 32-bit Windows, the
granule size is 8 M for SGAs larger than 1 GB.

列举如上,供参考。

-The End-


历史上的今天...
      >> 2008-01-22文章:
             一个工作机会PDM/DBA/上海
      >> 2006-01-22文章:
      >> 2005-01-22文章:
             RSS的基本知识
------
这篇 【关于《深入浅出Oracle》中granule的补充】来自 eygle.com | CSDN网摘| del.icio.us|Google订阅 | 鲜果订阅 | 抓虾订阅

By eygle on 2007-01-22 11:17 | Comments (3) | Posted to Books | FAQ | Edit |

相关文章 随机文章
  • 字节序、CPU 与 内存 - 循序渐进Oracle 补校
  • 《DBA手记 - 诊断案例与性能调整》一书定稿
  • 如何在自动SGA管理模式下调节参数设置
  • Granule 与 Redo Log Buffer (log_buffer) 的关系
  • 《循序渐进Oracle》+《深入解析Oracle》再版
  • 预防猪流感 - 一个都不能少
    并购狂潮-EMC的动作
    青丝秀发,缘系百年-经典重温
    恩墨科技为某企业SAP数据库提供紧急援助服务
    一则简单的磁盘的iops测试
    搜索本站:

    留言 (3)

    eygle,真的佩服
    我上周自己看书发现的问题,今天只是记录一下,怕自己忘了
    这么快都被你发现了
    多谢!

    Posted by: oracle114 at January 22, 2007 12:21 PM

    有疑问的地方,俺有责任澄清一下的。

    谢谢你读书这么认真:)

    Posted by: eygle at January 22, 2007 2:33 PM

    在Oracle的内存分配和管理中,有一个重要的单位:Granule(颗粒)。granule是连续虚拟内存分配的单位。Granule的大小依赖于SGA的总的大小(即SGA_MAX_SIZE大小)。当SGA小于128M时,granule为4M,SGA大于128M时,granule为16M。

    Buffer Cache、Shared Pool、Large Pool和Java Pool(在10g中,还包括Streams Pool、KEEP buffer cache、RECYCLE buffer cache、nK Buffer Cache、ASM Buffer Cache)的增长和收缩都是以granule为单位的。SGA的各个组件的大小增长、收缩情况可以通过视图v$sga_dynamic_components(这个视图在1.1.2中有介绍)来观察。

    在实例启动时, Oracle先分配granule条目(Entry),使所有granule能支持到SGA_MAX_SIZE的空间大小。如果没有设置PRE_PAGE_SGA和LOCK_SGA,在实例启动时,每个组件请求它所需要的最少granule。

    因此最小SGA(占用物理内存)是3个granule,包括:

    o 固定SGA(包括redo buffer)一个granule

    o Buffer Cache一个granule

    o Shared Pool一个granule

    我们可以通过“ALTER SYSTEM”命令来修改分配给各个组件的granule数。当DBA想要给组件增加granule时,需要考虑实例中是否还有足够的granule来分配给新增加的组件大小(即增大后,各个组件之和小于SGA_MAX_SIZE)。有一点要注意,ALERT SYSTEM指定的是新的组件大小,是内存的大小,不是granule数。而Oracle在分配内存时,会以granule为单位,如果新分配的大小不是granule大小的倍数,则会使用最接近且大于分配数的granule的倍数值。例如,Unix中,当granule为16M,新分配组件大小为120M(不是16的倍数),Oracle则会实际分配128M(16×8);32位windows下,SGA小于1G时granule是4M,大于1G时granule是8M。

    执行ALERT SYSTEM扩展组件大小后,前台进程(即执行ALTER SYSTEM命令)的进程会将SGA中的可用的granule(按照扩展新增大小计算)先保留下来。当这些granule被保留后,前台进程将后续处理交给后台进程。后台进程负责将这些保留的granule加到指定的组件的granule列表中去。这就完成了一次对SGA组件的扩展。

    Granule的默认大小是根据以上规则规定的,但也可以通过隐含参数_ksm_granule_size来修改(强烈不建议修改)。另外,隐含参数_ksmg_granule_locking_status可以设置内存分配是否强制按照granule为单位进行分配。

    作者: fuyuncat

    来源: www.HelloDBA.com

    Posted by: duffy at January 12, 2009 1:43 PM

    发表留言:



    Remember Me?
    (输入验证码后方可评论,谢谢支持)



    CopyRight © 2004~2010 eygle.com, All rights reserved.