Latch cache buffers chains大约是Oracle中child latch数量最多,使用最为频繁的闩锁了。其子闩总数受到初始化参数(8i中的db_block_buffers/4)的影响,Oracle中有大量kernel函数有机会接手持有cache buffer chains latch:

col parent_name for a25

col location for a40

SELECT t1.ksllasnam "parent_name",

t2.ksllwnam "location"

FROM x$ksllw t2, x$kslwsc t1

WHERE t2.indx = t1.indx

AND ksllasnam = 'cache buffers chains';

parent_name location

------------------------- ----------------------------------------

cache buffers chains kcbw_activate_granule

cache buffers chains kcbw_first_buffer_free

cache buffers chains kcbwxb

cache buffers chains kcbw_examine_granule

cache buffers chains kcbw_next_free

cache buffers chains kcbw_first_buffer_free_2

cache buffers chains kcbbckb

cache buffers chains kcbbioe

cache buffers chains kcbbic1

cache buffers chains kcbbcwd

cache buffers chains kcbbxsv

parent_name location

------------------------- ----------------------------------------

cache buffers chains kcbbwdb

cache buffers chains kcbbic2

cache buffers chains kcbkzs

cache buffers chains kcbrmf2so

cache buffers chains kcbget: exchange rls

cache buffers chains kcbralloc

cache buffers chains kcbgcur: deadlock

cache buffers chains kcbgcur: buf pinned

cache buffers chains kcbgtcr

cache buffers chains kcbchg: no fast path

cache buffers chains kcbchg: apply change

parent_name location

------------------------- ----------------------------------------

cache buffers chains kcbrra: buf exists

cache buffers chains kcbrra: update buf flags

cache buffers chains kcbema: find buf

cache buffers chains kcbtema: find buf

cache buffers chains kcbget: prewarm wait

cache buffers chains kcbrfrebuf

cache buffers chains kcbsod1

cache buffers chains kcbrbrl

cache buffers chains kcbgcur: kslbegin

cache buffers chains kcbgtcr: kslbegin shared

cache buffers chains kcbrls: kslbegin

parent_name location

------------------------- ----------------------------------------

cache buffers chains kcbchg: kslbegin: bufs not pinned

cache buffers chains kcbchg: kslbegin: call CR func

cache buffers chains kcbnlc

cache buffers chains kcbget: exchange

cache buffers chains kcbget: pin buffer

cache buffers chains kcbnew: new latch again

cache buffers chains kcbgkcbcr

cache buffers chains kcbget: in cur_read

cache buffers chains kcbesc: escalate

cache buffers chains kcblbi

cache buffers chains kcbcge

parent_name location

------------------------- ----------------------------------------

cache buffers chains kcbfrl

cache buffers chains kcbzsc

cache buffers chains kcbibr

cache buffers chains kcbnew_1

cache buffers chains kcbema

cache buffers chains kcbsrbd

cache buffers chains kcbso1: set no access

cache buffers chains kcbtema

cache buffers chains kcbso1: in done_clr

cache buffers chains kcbsod2

cache buffers chains kcbzcg

parent_name location

------------------------- ----------------------------------------

cache buffers chains kcbzre1

cache buffers chains kcbrlb1

cache buffers chains kcbchkrsod

cache buffers chains kcbxbh

cache buffers chains kcbzsck

cache buffers chains kcbgtcr: fast path

cache buffers chains kcbgtcr: kslbegin excl

cache buffers chains kcbgtcrf

cache buffers chains kcbfdgd

cache buffers chains kcbdng

cache buffers chains kcbbufaddr2hdr

parent_name location

------------------------- ----------------------------------------

cache buffers chains kcbo_ivd_process

cache buffers chains kcbo_write_process

cache buffers chains kcbo_exam_buf

cache buffers chains kcb_pre_apply: kcbhq61

cache buffers chains kcb_post_apply: kcbhq62

cache buffers chains kcb_post_apply: kcbhq63

cache buffers chains kcbnew : new esc failed

cache buffers chains kcbesc : escalate failed

cache buffers chains kcb_private_owner

cache buffers chains kcb_is_private

cache buffers chains kcb_unprivatize

parent_name location

------------------------- ----------------------------------------

cache buffers chains kcb_restore_block_headers

cache buffers chains kcb_flush_undo_buffers

