广告
返回顶部
首页 > 资讯 > 数据库 >深入理解latch: cache buffers chains
  • 255
分享到

深入理解latch: cache buffers chains

2024-04-02 19:04:59 255人浏览 独家记忆
摘要

事件背景:    一个客户的数据库发生了宕机事件,查看了数据库的awr报告,原来是由于出现大量的latch: cache buffers chains等待事件导致系统消耗量大量的CP

事件背景:   
一个客户的数据库发生了宕机事件,查看了数据库的awr报告,原来是由于出现大量的latch: cache buffers chains等待事件导致系统消耗量大量的CPU,最终导致系统hang住;

说明:
   
要理解latch: cache buffers chains并解决这个问题,就需要深入的了解Buffer Cache及其原理。
1、Buffer Cache概述:   
Buffer Cache是SGA的一部分,oracle利用Buffer Cache来管理data block,Buffer Cache的最终目的就是尽可能的减少磁盘I/O。Buffer Cache中主要有3大结构用来管理Buffer Cache:Hash Bucket、Hash Chain List、LRU List;   
Hash Bucket & Hash Chain List :Hash Bucket与Hash Chain List用来实现data block的快速定位。   
LRU List :挂载有指向具体的free buffer, pinned buffer以及还没有被移动到 write list的dirty buffer 等信息。所谓的free buffer就是指没有包含任何数据的buffer,所谓的pinned buffer,就是指当前正在被访问的buffer。   
Write(Dirty)List :挂载有指向具体的 dirty block的信息。所谓的dirty block,就是指在 buffer cache中被修改过但是还没有被写入到磁盘的block。

2、Hash Bucket的原理:
   
如果所有的Buffer Cache中所有的Buffer都通过同一个结构管理,当需要确定某个Block在Buffer中是否存在时,将需要遍历整个结构,性能会相当低下;   
为了提高效率,Oracle引入了Bucket的数据结构,Oracle把管理所有的Buffer通过一个内部的Hash算法运算后,存放到不同Hash Bucket中,这样通过Hash Bucket进行分割之后,众多的Buffer被分布到一定数量的Bucket之中,当用户需要在Buffer中定位数据是否存在是,只需要通过同样的算法获得Hash值,然后到相应的Bucket中查找少量的Buffer即可确定。每个Buffer存放的Bucket由Buffer的数据块地址运算决定;(这个算法从ORACLE官方得到的信息很少,可以用索引的知识去理解)Bucket内部,通过Cache Buffer Chain将所有的Buffer通过Buffer Header信息联系起来; 
为了保护Bucket中的数据,每次访问的时候都需要先在内存中获取latches后才能访问,整个访问的结构如图:深入理解latch: cache buffers chains 
用户内存中读数据的顺序:
a) 对该Block运用Hash算法,得到Hash值。
b)获得获得cache buffers chains latch

c) 到相应的Hash Bucket中搜寻相应Buffer Header
b)获得cache buffers chains latch;
d) 如果找到相应的Buffer Header,然后判断该Buffer的状态,看是否需要构造CR Block,或者Buffer处于pin的状态,最后读取。e) 如果找不到,就从磁盘读入到Buffer Cache中。

3、latch:cache buffers chains等待事件  
   
在Oracle9i以前,如果其它用户进程已经获得了这个latch,那么新的进程就必须等待,直到该用户进程搜索完毕(搜索完毕之后就会释放该latch)。从Oracle9i开始 cache buffers chains latch可以只读共享,也就是说用户进程A以只读(select)的方式访问Block,这个时候获得了该latch,同时用户进程B也以只读的方式访问Block,那么这个时候由于是只读的访问,用户进程B也可以获得该latch。但是,如果用户进程B要以独占的方式访问Block,那么用户进程B就会等待用户进程A释放该latch,这个时候Oracle就会对用户进程B标记一个latch:cache buffers chains的等待事件。

4、latch:cache buffers chains出现的原因
   
4.1 不够优化sql。   
大量逻辑读的SQL语句就有可能产生非常严重的latch:cache buffers chains等待,因为每次要访问一个block,就需要获得该latch,由于有大量的逻辑读,那么就增加了latch:cache buffers chains争用的机率。   对于正在运行的SQL语句,产生非常严重的latch:cache buffers chains争用,可以利用下面SQL查看执行计划,并设法优化SQL语句。
select * from table(dbms_xplan.display_cursor('sql_id',sql_child_number));   
如果SQL已经运行完毕,我们就看AWR报表里面的SQL Statistics->SQL ordered by Gets->Gets per Exec,试图优化这些SQL。

4.2热点块争用  
 1)查找数据库是否存在latch的争用
select sid,event,p1text,p1raw from v$session_wait where event='latch: cache buffers chains';   

