什么是latch以及如何导致latch争用
2. latch和enqueue的对比
3. 何时需要获得latch
4. latch请求模式
5. 什么原因导致latch争用
6. 如何确认内部latch的争用
7. 检查latch信息的SQL脚本
8. 列出所有的latch
9. 列出DBA需要关心的latch
10. 调整 _SPIN_COUNT参数(在Oracle7中是 _LATCH_SPIN_COUNT)
1. 什么是latch
latch是一种低级的序列化机制,用于保护SGA中的共享数据结构。依靠系统来操作latch的执行,尤其是关于一个进程是否需要等待latch以及需要等待多久。
latch锁的特点是它的请求和释放都很快。latch主要目的是为了避免多个进程在某一时刻执行了相同的代码片段。当一个进程僵死长时间持有latch,latch就会调用清除程序。latch有关联级别,用于防止死锁。一旦一个进程在某一级别请求了latch,后续的进程不能请求相同级别或更低级别的latch(除非用nowait方式请求)。
enqueue是ORACLE另一种类型的锁机制。enqueue具有更复杂的机制,可以允许多个并发进行在不同程度上共享已知的资源。任何一个对象在并发使用时,都被enqueue保护。它的一个好处,例如在表上加锁,允许多种级别共享表。例如2个进程可以同时用share mode锁表,或share update mode方式锁表。
latch和enqueue的第一个不同是,enqueue是通过OS特殊的锁机制来获得。enqueue允许用户在请求锁时将请求模式储存到锁中。如果进程请求的锁的mode与锁上的mode互斥,则不能获得该锁,该请求需要等待。OS将请求进程放到一个等待队列中,该队列是先进先出的。
latch和enqueue的另一个不同是,latch没有像enqueue那样的等待队列,latch等待通过时间器调度被唤醒,再次尝试请求或spin(只在多处理器环境中)。如果所有的等待者都同时再次尝试请求(依赖于调度器),任何一个都可能获得latch,所以有可能会造成,最早请求latch的进程最后获得该latch。
一个进程需要在SGA(System Global Area)的某个数据结构中运行时,需要请求latch。在该数据结构中执行的这段时间,都持有该latch。当进程在该数据结构中执行完成之后,删除该latch。每个latch都保护了不同的数据结构,通过latch名来识别。
Oracle使用原子指令,类似测试并置位操作(test and set),对latch进行操作。如果latch被其他进程获得,那么本次请求的进程就需要等待该latch的释放。例如redo分配latch、copy latch,归档控制latch等。其基本思路是为了阻止并发。由于指令设置和释放latch是原子的,OS就可以确保只有1个进程获得到latch。因为只有1条指令,所以执行相当快。在latch持有时,会有一个很短暂的时间提供一个清理机制,预防持有进程僵死但仍然持有latch。latch清理将由PMON进程服务完成。
latch请求有2中模式:"愿意等待"或"不等待"("willing-to-wait" or "no wait")。通常,latch在"愿意等待"模式中请求。"愿意等待"模式中的请求将不断循环等待直到获得了该latch。当进程使用"不等待"模式请求latch时,如果该latch不可用,不是等待该latch,而是请求另一个latch。只有所有请求都失败时,服务进程才会等待。
"不等待"的latch有,redo copy latch。
5. 什么原因导致latch争用
如果需要的latch正在被其他占用,进程将再次尝试spin,如果仍然无法获得,再次spin,该循环请求的最大次数由初始化参数_SPIN_COUNT决定。如果在整个循环完成之后,latch仍然不可获得,进程必须交出CPU时间片,进入sleep,初始化sleep时间为1厘秒,之后每次sleep时间为上次的2倍。
这将引起系统缓慢,因为增加了额外的CPU使用,直到latch有效。进程spinning的后果就是CPU的使用,spinning表示进程在sleep一段间隔后唤醒并检查latch是否有效。
6. 如何确认内部latch的争用
查询相关的数据字典视图:
V$LATCH
V$LATCHHOLDER
V$LATCHNAME
V$LATCH的关键信息:
-----------------------
GETS "愿意等待"模式下请求获得latch,成功的次数。
MISSES "愿意等待"模式下请求获得latch,首次失败的次数。
SLEEPS "愿意等待"模式下请求获得latch,在首次请求之后等待的次数。
IMMEDIATE_GETS 每个latch立即请求成功的次数
IMMEDIATE_MISSES 每个latch立即请求失败的次数
-----------------------
可用下面的公式计算latch命中率:
"愿意等待"模式:命中率=(GETS-MISSES)/GETS
"不等待"模式:命中率=(IMMEDIATE_GETS-IMMEDIATE_MISSES)/IMMEDIATE_GETS
** 显示系统级的latch统计信息
*/
column name format A32 truncate heading "LATCH NAME"
column pid heading "HOLDER PID"
select c.name,a.addr,a.gets,a.misses,a.sleeps,
a.immediate_gets,a.immediate_misses,b.pid
from v$latch a, v$latchholder b, v$latchname c
where a.addr = b.laddr(+)
and a.latch# = c.latch#
order by a.latch#;
/*
** 通过latch地址找到latch名称
*/
column name format a64 heading 'Name'
select a.name from v$latchname a, v$latch b
where b.addr = '&addr'
and b.latch#=a.latch#;
** 显示指定名称的latch统计
*/
column name format a32 heading 'LATCH NAME'
column pid heading 'HOLDER PID'
select c.name,a.addr,a.gets,a.misses,a.sleeps,
a.immediate_gets,a.immediate_misses,b.pid
from v$latch a, v$latchholder b, v$latchname c
where a.addr = b.laddr(+) and a.latch# = c.latch#
and c.name like '&latch_name%' order by a.latch#;
select latch#, name from v$latchname;
9. 列出DBA需要关心的latch
该latch在buffer cache中的数据块被访问(pinned)时获得。
减少cache buffer chains latch的争用,首先通常是减少逻辑IO的比率,例如优化SQL减少所需的逻辑读。I/O可能频繁发生在热块上(该块被频繁访问)。
Cache buffers LRU chain latch:
cache buffer lru chain latch请求发生在,想把一个新数据块放到buffer cache中的同时buffer正在往磁盘写回,尤其是尝试在buffer cache中扫描LRU(least recently used) chain中包含的脏数据。
Library cache latch用来保护共享池中library cache cache的SQL语句以及对象定义。当增加一个新的语句到library cache中是请求该latch,在解析过程中,Oracle先找寻library cache中是否有匹配语句,如果没有找到,Oracle将解析该语句,获得Library cache latch并插入新的SQL语句。
减少该latch争用,首先应考虑应用中的SQL语句可以重用,尽可能地在应用中使用绑定变量。频繁地解析SQL,不但会造成该latch的miss增多,同时也增加了解析的CPU开销。如果应用使用Library cache使用不当,即使增大了共享池,仍然会有严重的latch争用。
隐含参数 _KGL_LATCH_COUNT控制了Library cache latch的数量。通常该默认值都足够大,除非Library cache latch争用得厉害,需要手动调整该参数,可以适当增大该值。_KGL_LATCH_COUNT该参数默认是在CPU_COUNT值之后最大的质数,该值不能超过66。
Library cache pin latch:
当library cache中的语句被重复执行时请求该latch,高频率地执行相同的SQL会造成miss。少量减少Library cache pin latch的方法,可以使用私有同义词代替公有同义词,使用直接对象名称,如OWNER.TABLE。
Shared pool latch用来保护重要的操作,在共享池中分配和释放内存。如果应用使用文字SQL(不共享),那么可能会由于该latch受限,影响吞吐量。新的SQL语句的解析需要消耗额外的CPU,以及造成library cache和shared pool latch的多次请求和释放。在ORACLE9之前,整个数据库只有一个这类的latch保护library cache分配内存,从ORACLE9起,有多个子latch,减缓了对该资源的争用。
减少shared pool latch的一种方法是尽可能地避免硬解析,只解析1次,执行多次。不使用全文本SQL(没有绑定变量)也可以有效避免Shared pool latch,共享池的大小,以及MTS的使用,对Shared pool latch都有较大影响。
参看 Note 62143.1 检查和解决共享池和Shared pool latch的问题。
当进程尝试访问cached的数据字典值时会产生该latch。通常该latch不会造成争用,唯一减少该latch争用的方法是增大共享池大小。
_SPIN_COUNT参数控制了进程在未获得latch之前尝试多少次之后进入sleep。基本意思就是在获得CPU时间片时,反复循环尝试获得latch,直到_SPIN_COUNT次数还没获得就进入sleep。如果在一个单CPU的系统中,Oracle尝试再次请求latch,但是CPU被其他进程持有,那么其他进程会短暂地进入sleep,让该进程尝试获得latch。然而,在多处理器系统(SMP)中,可能其他进程在其他CPU的时间片上持有了该latch,等待他们在之后的指令中释放(通常latch的持有是非常短暂的)。
总结latch的sleep和spin的次数,如果存在latch争用,而且CPU资源较多的情况,考虑增大_SPIN_COUNT,如果CPU资源满负荷,考虑减小_SPIN_COUNT。
什么是latch以及如何导致latch争用相关推荐
- oracle数据库latch,关于Oracle数据库latch: cache buffers chains等待事件
关于Oracle数据库latch: cache buffers chains等待事件 latch: cache buffers chains等待事件的原理 当一个数据块读入到sga中时,该块的块头(b ...
- ORACLE 索引并行引起的direct path read temp和latch free等待导致进程数超过最大数
2016年10月27日下午,测试同事说测试数据库连接不上了,让我们DBA查看问题并解决一下. 操作系统:Red Hat Enterprise Linux Server release 6.6 ( ...
- latch: cache buffers chains latch: ges resource hash list
深入理解latch: cache buffers chains
- latch:cache buffers chains等待事件导致的latch争用的原理原因与检查
latch:cache buffers chains 原理 当一个数据块读入到sga中时,该块的块头(buffer header)会放置在一个hash bucket的链表(hash chain)中.该 ...
- Latch free等待事件
原文:oracle waitinterface-a practical guide to performance diagnostics & tuning Richmond shee Kirt ...
- oracle 闩锁(latch)概述
这是在网上看到的一篇文章,感觉这个知识点挺重要的,特地分享出来. Oracle数据库使用闩锁来管理内存的分配和释放.假设,某个用户进程(假设其为A)发出一条update语句,要去更新58号数据 ...
- 闩锁(latch)概述
第10章 闩锁.锁定和并发性数据库系统本身是一个多用户并发处理系统,在同一个时间点上,可能会有多个用户同时操作数据库.这里就涉及两个很重要的问题.这些用户之间的操作不会互相破坏.比如两个用户同时在相同 ...
- 锁 死锁 阻塞 Latch 等待 详解
锁这东西是纯概念性的东西,但是作用又非常大.以前整理过两篇文章,今天又看了点书,觉得还不是很清楚.就重新整理了下.在想要不要把以前的文章删掉,这样在blog里是比较简介的,但后来又一想.这些连接在其他 ...
- 11.Verilog中如何避免Latch
FPGA教程目录 MATLAB教程目录 -------------------------------------------------------------------------------- ...
- oracle中lock和latch的用途
本文向各位阐述Oracle的Latch机制,Latch,用金山词霸翻译是门插栓,闭锁,专业术语叫锁存器,我开始接触时就不大明白为什么不写Lock,不都是锁吗?只是翻译不同而以?研究过后才知道两者有很大 ...
最新文章
- 在32位Ubuntu 10.04上编译Android 2.3
- MySQL数据表的创建、查看、插入
- 变分模态分解_Android小部件示例中的模态对话框(弹出)
- HQL的使用和limit的替代
- cdf2rdf--复对角矩阵转化为实对角矩阵
- 查看oracle 的数据文件的版本信息
- 文本字符串中提取数据进行分析
- html post前md5加密,post提交及MD5加密
- opencv-api erode
- 在 Vue 项目中引入 tinymce 富文本编辑器
- abb机器人过载报错_ABB机器人驱动模块温度警告及保养方案简介
- word2013论文公式居中并且自动编号
- app推送-极光推送
- 哈利波特英文单词统计频率
- WORD2013使用技巧——调整序号中制表位的大小
- JavaScript高级编程(一)——基本概念
- 允许在CAD中操作超链接!Aspose.CAD最新版v19.9新功能你都了解吗?
- 推荐十三本书,附豆瓣评分
- OrCad 与PADS9.5关联
- Shell之sed命令