latch: cache buffers chains故障处理总结

故障分析思路

查看等待事件,判断故障起因

SQL>select * from (select sid,event,p1,p2,p3,p1text,WAIT_TIME,SECONDS_IN_WAIT from v$session_wait where wait_class# <> 6 order by wait_time desc) where rownum <=10;

确认为latch: cache buffers chains引起的故障后,查看latch的命中率

SQL>SELECT name, gets, misses, sleeps,        immediate_gets, immediate_misses      FROM v$latch    WHERE name = ‘cache buffers chains‘;

各列名称意义如下

NAME:latch名称 IMMEDIATE_GETS:以Immediate模式latch请求数 IMMEDIATE_MISSES:请求失败数 GETS:以Willing to wait请求模式latch的请求数 MISSES:初次尝试请求不成功次数 SPIN_GETS:第一次尝试失败,但在以后的轮次中成功 SLEEP[x]:成功获取前sleeping次数 WAIT_TIME:花费在等待latch的时间

这里需要注意MISSES/GETS如果在达10%左右,则说明有比较严重的latch争用,也可以通过查询v$latch_children视图查看其他latch信息 ,语句如下

SQL> SELECT *     FROM (SELECT   addr, child#, gets, misses, sleeps, immediate_gets igets,                   immediate_misses imiss, spin_gets sgets               FROM v$latch_children              WHERE NAME = ‘cache buffers chains‘           ORDER BY sleeps DESC)    WHERE ROWNUM < 11;

关于latch的统计信息,主要关注以下几部分

misses/gets的比率是多少

获自spinning的misses的百分比是多少

latch请求了多少次

latch休眠了多少次

查看热点对象和访问信息,TCH列表示对象被访问的次数

SQL> SELECT *     FROM (  SELECT addr,                    ts#,                    file#,                    dbarfil,                    dbablk,                    tch               FROM x$bh           ORDER BY tch DESC)    WHERE ROWNUM < 11;

通过对象的文件号和块号查看具体对象信息

SQL>select owner, segment_name, partition_name, tablespace_name  from dba_extents where relative_fno = &v_dba_rfile and &v_dba_block between block_id and block_id + blocks - 1;

也可以通过如下sql查找热点块,主要

SELECT *

FROM (SELECT O.OWNER, O.OBJECT_NAME, O.OBJECT_TYPE, SUM(TCH) TOUCHTIME

FROM X$BH B, DBA_OBJECTS O

WHERE B.OBJ = O.DATA_OBJECT_ID

AND B.TS# > 0

GROUP BY O.OWNER, O.OBJECT_NAME, O.OBJECT_TYPE

ORDER BY SUM(TCH) DESC)

WHERE ROWNUM <= 10;

查看引起latch: cache buffers chains的sql

SQL> select * from (select      count(*),      sql_id,      nvl(o.object_name,ash.current_obj#) objn,     substr(o.object_type,0,10) otype,      3    4    5    6        CURRENT_FILE# fn,          CURRENT_BLOCK# blockn    from  v$active_session_history ash        , all_objects o    where event like ‘latch: cache buffers chains‘      and o.object_id (+)= ash.CURRENT_OBJ#    group by sql_id, current_obj#, current_file#,                   current_block#, o.object_name,o.object_type    order by  count(*) desc )where rownum <=10;

根据上面得到的sql_id信息查看sql全文

SQL>select sql_fulltext from v$sqlarea where sql_id=‘&sqlid‘;

查看SQL的执行计划 SQL>SELECT * FROM table(DBMS_XPLAN.DISPLAY_CURSOR((‘&sql_id‘,0));

在认为sql执行计划不准确的情况也可以通过sql_id查看sql的address和hash_value查看sql的实际执行计划

SQL>SELECT  address, hash_value FROM v$sql       WHERE sql_id=‘&sql_id‘;  SQL>SELECT operation, options, object_name, cost FROM v$sql_plan       WHERE address = ‘&addr‘ AND hash_value = ‘hash_v‘;

当某个会话长时间持有latch时,可以通过联合v$latchholder和v$session视图查看sql信息

SQL>SELECT s.sql_hash_value,s.sql_id,s.address, l.name   FROM V$SESSION s, V$LATCHHOLDER l WHERE s.sid = l.sid;

故障处理思路

1、根据sql执行计划判断该执行计划是否正确,sql执行过长往往意味着过长时间的持有latch。

2、优化nested loop join,如果有可能使用hash join代替nested loop join。也可以利用对热块索引进行hash分区,或者使用hash簇的方式减缓热块现象。

3、调整表的pctfree值,将数据尽可能的分布到多个块中

4、调整应用

5、等。呵呵当出现latch争用时,故障时刻确实没有较好的方式解决,找到病因才是关键。

时间: 2024-10-12 20:36:52

latch: cache buffers chains故障处理总结的相关文章

latch: cache buffers chains故障处理总结(转载)

一大早就接到开发商的电话,说数据库的CPU使用率为100%,应用相应迟缓.急匆匆的赶到现场发现进行了基本的检查后发现是latch: cache buffers chains 作祟,处理过程还算顺利,当时忘了记录log,这里总结下处理思路,以便下次查看. 故障分析思路 查看等待事件,判断故障起因 SQL>select * from (select sid,event,p1,p2,p3,p1text,WAIT_TIME,SECONDS_IN_WAIT from v$session_wait wher

WAIT EVENT: latch: cache buffers chains

关于CACHE BUFFERS CHAINS描述 CACHE BUFFERS CHAINS latch is acquired when searching for data blocks cached in the buffer cache. Since the Buffer cache is implemented as a sum of chains of blocks, each of those chains is protected by a child of this latch

【转载】latch: cache buffers chains

本文转自惜分飞的博客,博客原文地址:www.xifenfei.com/1109.html,支持原创,分享知识! 当一个数据块读入sga区,相应的buffer header会被放置到hash列表上,我们称其这hash chains,chain在中文的意为链条或串的意思,表达就是关连性.如果一个进程想访问或修改hash chain上的block,它首先要获得"cache buffers chains" latch. 原因一:低效率的SQL语句(主要体现在逻辑读过高) cache buffe

latch:cache buffers chains的优化思路

数据块在buffer cache存放是以linked list方式存放的.当一个session想要访问/修改buffer cache的block,首先需要通过hash算法检查该block是否存在于buffer cache中,检查相同的SQL语句是否存在于library cache中也是通过hash算法实现的.要判断block是否存在于buffer cache中,就需要扫描linked list(此处都是串行的,不能并发),获取block的信息.而扫描linked list必须获得一个latch,

cache buffer 相关的闩锁等待事件(cache buffers lru chain/cache buffers chain)

cache buffers lru chain原因高负荷的cache吞吐量,效率差的sql语句(全表扫描,或不正确的index range scans)dbwr写出速度太慢,前台进程花费很多时间持有latch查找free buffer. cache buffers lru chain保护buffer的链表在cache中,当增加,移除,移动一个buffer从list时,cblc latch必须被获取.在SMP(对称多处理)的系统上,oracle自动设置LRU latche数量是cpu个数的一半.在

shared pool 和buffer pool 详解(之二, Cache Buffers LRU Chain、Cache Buffers LRU Chain闩锁竞争与解决)

[深入解析--eygle]学习笔记 1.1.2  Cache BuffersLRU Chain闩锁竞争与解决 当用户进程需要读数据到Buffer Cache时或Cache Buffer根据LRU算法进行管理等,就不可避免的要扫描LRU  List获取可用Buffer或更改Buffer状态,我们知道,Oracle的Buffer Cache是共享内存,可以为众多并发进程并发访问,所以在搜索的过程中必须获取Latch(Latch是Oracle的一种串行锁机制,用于保护共享内存结构),锁定内存结构,防止

linux top命令中的cache &amp; buffers

今天用top查看系统具体进程使用系统资源的情况时,对cache和buffer这两个概念不是很清楚,研究了一下: **cache是高速缓存,用于CPU和内存之间的缓冲: **buffer是I/O缓存,用于内存和硬盘的缓冲* [原文链接](http://blog.chinaunix.net/uid-24020646-id-2939696.html) 当你在linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching.这个问题,貌似有不少人在问,不过都

cache buffers

buffers缓冲,可以型象的理解为漏斗.如果有大量的数据要写入磁盘,由于数据量很大,磁盘不能一下子接收,所以这个时候,就有了buffer这个漏斗,先把数据放入这个漏斗里面,然后让它慢慢的注入磁盘,这就是buffer. cache 是缓存.由于进程从磁盘读数据的时候会比较慢,而在内存的速度比较快,所以进程会把将要用到的数据先慢慢读入到缓存里,用的时候,直接从内存中读取,这样比起用时从磁盘中读数据,来的快很多.

浅谈Linux 内存中的Cache: buffers 与 cached

Linux 内存中的Cache,真的能被回收么? 您真的了解Linux的free命令么? 在Linux系统中,我们经常用free命令来查看系统内存的使用状态.在一个RHEL6的系统上,free命令的显示内容大概是这样一个状态: 这里的默认显示单位是kb,我的服务器是128G内存,所以数字显得比较大.这个命令几乎是每一个使用过Linux的人必会的命令,但越是这样的命令,似乎真正明白的人越少(我是说比例越少). 一般情况下,对此命令输出的理解可以分这几个层次: 不了解.这样的人的第一反应是:天啊,内