2)下面查询查出Top 5 的争用的latch address。
select * from( select CHILD#,ADDR,GETS ,MISSES,SLEEPS from v$latch_children where name = 'cache buffers chains' and misses>0 and sleeps>0 order by 5 desc, 1, 2, 3) where rownum<6; 

3)然后利用下面查询找出Hot block。    
 select        e.owner ||'.'|| e.segment_name  segment_name,       e.extent_id  extent#,       x.dbablk - e.block_id + 1  block#,       x.tch, x.tim ,l.child#     from       v$latch_children  l,       x$bh  x,       dba_extents  e     where       x.hladdr  = '&ADDR' and       e.file_id = x.file# and       x.hladdr = l.addr and       x.dbablk between e.block_id and e.block_id + e.blocks -1     order by x.tch desc ;
       e.owner ||'.'|| e.segment_name  segment_name,       e.extent_id  extent#,       x.dbablk - e.block_id + 1  block#,       x.tch, x.tim ,l.child#     from       v$latch_children  l,       x$bh  x,       dba_extents  e     where       x.hladdr  = '&ADDR' and       e.file_id = x.file# and       x.hladdr = l.addr and       x.dbablk between e.block_id and e.block_id + e.blocks -1     order by x.tch desc ; 

4.3 Hash Bucket太少   需要更改_db_block_hash_buckets隐含参数。其实在Oracle9i之后,我们基本上不会遇到这个问题了,除非遇到Bug。所以这个是不推荐的,记住,在对Oracle的隐含参数做修改之前一定要咨询Oracle Support。 

5、latch:cache buffers chains的模拟测试
5.1 创建表
SQL> create table john (no int,object_name varchar2(50)); 

5.2  插入数据S
QL> declare i int;beginfor i in 1..5 loopinsert into john  select  rownum as no,object_name from dba_objects;end loop;end;/ 

5.3 创建存储过程SQL> create or replace procedure p_john isi int;icount int;beginfor i in 1..1000 loopselect count(*) into icount from john;end loop;end;/ 

5.4 模拟20并发全表扫描
SQL> var job_no number;S
QL> beginfor idx in 1..20 loopdbms_job.submit(:job_no,'p_john;');commit;end loop ;end;/ 

5.5查看争用情况
SQL> select sid,event,p1text,p1raw from v$session_wait where event='latch: cache buffers chains';深入理解latch: cache buffers chains
显示存大量的latch等待;

 5.6  latch: cache buffers chains等待事件在awr报告中的特征深入理解latch: cache buffers chains  

深入理解latch: cache buffers chains 

深入理解latch: cache buffers chains

深入理解latch: cache buffers chains 深入理解latch: cache buffers chains

总结以上的特征:
a)  占用大量的CPU资源;
b)  逻辑读比正常情况要多很多;
c)  等待事件里面肯定有latch: cache buffers chains
d)  Latch的命中率一般在95%以下,严重的在90%以下;

6、latch:cache buffers chains的个人解决方法很多时候应用的问题,其实是由于SQL质量导致的,很多DBA吐槽:DBA和开发是不同的部门,所以要让开发配合起来进行SQL调优难度较大,可行性较小。对于这种观点本人表示不赞同:当系统出现大的问题的时候,会导致系统性能下降,甚至宕机,那么如果这个系统重要的话,那么DBA完全可以把问题的原因及解决方法发送给开发人员,并抄送公司领导,并说明原因及解决的方法,由于这个时候DBA是唯一知道问题的根源及解决方法的,所以领导也会支持你的;另外:SQL调优是最有效的调优方法,建议DBA别从系统的角度去进行处理,避免填了一个坑又冒出一个坑;

 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

本文作者:JOHN

ORACLE技术博客:ORACLE 猎人笔记               数据库技术群:367875324 (请备注ORACLE管理 )  

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

您可能感兴趣的文档:

--结束END--

本文标题: 深入理解latch: cache buffers chains