cache buffers chains kcbgcur - DEADL

cache buffers chains kcbtbd

cache buffers chains kcbzwc

cache buffers chains kcbzwx

cache buffers chains kcbrmflx

cache buffers chains kcbzwb

cache buffers chains kcbzgb: get latch after post

cache buffers chains kcbzgb: scan from tail. nowait

cache buffers chains kcbzgb: exit_loop

parent_name location

------------------------- ----------------------------------------

cache buffers chains kcbzib: multi-block read: nowait

cache buffers chains kcbzib: finish free bufs

cache buffers chains kcbzcb

cache buffers chains kcbzdh

cache buffers chains kcbdpr

cache buffers chains kcbcxx

cache buffers chains kcbzrn

cache buffers chains kcbdpd: for specific dba

cache buffers chains kcbdpd: dump all buffers

cache buffers chains kcbzib: exchange rls

cache buffers chains kcbzpnd: dump buffers

parent_name location

------------------------- ----------------------------------------

cache buffers chains kcbzhngcbk1: get hash chain latch no wai

t

cache buffers chains kcbo_cxx

cache buffers chains kcbz_check_obj_reuse_sanity

cache buffers chains kcbzib_grlk

cache buffers chains kcbz_force_maps

cache buffers chains kcbrldflx: recover in-flux bufs

cache buffers chains kcbra1fbuf: recover in-flux bufs

cache buffers chains kcbrafb: flashback bufs:1

cache buffers chains kcbrafb: flashback bufs:2

parent_name location

------------------------- ----------------------------------------

cache buffers chains kcbr_media_apply: find buffer

cache buffers chains kcbr_issue_read: alloc buffer

cache buffers chains kcbr_issue_read: retry alloc

cache buffers chains kcbr_validate_read: mark corrupt

cache buffers chains kcbr_apply_change: after apply

cache buffers chains kcbr_mapply_change

cache buffers chains kcbr_mrcv_clear_fgda

cache buffers chains kclwlr

cache buffers chains kclebs_1

cache buffers chains kclcls

cache buffers chains kclcsr_1

parent_name location

------------------------- ----------------------------------------

cache buffers chains kclpred

cache buffers chains kclcls_1

cache buffers chains kclple_1

cache buffers chains kclple_2

cache buffers chains kclcls_2

cache buffers chains kcllwr

cache buffers chains kclwcrs

cache buffers chains kclcrs_1

cache buffers chains kclcsr

cache buffers chains kclrls

cache buffers chains kclwcrs_1

parent_name location

------------------------- ----------------------------------------

cache buffers chains kclfbst_1

cache buffers chains kclpdc_1

cache buffers chains kclwcrs_2

cache buffers chains kclwcrs_3

cache buffers chains kclfpdb

cache buffers chains kclfpdb_2

cache buffers chains kclpdc_2

cache buffers chains kcllkopb

cache buffers chains kclgrantlk

cache buffers chains kclwrt

cache buffers chains kcllkopb_1

parent_name location

------------------------- ----------------------------------------

cache buffers chains kclwcrs_4

cache buffers chains kcllkopb_2

cache buffers chains kclcls_4

cache buffers chains kclpred_1

cache buffers chains kclrclr_2

cache buffers chains kclrecbst

cache buffers chains kclgrantlk_1

cache buffers chains kclcls_5

cache buffers chains kclrwrite_1

cache buffers chains kclrwrite_2

cache buffers chains kclcopy

parent_name location

------------------------- ----------------------------------------

cache buffers chains kclswrite

cache buffers chains kclchash

cache buffers chains kclcfusion

cache buffers chains kclfchk_1

cache buffers chains kclcfusion_1

cache buffers chains kclblkdone

cache buffers chains kclcfusion_2

cache buffers chains kclrenounce

cache buffers chains kclbla

cache buffers chains kclpto_1

cache buffers chains kclgrantlk_2

parent_name location

------------------------- ----------------------------------------

cache buffers chains kclcomplete

cache buffers chains kclshrshr

cache buffers chains kclclaim

cache buffers chains kclhngcbk1

cache buffers chains kclblkdone_1

cache buffers chains kclgvlk

cache buffers chains kclblkdone_2

cache buffers chains kclcclaim

cache buffers chains kclrechk_1

cache buffers chains kclrechk_2

