Chinaunix首页 | 论坛 | 博客
  • 博客访问: 11590825
  • 博文数量: 8065
  • 博客积分: 10002
  • 博客等级: 中将
  • 技术积分: 96708
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-16 17:06
文章分类

全部博文(8065)

文章存档

2008年(8065)

分类: 服务器与存储

2008-07-16 09:08:21

数据缓存命中率
·    数据缓存命中率由下面四个来自V$SYSSTAT的统计值计算得来:
?nbsp;   physical reads 从磁盘读取的块数;
?nbsp;   physical reads direct 从磁盘读取不进入数据缓存的数据块数;
?nbsp;   physical reads direct (lob) 从磁盘读取不进入数据缓存的LOB对象块数;
?nbsp;   session logical reads 从数据缓存中读取的块数,包括当前读(Current, db_block_gets)和一致性读(consistent gets);
·    命中率 = 1- ((physical reads – physical reads direct – physical reads direct (lob)) / session logical reads),调整好的OLTP系统,数据缓存命中率应该在90%以上;
·    查询语句如下:
select 1 – ((physical.value – direct.value – lobs.value) / logical.value)
from v$sysstat physical,
     v$sysstat direct,
     v$sysstat lobs,
     v$sysstat logical
where physical.name = ‘physical reads’
and   direct.name   = ‘physical reads direct’
and   lobs.name    = ‘physical reads direct (lob)’
and   logical.name  = ‘session logical reads’;

数据缓存等待
·    free buffer inspected 用户服务器进程为了将数据从磁盘读到数据缓存,在数据缓存中查找可用的块,在找到可用块之前共查找过的缓存块数;
·    free buffer waits 用户服务器进程为了将数据从磁盘读到某个脏块,需等待DBW0将这个脏块写回磁盘;
·    buffer busy waits  用户服务器进程要存取某个缓存块,如果有其它会话正在使用它,必须等待其完成,可能的原因有:
?nbsp;   并行插入时表的Free lists不足引发段头等待(改用LMT可消除此影响);
?nbsp;   并发事务较多时表的InitTrans太小引发事务等待(增大表的InitTrans);
?nbsp;   回滚段不足时引发undo header等待(增加回滚段的个数);
·    一起查询时用下面的语句:
select name,value from v$sysstat where name = ‘free buffer inspected’
union
select event,total_waits from v$system_event where event in (‘free buffer waits’,’buffer busy waits’);

Statspack中存放数据缓存性能数据的位置
·    Instance Efficiency Percentages (Target 100%)(实例命中率) – Buffer Hit %;
·    Instance Activity Stat (实例的活动统计) – free buffer inspected, physical reads, physical reads direct, physical reads direct (lob), session logical reads;
·    Buffer Pool Statistics (数据缓存统计) -- free buffer waits, buffer busy waits。


第五章 调整数据缓存 3.增大数据缓存


改进数据缓存的性能
改进数据缓存的性能有下面一些方法:增大数据缓存,用多个数据缓存池,将小表CACHE到数据缓存,绕过缓存池,正确地使用索引

增大数据缓存
·    改进数据缓存性能最简单的方法就是增大这块内存,加大数据缓存后,缓存块就可以在LRU列表上呆更多的时间,从而提高命中率,free buffer inspected, buffer busy waits, free buffer waits这三个统计值也会相应降低;
·    与数据缓存相关的初始参数有下面的一些:
?nbsp;   DB_BLOCK_SIZE 主块字节数,在数据库创建时指定,不能更改,SYSTEM和TEMP表空间只能使用主块创建,后面提到的调整方法主要是针对主块缓存池来进行讨论的;
?nbsp;   DB_CACHE_SIZE 指定默认缓存池的大小,不能为零,用于存放主块;
?nbsp;   DB_KEEP_CACHE_SIZE 指定保持缓存池的大小,默认值为零,用于存放主块;
?nbsp;   DB_RECYCLE_CACHE_SIZE 指定回收缓存池的大小,默认值为零,用于存放主块;
?nbsp;   DB_nK_CACHE_SIZE 默认值为零,这些参数指定用于容纳不同于主块大小的数据块的缓存空间,创建其它表空间时可以使用与主块不同的块大小(先设置好对应参数再创建表空间,存在对应的表空间时,这些参数不能再更改回默认值),不要更改与主块大小相同的那个参数的默认值。
·    动态修改数据缓存的大小;可以用ALTER SYSTEM命令动态修改数据缓存的大小,但必须记住下面三条规则:
?nbsp;   最终生效的大小是最小粒度的整数倍;
?nbsp;   共享池,数据缓存,日志缓存之和不能大于SGA_MAX_SIZE的值;
?nbsp;   DB_CACHE_SIZE不能指定为零。
·    手工更改数据缓存的大小:关闭实例,更改参数,再重启,这种方法适于同时更改SGA_MAX_SIZE;
·    确定数据缓存的合适大小:用Buffer Cache Advisory
?nbsp;   设置参数DB_CACHE_ADVISE的值为ON(设置为OFF时关掉ADVISORY,设为READY时预先给ADVISORY分配内存,但不分配CPU,以防将该参数改为ON时出现内存不足的错误);
?nbsp;   待ADVISORY运行一段时间(30分钟以上)后,再查询V$DB_CACHE_ADVICE,相关字段的意义如下表:
ü    ID 缓存池编号
ü    NAME 缓存池的名字
ü    BLOCK_SIZE 块大小
ü    ADVISE_STATUS 参数的状态:ON, OFF, READY
ü    SIZE_FOR_ESTIMATE 评估缓存大小(M)
ü    ESTD_PHYSICAL_READS 评估的物理读
?nbsp;   评估的物理读趋于稳定时的评估缓存就是最合适的大小。
阅读(230) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~