本文链接: https://www.lsjlt.com/news/48025.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 深入理解latch: cache buffers chains
    事件背景:    一个客户的数据库发生了宕机事件,查看了数据库的awr报告,原来是由于出现大量的latch: cache buffers chains等待事件导致系统消耗量大量的CP...
    99+
    2022-10-18
  • latch cache buffers chains的解决步骤是什么
    今天就跟大家聊聊有关latch cache buffers chains的解决步骤是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 latch...
    99+
    2022-10-19
  • 深入理解MessageQueue
    MessageQueue是一种用于线程间通信的机制,可以将消息从一个线程传递到另一个线程。它主要由两部分组成:消息队列和消息循环。消...
    99+
    2023-09-28
    MessageQueue
  • 深入理解quilljs
    Quill.js是一个用于构建富文本编辑器的JavaScript库。它提供了许多强大的功能,使开发人员能够轻松地创建具有格式化文本、...
    99+
    2023-09-22
    quilljs
  • 深入理解JavaScriptCore
    动态化作为移动客户端技术的一个重要分支,一直是业界积极探索的方向。目前业界流行的动态化方案,如Facebook的React Native,阿里巴巴的Weex都采用了前端系的DSL方案,而它们在iOS系统上能够顺利的运行,都离不开一个背后的功...
    99+
    2023-06-03
  • PHP之深入学习Yii2缓存Cache组件详细讲解
    什么是缓存组件Cache 缓存是提升 Web 应用性能简便有效的方式。 通过将相对静态的数据存储到缓存并在收到请求时取回缓存, 应用程序便节省了每次重新生成这些数据所需的时间。 定...
    99+
    2022-11-12
  • HDFS原理深入理解
    1.HDFS概述   1)数据量越来越多,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,因此迫切需要一种系统来管理多台机器上的文件,这就       是分布式文件管理系统。 2)是一种允许...
    99+
    2017-01-26
    HDFS原理深入理解
  • android ListView深入理解
      在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。抽空把对ListView的使用做了整理,并写了个小例子...
    99+
    2022-06-06
    listview Android
  • 深入理解 Python yield
    yield的英文单词意思是生产,刚接触Python的时候感到非常困惑,一直没弄明白yield的用法。一直到稀里糊涂的看完了廖雪峰的python博客也没彻底明白。 有一次不小心看到了这个文章,是转载的,原文出自哪里我也不知道...
    99+
    2023-01-31
    Python yield
  • 深入理解 ceph mgr
    背景监控是管理的第一步,所以 ceph-mgr 目前的主要功能是把集群的一些指标暴露给外界使用。监控是什么东西呢?举个例子,例如用户访问网站 5xx 了,那么监控就是这么一个系统:采集网站 5xx 的个数,存起来,然后在 5xx 多的时候通...
    99+
    2023-06-04
  • MapReduce原理深入理解(一)
    1.MapReduce概念 1)MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题. 2)MapReduce是分布式运行的,由两个阶段组成:Map和Reduce,Map阶段是一个独立的程...
    99+
    2019-09-24
    MapReduce原理深入理解(一)
  • 深入理解React State 原理
    目录问题:setState 到底是同步还是异步的?类组件statesetState原理揭秘函数组件state问题:setState 到底是同步还是异步的? 如果对 React 底层有...
    99+
    2022-11-12
  • XML实体注入深入理解
    目录引文简介基础知识DTD内部DOCTYPE声明XML实体注入无回显XXE(BLIND XXE)读取任意文件探测内网端口命令执行dos拒绝服务例题结语引文 在平常的WEB渗透中,我们...
    99+
    2022-11-13
  • React深入了解原理
    目录VDOM(虚拟dom)Fiber架构初始化渲染更新时render阶段commit阶段VDOM(虚拟dom) react和vue都是基于vdom的前端框架。 web界面由DOM树来...
    99+
    2022-11-13
  • GosyncWaitGroup使用深入理解
    目录基本介绍使用源码分析AddDoneWait注意事项基本介绍 WaitGroup是go用来做任务编排的一个并发原语,它要解决的就是并发 - 等待的问题: 当有一个 goroutin...
    99+
    2022-11-11
  • 深入理解php中unset()
    目录概述变化情况情况一:情况二:情况三:概述 unset()经常会被用到,用于销毁指定的变量,但它有自己的行为模式,如果不仔细的话可能会被中文解释给迷惑: 先来看看官方文档的说法: ...
    99+
    2022-11-12
  • 深入理解MySQL索引
    前言 当提到MySQL数据库的时候,我们的脑海里会想起几个关键字:索引、事务、数据库锁等等,索引是MySQL的灵魂,是平时进行查询时的利器,也是面试中的重中之重。 可能你了解索引的底层是b+树,会加快查询,也会在表中建立索引,但这是远远不够...
    99+
    2017-02-27
    深入理解MySQL索引
  • 深入理解python协程
    目录一、什么是协程二、了解协程的过程2.1、yield工作原理2.2、预激协程的装饰器2.3、终止协程和异常处理2.4、让协程返回值2.5、yield from的使用2.6、yield from的意义三、greenl...
    99+
    2022-06-02
    python 协程
  • Spring之DI深入理解
    本篇内容主要讲解“Spring之DI深入理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring之DI深入理解”吧!DI概念IoC 其实有两种方式,一种就...
    99+
    2022-10-19
  • 怎样深入理解react
    这篇文章给大家介绍怎样深入理解react,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。理解ReactElement和ReactClass的概念首先让我们理解两个概念:ReactElem...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作