cache buffers chains kclbr

parent_name location

------------------------- ----------------------------------------

cache buffers chains kclpto

cache buffers chains kclpdcl

cache buffers chains kclpdc_3

cache buffers chains kclpdc_4

cache buffers chains kclgcr_1

cache buffers chains kclcls_6

cache buffers chains kclevict

cache buffers chains kcldle

cache buffers chains kclrcopy

cache buffers chains kclenter

cache buffers chains kclrbast

parent_name location

------------------------- ----------------------------------------

cache buffers chains kclexpand

cache buffers chains kclcls_3

cache buffers chains kclverify

cache buffers chains kclaffinity

cache buffers chains kclassert

cache buffers chains kclobj

cache buffers chains kclobj_1

cache buffers chains kclobj_2

cache buffers chains kclgclk

cache buffers chains kclwcrs_5

cache buffers chains kclscrs

parent_name location

------------------------- ----------------------------------------

cache buffers chains kclstalepi

cache buffers chains kclstalepi_1

cache buffers chains kclstalepi_2

cache buffers chains kclgvlk_1

cache buffers chains kclgclk_1

cache buffers chains kclgclk_2

cache buffers chains kclcsr_2

cache buffers chains kcbvm

204 rows selected.

我们一般认为Latch结构是Mostly exclusive access的,也就是极少会有共享访问闩的机会。但Oracle一般对外宣称读取数据时服务进程是以共享模式使用cache buffers chains闩,这就造成了许多人误以为读读是不会出现latch: cache buffers chains争用的。

但是实际上查询语句大部分情况下仍需要以exclusive模式持有该类子闩(有时会以SHARED模式持有,这取决于读取时是使用kcbgtcr: kslbegin shared还是kcbgtcr: kslbegin excl;kcbgtcr是Oracle rdbms中重要的获取一致性读的函数,其含义为Kernal Cache Buffer GeT Cosistents Read,显然该函数存在两种获取cache buffers chains的方式即kslbegin shared和excl。与之相对应的是kcbgcur: kslbegin,kcbgcur的含义为Kernel Cache Buffer Get Current,该函数用以获取当前块以便修改,也就是"写";很显然kcbgcur: kslbegin函数只有以excl排他方式持有child cache buffers chains latch的必要),原因在于虽然是查询语句但同样需要修改buffer header结构,譬如修改tch抢手度、holder list的hash变量us_nxt、us_prv以及waiter list的hash变量wa_prv、wa_nxt等。换而言之读读是会引起Latch free:cache buffers chains等待的,而非许多人认为的仅有读写、写写会导致缓存链闩争用。

这个问题我们再用实验证明一遍:

SQL> drop table maclean;

drop table maclean

*

ERROR at line 1:

ORA-00942: table or view does not exist

SQL> create table maclean tablespace users as select * from dba_objects;

Table created.

SQL> select count(*) from maclean;

COUNT(*)

----------

51944

SQL> /

COUNT(*)

----------

51944

SQL> /

COUNT(*)

----------

51944

SQL> select spid from v$process where addr =(select paddr from v$session where sid=(select distinct sid from v$mystat));

SPID

------------

6023

另开一个命令行窗口:

[maclean@rh2 ~]$ gdb $ORACLE_HOME/bin/oracle 6023

GNU gdb (GDB) Red Hat Enterprise Linux (7.0.1-23.el5)

Copyright (C) 2009 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law. Type "show copying"

and "show warranty" for details.

This GDB was configured as "x86_64-redhat-linux-gnu".

For bug reporting instructions, please see:

...

Reading symbols from /s01/10gdb/bin/oracle...(no debugging symbols found)...done.

Attaching to program: /s01/10gdb/bin/oracle, process 6023

Reading symbols from /s01/10gdb/lib/libskgxp10.so...(no debugging symbols found)...done.

Loaded symbols for /s01/10gdb/lib/libskgxp10.so

Reading symbols from /s01/10gdb/lib/libhasgen10.so...(no debugging symbols found)...done.

Loaded symbols for /s01/10gdb/lib/libhasgen10.so

Reading symbols from /s01/10gdb/lib/libskgxn2.so...(no debugging symbols found)...done.

Loaded symbols for /s01/10gdb/lib/libskgxn2.so

