`

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 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、调整应用

关于热块,可以参阅笔者的如下文章

http://czmmiao.iteye.com/blog/1474472

 

参考至:https://sites.google.com/site/embtdbo/wait-event-documentation/oracle-latch-cache-buffers-chains

            http://space.itpub.net/354732/viewspace-697317

            http://www.toadworld.com/KNOWLEDGE/KnowledgeXpertforOracle/tabid/648/TopicID/RCBCL/Default.aspx

            http://blog.163.com/wghbeyond@126/blog/static/351661812010619073376/

本文原创,转载请注明出处、作者

如有错误,欢迎指正

邮箱:czmcj@163.com

2
0
分享到:
评论
4 楼 czmmiao 2013-01-10  
mikixiyou 写道
czmmiao 写道
mikixiyou 写道
写的不错。
你用hash分区将索引分区来减缓这个争用了吗?

由于表中的数据需要定期进行批量操作不适合引入哈希索引来减缓热块问题,最终采用了增大PCTFREE将数据分布于多个数据块的方式减少热块。

那表且不是变大了不少?

表是有变大,二者不可兼得嘛!
3 楼 mikixiyou 2013-01-10  
czmmiao 写道
mikixiyou 写道
写的不错。
你用hash分区将索引分区来减缓这个争用了吗?

由于表中的数据需要定期进行批量操作不适合引入哈希索引来减缓热块问题,最终采用了增大PCTFREE将数据分布于多个数据块的方式减少热块。

那表且不是变大了不少?
2 楼 czmmiao 2013-01-09  
mikixiyou 写道
写的不错。
你用hash分区将索引分区来减缓这个争用了吗?

由于表中的数据需要定期进行批量操作不适合引入哈希索引来减缓热块问题,最终采用了增大PCTFREE将数据分布于多个数据块的方式减少热块。
1 楼 mikixiyou 2013-01-09  
写的不错。
你用hash分区将索引分区来减缓这个争用了吗?

相关推荐

    等待事件row cache lock,latch row cache objects处理过程.txt

    等待事件row cache lock,latch row cache objects处理过程

    cache buffers chain形成原因分析

    增加`child cache buffers chains latch`的数量通常不会解决这个问题,因为数据块的分配是基于数据块地址和哈希链数量计算得出的,而不是根据`latch`的数量。 可以通过查看`v$session_wait`视图中的`p1raw`字段来...

    oracle Library cache latch 竞争的解决

    ### Oracle Library Cache Latch 竞争的解决 在Oracle数据库中,`Library Cache Latch`竞争是一个常见的性能瓶颈问题,通常会导致系统响应时间增加、性能下降等问题。本篇文章将详细探讨如何诊断并解决该问题。 ##...

    数据库中堵塞事件处理

    这里以`latch: cache buffers chains`为例,它是一种常见的锁等待类型,通常与缓存块的访问有关。通过这种方式,我们可以快速定位到具体是哪些会话造成了这种类型的等待。 #### 根据hash_value查询具体SQL 有时候...

    oracle 圆桌会议交流文档 性能相关

    如果CPU利用率高达100%,并且等待事件显示为`latch: cache buffers chains`,这表明数据库可能需要优化其内存配置或SQL查询。解决这个问题的一种方法是通过删除并重新收集统计信息,特别是如果查询中使用了绑定变量...

    AWR中的时间模型

    例如,如果`latch: cache buffers chains`等待事件占据主导,说明可能存在缓存缓冲区链争用,影响了性能。而`CPU time`作为等待事件出现,表示Oracle进程在等待其他资源时,CPU并没有被有效利用。 通过对AWR中的...

    Latch Free、Library cache伪游标(pseudo cursor)之间的那些事

    在数据库运维和性能调优领域,处理LatchFree问题和Library cache争用是经常会遇到的难题。LatchFree指的是Oracle数据库在获取 latch时出现的争用问题, latch是数据库内存结构中的一种轻量级的串行化控制机制,用于...

    latch相关内容讲解

    - **REDO ALLOCATION LATCH**:关系到重做日志处理的速度。 ### 十、Latch SPIN_COUNT 参数的调整 Latch SPIN_COUNT 参数(在Oracle 7中称为_LATCH_SPIN_COUNT)用于控制进程在等待Latch时的自旋次数。合理设置该...

    Oracle性能诊断之——Latch free

    例如,针对Buffer Cache的`cache buffer chains latch`和`cache buffer lru latch`,Shared Pool的`shared pool latch`和`library cache latch`,以及Log Buffer的`redo copy latch`、`redo allocation latch`和`...

    Oracle MySQL数据库故障处理应急方案

    Oracle MySQL数据库故障处理应急方案是一系列针对数据库在运行过程中可能遇到的锁等待、latchfree、cachebufferchains以及librarycachelock等高资源消耗和CPU负载问题的处理方法和步骤。该方案详细描述了上述问题的...

    latch:闩锁 - 实时服务器性能网络图

    gcc -Wall -O2 latch.c -o latch 示例用法 在端口 4443 上运行闩锁并启动 Python 服务器 ./testrun.sh 运行锁存器 ./latch ./latch &gt; latch.log 运行 Python HTTP 服务器 cd www/ ./server.py 依赖关系 * ...

    latch:轻松使用密码和Touch ID身份验证! (Producthunt Hackathon)

    安装将Framework文件夹复制到您的项目中将Latch.LTPasscode.xib更改为&lt;module&gt;.LTPasscode.xib配置() 在视图控制器中创建闩锁self . latch = Latch ()self . latch . delegate = self // Make sure to add ...

    meteor-latch:使用 Latch 服务保护用户帐户

    流星闩锁它是一个将 Latch 服务与 Meteor 框架集成的软件包,让用户可以轻松保护自己的帐户。目录 描述Meteor 是用于构建现代 Web 应用程序的超简单环境。 它是一个允许以极快的速度创建实时应用程序的框架。 Latch ...

    canary_latch:基于#Latch 的#CanaryMod 访问控制插件

    金丝雀闩锁基于#Latch 的#CanaryMod 访问控制插件版权所有 :copyright: 2015 Antonio Jesús Sánchez Padial执照Canary Latch是免费软件:您可以根据自由软件基金会发布的 GNU 宽松通用公共许可证(许可证的 2.1 版...

    oracle监控.txt

    - **`cachebuffers chains`**: 如果 miss 数值较高,则可能表明 SGA 中的数据缓冲区不足或存在热点数据块。 - **`cachebuffers lru chain`**: 同样表示 SGA 中的数据缓冲区不足。 - **`shared pool`**: 关注共享...

    Oracle等待事件latch解析

    例如,在访问缓冲区链(buffer chains)时,会涉及到`cache buffers chains` latch,用于检查缓冲区链的状态。本质上,Latch可以被视为一种锁(lock),用于控制并发访问。 #### 二、什么是Latch争用? Latch争用是指...

    Latch up测试标准

    "Latch up测试标准" Latch up测试标准是JEDEC(Joint Electron Device Engineering Council)制定的一个工业标准,旨在确保半导体器件的可靠性和安全性。Latch up是一种电流泄露现象,当半导体器件在高温、高湿或...

    alfresco-latch:Alfresco 的闩锁插件

    #LATCH 露天安装指南这是一个 beta 锁存插件,它实现了两个功能: 闩锁(Alfresco Explorer 和 Alfresco Share) 两因素身份验证(Alfresco Share) ##先决条件Alfresco 4.2 或更高版本使用 Alfresco Community 版本...

    meteor-accounts-ui-latch:帐户-ui 包的闩锁集成

    帐户-ui-latch 一个将 Latch 服务与 Meteor 框架集成的软件包,让用户可以轻松保护自己的帐户。 这个包扩展了accounts-ui包的不同模板,以在登录下拉菜单中添加 Latch 选项。 第一次添加这个包时,会在下拉登录菜单...

    Oracle数据库latch和mutex等待事件全面解析

    - 自Oracle 8.0起,可以实现共享Latch,用于某些AQ操作(如检查缓冲区链时获取的Cache Buffers Chains Latch)。 **1.2 Mutex简介** - **定义**:Mutex是一种更高层次的同步机制,用于保护更复杂的内存结构。 - *...

Global site tag (gtag.js) - Google Analytics