三、确定当前Oracle性能瓶颈
(1)V$SYSTEM_EVENT、V$SESSION_EVENT、V$SESSION_WAIT三个动态性能视图称之为等待接口。
(2)等待事件,分为空闲等待事件和非空闲等待事件。
1)空闲等待事件指Oracle正在等待某项操作;
2)非空闲等待事件专门指Oracle活动,例如
db file scattered read (DB文件分散读取)
这种情况通常与全表扫描相关. 当数据库进行全表扫描时, 基于性能的考虑, 数据会分散(scattered)读入buffer cache. 如果这个等待事件比较显着, 可能考虑查看对应的表有没有创建合适的索引.
然而这个等待事件并不一定就意味着性能低下, 在某些条件下oracle会主动使用全表扫描来替换索引扫描以提高性能, 这和访问的数据量有关, 在CBO下oracle会进行更为智能的选择, RBO下oracle更倾向于使用索引.
因为全表扫描到内存的数据块被置于LRU链表的冷端, 所以这些数据块将可能在较短时间内被置换出物理内存, 为了避免反复物理IO, 对频繁访问的较小的数据表,可以选择把他们cache到内存中.
当这个等待时间比较显着时, 可以结合v$session_longops动态性能视图来进行诊断, 该视图中记录了长时间(运行时间超过6秒)运行的事务, 可能很多是全表扫描操作.
db file sequential read(DB 文件顺序读取)
这一事件通常显示与单个数据块相关的读取操作, 比如对索引块的读取. 如果这个等待事件比较显着, 可能表示在多表连接中, 表的链接顺序存在问题, 可能没有正确的使用驱动表; 或者可能说明不加选择地进行索引.
free buffer (释放缓冲区)
这个等待事件表明系统正在等待内存中的可用空间,这说明当前Buffer 中已经没有Free 的内存空间。Free Buffer 等待可能说明DBWR 的写出速度不够,或者磁盘存在严重的竞争,可以需要考虑增加检查点、使用更多的DBWR 进程,或者增加物理磁盘的数量,分散负载,平衡IO。
buffer busy(缓冲区忙)
该等待事件表示正在等待一个以unshareable方式使用的缓冲区,或者表示当前正在被读入buffer cache。一般来说Buffer Busy Wait不应大于1%。检查缓冲等待统计部分(或V$WAITSTAT),看一下等待是否位于段头(Segment Header)。如果是,可以考虑增加自由列表(freelist,对于Oracle8i DMT)或者增加freelist groups(在很多时候这个调整是立竿见影的,在8.1.6之前,这个freelists参数不能动态修改;在8.1.6及以后版本,动态修改 feelists需要设置COMPATIBLE至少为8.1.6).
latch free (latch 释放)
latch是一种低级排队机制,用于保护SGA中共享内存结构。latch就像是一种快速地被获取和释放的内存锁。用于防止共享内存结构被多个用户同时访问。如果latch不可用,就会记录latch释放失败(latch free miss )。有两种与闩有关的类型:
■ 立刻
■ 可以等待
假如一个进程试图在立刻模式下获得闩,而该闩已经被另外一个进程所持有,如果该闩不能立可用的话,那么该进程就不会为获得该闩而等待。它将继续执行另一个操作。
大多数latch问题都与以下操作相关:
没有很好的是用绑定变量(library cache latch)、重作生成问题(redo allocation latch)、缓冲存储竞争问题(cache buffers LRU chain),以及buffer cache中的存在"热点"块(cache buffers chain)。
通常我们说,如果想设计一个失败的系统,不考虑绑定变量,这一个条件就够了,对于异构性强的系统,不使用绑定变量的后果是极其严重的。
另外也有一些latch等待与bug有关,应当关注Metalink相关bug的公布及补丁的发布。当latch miss ratios大于0.5%时,就应当研究这一问题。
log buffer space(日志缓冲空间)
当你将日志缓冲(log buffer)产生重做日志的速度比LGWR 的写出速度快,或者是当日志切换(log switch)太慢时,就会发生这种等待。这个等待出现时,通常表明redo log buffer 过小,为解决这个问题,可以考虑增大日志文件的大小,或者增加日志缓冲器的大小。
另外一个可能的原因是磁盘I/O 存在瓶颈,可以考虑使用写入速度更快的磁盘。在允许的条件下设置可以考虑使用裸设备来存放日志文件,提高写入效率。在一般的系统中,最低的标准是,不要把日志文件和数据文件存放在一起,因为通常日志文件只写不读,分离存放可以获得性能提升
(3)V$SYSTEM_EVENT反映的一些信息,存放实例启动以来的所有等待事件
V$SYSTEM_EVENT中的常用列
l--------->EVENT:等待事件名称
l--------->TOTAL_WAITS:此项事件总等待次数
l--------->TIME_WAITED:此项事件的总等待时间(单位:百分之一秒)
l--------->AVERAGE_WAIT:此项事件的平均等待用时(单位:百分之一秒)(time_waited/total_waits)
l--------->TOTAL_TIMEOUTS:此项事情总等待超时次数
(4)V$SESSION_EVENT
l--------->SID:session标识
l--------->EVENT:session等待的事件
l--------->TOTAL_WAITS:此session当前事件的总等待数
l--------->TIME_WAITED:此session总等待时间(单位,百分之一秒)
l--------->AVERAGE_WAIT:此session当前事件平均等待时间(单位,百分之一秒)
l--------->TOTAL_TIMEOUTS:等待超时次数
l--------->其它用法与V$SESSION_WAIT相似,不详述了
(5)V$SESSION_WAIT
$SESSION_WAIT中,每一个连接到实例的session都对应一条记录。
V$SESSION_WAIT中的常用列
l--------->SID: session标识
l--------->EVENT: session当前等待的事件,或者最后一次等待事件。
l--------->WAIT_TIME: session等待事件的时间(单位,百分之一秒)如果本列为0,说明session当前session还未有任何等待。
l--------->SEQ#: session等待事件将触发其值自增长
l--------->P1, P2, P3: 等待事件中等待的详细资料
l--------->P1TEXT, P2TEXT, P3TEXT: 解释说明p1,p2,p3事件
l--------->State事件状态,提供了WAIT_TIME和SECOND_IN_WAIT的详细细节。
WAITING会话正在等待此事件
WAITED UNKNOWNED TIME如果TIME_STATICTICS为假,此状态为真
Wait short time:表示发生了等待,但由于时间非常短不超过一个时间单位,所以没有记录。
Waited knnow time:如果session等待然后得到了所需资源,那么将从waiting进入本状态。
Wait_time值也有四种含义:
值>0:最后一次等待时间(单位:10ms),当前未在等待状态。
值=0:session正在等待当前的事件。
值=-1:最后一次等待时间小于1个统计单位,当前未在等待状态。
值=-2:时间统计状态未置为可用,当前未在等待状态。
Wait_time和Second_in_wait字段值与state相关:
如果state值为Waiting,那么wait_time值无用。Second_in_wait值是实际的等待时间(单位:秒)。
如果state值为Wait unknow time,那么wait_time值和Second_in_wait值都无用。
如果state值为Wait short time,那么wait_time值和Second_in_wait值都无用。
如果state值为Waiting known time,那么wait_time值就是实际等待时间(单位:秒),Second_in_wait值无用。
基于等待事件的性能优化方法
查询常见等待事件
Select * from v$session where event in('buffer busy waits', 'db file sequential read', 'db file scattered read', 'enquenue', 'free buffer waits', 'latch free', 'log file paralles write', 'log file sync');
利用v$session、v$session_event来查询对上面得到的结果有贡献的等待事件的会话。
select se.SID, s.USERNAME, se.EVENT, se.TOTAL_WAITS, se.TIME_WAITED, se.AVERAGE_WAIT from v$session s, v$session_event se
where s.USERNAME is not null and s.SID = se.SID and s.STATUS ='ACTIVE' and se.EVENT not like '%SQL*NET%';
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/518171/viewspace-1035011/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/518171/viewspace-1035011/