Reading symbols from /s01/10gdb/lib/libocr10.so...(no debugging symbols found)...done.

Loaded symbols for /s01/10gdb/lib/libocr10.so

Reading symbols from /s01/10gdb/lib/libocrb10.so...(no debugging symbols found)...done.

Loaded symbols for /s01/10gdb/lib/libocrb10.so

Reading symbols from /s01/10gdb/lib/libocrutl10.so...(no debugging symbols found)...done.

Loaded symbols for /s01/10gdb/lib/libocrutl10.so

Reading symbols from /s01/10gdb/lib/libjox10.so...(no debugging symbols found)...done.

Loaded symbols for /s01/10gdb/lib/libjox10.so

Reading symbols from /s01/10gdb/lib/libclsra10.so...(no debugging symbols found)...done.

Loaded symbols for /s01/10gdb/lib/libclsra10.so

Reading symbols from /s01/10gdb/lib/libdbcfg10.so...(no debugging symbols found)...done.

Loaded symbols for /s01/10gdb/lib/libdbcfg10.so

Reading symbols from /s01/10gdb/lib/libnnz10.so...(no debugging symbols found)...done.

Loaded symbols for /s01/10gdb/lib/libnnz10.so

Reading symbols from /usr/lib64/libaio.so.1...(no debugging symbols found)...done.

Loaded symbols for /usr/lib64/libaio.so.1

Reading symbols from /lib64/libdl.so.2...(no debugging symbols found)...done.

Loaded symbols for /lib64/libdl.so.2

Reading symbols from /lib64/libm.so.6...(no debugging symbols found)...done.

Loaded symbols for /lib64/libm.so.6

Reading symbols from /lib64/libpthread.so.0...(no debugging symbols found)...done.

[Thread debugging using libthread_db enabled]

Loaded symbols for /lib64/libpthread.so.0

Reading symbols from /lib64/libnsl.so.1...(no debugging symbols found)...done.

Loaded symbols for /lib64/libnsl.so.1

Reading symbols from /lib64/libc.so.6...(no debugging symbols found)...done.

Loaded symbols for /lib64/libc.so.6

Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.

Loaded symbols for /lib64/ld-linux-x86-64.so.2

0x00000039f280d8e0 in __read_nocancel () from /lib64/libpthread.so.0

(gdb) break kcbgtcr

Breakpoint 1 at 0x108c72c

回到原sqlplus窗口再次执行查询语句,会hang住:

SQL> select count(*) from maclean;

在gdb窗口:

(gdb) break kslfre

Breakpoint 2 at 0x7a133c

Breakpoint 1, 0x000000000108c72c in kcbgtcr ()

(gdb) c

Continuing.

Breakpoint 1, 0x000000000108c72c in kcbgtcr ()

(gdb) c

Continuing.

Breakpoint 1, 0x000000000108c72c in kcbgtcr ()

(gdb) c

Continuing.

Breakpoint 2, 0x00000000007a133c in kslfre ()

(gdb) c

Continuing.

多次continue直到出现kslfre内核函数,开一个新的sqlplus窗口:

SQL> set autotrace on;

SQL> select count(*) from v$latchholder;

COUNT(*)

----------

3

Execution Plan

----------------------------------------------------------

Plan hash value: 1575818826

--------------------------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |

--------------------------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | 13 | 0 (0)| 00:00:01 |

| 1 | SORT AGGREGATE | | 1 | 13 | | |

|* 2 | FIXED TABLE FULL| X$KSUPRLAT | 1 | 13 | 0 (0)| 00:00:01 |

--------------------------------------------------------------------------------

v$latchholder的数据来源于X$KSUPRLAT内部视图,因为v$latchholder不带mode字段,所以我们直接观察X$KSUPRLAT

SQL> select KSUPRLAT "address",KSUPRLNM "name",KSUPRLMD "mode" from X$KSUPRLAT;

address name mode

---------------- ------------------------- ---------------

00000000FCE40040 cache buffers chains EXCLUSIVE

00000000FA696978 simulator lru latch EXCLUSIVE

00000000FA6CDCE0 simulator hash latch EXCLUSIVE

/* 可以看到即便是查询语句也是以EXCLUSIVE mode持有child cache buffers chains latch */

(gdb) quit

A debugging session is active.

Inferior 1 [process 6235] will be detached.

Quit anyway? (y or n) y

Detaching from program: /s01/10gdb/bin/oracle, process 6235

/* 可以通过以下statistics可以看到以上读取为纯粹的逻辑读,没有物理读取的部分干扰*/

Statistics

----------------------------------------------------------

0 recursive calls

0 db block gets

719 consistent gets

0 physical reads

0 redo size

517 bytes sent via SQL*Net to client

492 bytes received via SQL*Net from client

2 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

1 rows processed

mysql闩_Oracle闩:Cache Buffers chains相关推荐

  1. 深入理解latch: cache buffers chains

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

  2. 深入理解 latch: cache buffers chains

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

  3. oracle数据库latch,关于Oracle数据库latch: cache buffers chains等待事件

    关于Oracle数据库latch: cache buffers chains等待事件 latch: cache buffers chains等待事件的原理 当一个数据块读入到sga中时,该块的块头(b ...

  4. latch: cache buffers chains故障处理总结

    客户说数据库的CPU使用率为100%,应用相应迟缓. 发现是latch: cache buffers chains 作祟 故障分析思路 查看等待事件,判断故障起因 1 SQL>select * ...

  5. Oracle latch: cache buffers chains

    buffer cache深度分析之buffer cache的优化 buffer cache的等待事件     与buffer cache相关的等待事件包括:latch free.buffer busy ...

  6. latch: cache buffers chains 阻塞 buffer busy waits

    os: centos 7.4 db: oracle 11.2.0.4 版本 # cat /etc/centos-release CentOS Linux release 7.4.1708 (Core) ...

  7. Oracle等待事件(一)—— latch cache buffers chains 分析与优化思路

    一. 什么是CBC等待 首先我们需要知道CBC等待发生在哪里,为什么会发生,才能理解应该如何定位,如何处理. 首先,CBC latch是用于保护buffer cache的,因此CBC等待一定发生在bu ...

  8. oracle中的latch: cache buffers chains 与热块

    oracle中的latch: cache buffers chains 与热块 oracle中的latch: cache buffers chains 与热块 ORACLE中的buffer cache ...

  9. latch:cache buffers chains

    1.产生原理 当一个数据块读入到sga中时,该块的块头(buffer header)会放置在一个hash bucket的链表(hash chain)中.该内存结构由一系列cache buffers c ...

最新文章

  1. 自动驾驶发展调查:产业化还需技术“破冰”
  2. android 生成签名命令
  3. Ubuntu安装rabbitMQ及单机版rabbitMQ集群配置
  4. 工信部部长苗圩于CITE发表致辞,指引三个方向推动国内电子信息产业持续发展...
  5. Python: tkinter实例改名小工具
  6. [cocos2d]修改富文本文本和高度
  7. P3193-[HNOI2008]GT考试【KMP,dp,矩阵乘法】
  8. java 方法重载调用_Java方法的定义以及调用、方法重载、可变参数以及递归
  9. Python——格式转换的学习笔记
  10. 【软件工程】几种模型概念:瀑布模型,快速原型模型,增量模型,螺旋模型,喷泉模型
  11. python动态变量名以及调用_Python 动态变量名与调用介绍
  12. IS-IS详解(七)——IS-IS LSP报文详解
  13. 谈谈VIP漂移那点破事
  14. c语言ntc程序,NTC热敏电阻程序.doc
  15. macbook重装系统 选择方案_Mac如何重装系统?mac重装系统教程
  16. 手机安全卫士(四)----- Splash界面
  17. 花呗部分用户已接入央行征信系统,快看你被选中了没?
  18. inet_aton函数
  19. 7-4 Swan学院社团招新 (20 分)
  20. ios企业版如果证书过期了_iOS 企业证书过期填坑记

热门文章

  1. 用jQuery控制checkbox
  2. vmware不能resume问题,Collect Support Data,vmware.log
  3. android Gallery实现异步加载网络图片
  4. AndroidICS4.0----LockScreen锁屏流程【Android源码解析九】
  5. 助力南京打造创新名城 第三届未来网络发展大会将召开
  6. windows下搭建SSH隧道内网映射
  7. Backup and Recovery Basics1
  8. web页面防盗链功能使用--request.getHeader(Referer)
  9. Java二叉排序树(转)
  10. 深入理解Linux系统中的用户和组账号