楼主: 宋夕夕

[精华] latch争用的讨论分析

[复制链接]
论坛徽章:
9
蜘蛛蛋
日期:2011-12-28 14:46:28ITPUB季度 技术新星
日期:2012-05-22 15:10:11蛋疼蛋
日期:2012-05-28 16:48:46蜘蛛蛋
日期:2012-05-28 16:54:09茶鸡蛋
日期:2012-05-28 17:27:32双黄蛋
日期:2012-05-28 17:45:17迷宫蛋
日期:2012-05-29 10:49:35蛋疼蛋
日期:2012-06-04 17:13:15优秀写手
日期:2013-12-18 09:29:11
21#
 楼主| 发表于 2012-2-16 11:08 | 只看该作者
       有关的v$latch说的有异议的地方,大家可以提出来,大家可以看看http://docs.oracle.com/html/E25513_01/dynviews_2015.htm官方有关定义说明,想要理清v$latch,还要很多要去探求比如v$latch_parent,v$latch_children....大家要学会各个版本综合看待!最终要的我们理解起多版本思路及用意,比如,latch机制当中有自转机制,通过_spin_count来实现,当然并不是所有的都是要自转,毕竟有些是长时间的latch,有短时间的latch,如果只设置一个_spin_count的话会对系统中的所有latch造成影响。所以我们要进行分类针对latch,我们可以通过牺牲CPU,来换取等待时间的减少,高_spin_count值可以降低sleeps和misses的次数,代价是花费更多cpu时间.内部视图x$ksllclass (kernel serverice lock latches class)包含了latch的所有八种类型的信息。其中indx列就是latch类型编号。当然当CPU比较紧张的情况下,建议不要修改_spin_count.所有的这一切又回到了性能方面,那我们怎样考虑latch的性能呢?
       我们可以通过misses/(simple_gets+misses),来获得latch丢失率,如果丢失率是0,那就是最完美的吧,就是每次都可以及时申请到latch,那如果发现了旋转,怎么样来判断旋转的性能呢?SPIN方式性能指标: _SPIN_COUNT * sleeps / misses,这个公式我还是来解释下:比如,我第2次休眠的时候才命中,那么是不是以为这有2次自转都没成功?sleeps=2,_SPIN_COUNT=2000,misses=1,也就是失败1次,来回做了4000次,sleeps / misses越小越好。首次失败后第1轮spin就能spin gets,那么sleeps就为0,这样sleeps / misse也会越小,可以衡量spin需要的轮次和成本。记住:sleeps / misse> 5%性能有问题,睡眠会影响数据库的性能。也就是至少95是第1轮spin就能spin gets,如果v$latch 命令显示的SLEEPS 列的值很高,应该增加SPIN_COUNT的值来延长进程的空转时间。空转的时间越长,锁被释放并被进程获得的机会越大。这可以避免空转的进程频繁地睡眠,以减少发生SLEEPS的次数。注意,通过增加   SPIN_COUNT值,就是增大CPU时间开销来提高锁的性能。在一个CPU能力有限的系统中,这种方法显然不可取。而在一个CPU能力没有充分发挥的系统中,这种方法是很好的,可以减少SLEEPS的次数,有助于性能的提高。哈,写累了,下午有时间在分享吧。。




使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
20
祖国60周年纪念徽章
日期:2009-10-09 08:28:00数据库板块每日发贴之星
日期:2011-02-20 01:01:01ITPUB季度 技术新星
日期:2011-04-02 10:31:09ITPUB十周年纪念徽章
日期:2011-11-01 16:24:042012新春纪念徽章
日期:2012-01-04 11:54:26玉石琵琶
日期:2012-02-21 15:04:38最佳人气徽章
日期:2012-03-13 17:39:18ITPUB 11周年纪念徽章
日期:2012-10-09 18:09:192013年新春福章
日期:2013-02-25 14:51:242011新春纪念徽章
日期:2011-02-18 11:43:33
22#
发表于 2012-2-16 12:15 | 只看该作者
10g 已经出现metux了 11g里面体现更为明显

使用道具 举报

回复
论坛徽章:
39
开发板块每日发贴之星
日期:2005-04-29 01:02:052011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-02-18 11:43:33管理团队成员
日期:2011-05-07 01:45:08ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:18
23#
发表于 2012-2-16 14:09 | 只看该作者
潜心研究

使用道具 举报

回复
论坛徽章:
9
2012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-07 09:59:35茶鸡蛋
日期:2012-02-16 14:26:00ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:322013年新春福章
日期:2013-02-25 14:51:24ITPUB社区12周年站庆徽章
日期:2013-08-22 17:29:07优秀写手
日期:2014-03-20 06:00:36慢羊羊
日期:2015-03-04 14:19:442015年新春福章
日期:2015-03-06 11:57:31
24#
发表于 2012-2-16 14:29 | 只看该作者
支持楼主

使用道具 举报

回复
论坛徽章:
5
ITPUB9周年纪念徽章
日期:2010-10-08 09:31:212011新春纪念徽章
日期:2011-02-18 11:42:49ITPUB十周年纪念徽章
日期:2011-11-01 16:25:512012新春纪念徽章
日期:2012-01-04 11:56:44咸鸭蛋
日期:2012-03-31 11:58:37
25#
发表于 2012-2-16 16:49 | 只看该作者
获取latch失败不马上进入睡眠有两个原因,第一:期待其他进程在短时间内释放latch;第二:因为陷入睡眠状态,在OS层面上会发生context switching,这部分的资源消耗比起使用较少的CPU进行自旋更多

使用道具 举报

回复
论坛徽章:
5
2012新春纪念徽章
日期:2012-01-04 11:57:56ITPUB 11周年纪念徽章
日期:2012-10-09 18:16:002013年新春福章
日期:2013-02-25 14:51:24灰彻蛋
日期:2013-05-14 10:07:52迷宫蛋
日期:2013-07-01 15:56:27
26#
发表于 2012-2-16 16:57 | 只看该作者
宋夕夕 发表于 2012-2-16 09:46
嗯,这个应该不是这么计算的,首先要熟悉v$latch内sleeps和sleep1,sleep2,sleep3......sleep11他们的区别 ...

恩,补充一下,gets,miss是以will to wait的方式获取latch成功/失败的次数,spin_gets是在获取到latch前spin周转的次数(不包括sleeps的次数)

使用道具 举报

回复
论坛徽章:
9
蜘蛛蛋
日期:2011-12-28 14:46:28ITPUB季度 技术新星
日期:2012-05-22 15:10:11蛋疼蛋
日期:2012-05-28 16:48:46蜘蛛蛋
日期:2012-05-28 16:54:09茶鸡蛋
日期:2012-05-28 17:27:32双黄蛋
日期:2012-05-28 17:45:17迷宫蛋
日期:2012-05-29 10:49:35蛋疼蛋
日期:2012-06-04 17:13:15优秀写手
日期:2013-12-18 09:29:11
27#
 楼主| 发表于 2012-2-16 17:15 | 只看该作者
qdddd123 发表于 2012-2-16 16:57
恩,补充一下,gets,miss是以will to wait的方式获取latch成功/失败的次数,spin_gets是在获取到latch前 ...

呵呵,willing-to-wait是进程获取latch推荐的方式,就是说进程原意等待获取latch,有_SPIN_COUNT  = 2000次(CPU数>1),该参数是获取LATCH时旋转一轮的次数。如果第一次获取不成功,则CPU旋转2000次,直到获取为止,并记录miss(丢失次数)。如果在2000次旋转内获取LATCH,则记入GETS。只有最终获得LATCH都会记入GETS。如果是旋转期间获得LATCH,则记入SPIN_GETS。如果在第一次获取就成功,则不需要旋转,不记入miss(丢失),同时也记入GETS,这个就是前面我说的simple gets.
simple gets = gets – misses = 首次就获取latch的次数且没有参与spin.呵呵,大概就是这样的吧!有不同理解请说明下。

使用道具 举报

回复
论坛徽章:
9
蜘蛛蛋
日期:2011-12-28 14:46:28ITPUB季度 技术新星
日期:2012-05-22 15:10:11蛋疼蛋
日期:2012-05-28 16:48:46蜘蛛蛋
日期:2012-05-28 16:54:09茶鸡蛋
日期:2012-05-28 17:27:32双黄蛋
日期:2012-05-28 17:45:17迷宫蛋
日期:2012-05-29 10:49:35蛋疼蛋
日期:2012-06-04 17:13:15优秀写手
日期:2013-12-18 09:29:11
28#
 楼主| 发表于 2012-2-16 17:47 | 只看该作者
谢谢各位的支持,估计这个话题讨论的不大理想,有时间我会在开BUFFER CACHE内部机制的话题,讨论下内部机制原理,以及我们优化的手段和策略!

使用道具 举报

回复
论坛徽章:
9
蜘蛛蛋
日期:2011-12-28 14:46:28ITPUB季度 技术新星
日期:2012-05-22 15:10:11蛋疼蛋
日期:2012-05-28 16:48:46蜘蛛蛋
日期:2012-05-28 16:54:09茶鸡蛋
日期:2012-05-28 17:27:32双黄蛋
日期:2012-05-28 17:45:17迷宫蛋
日期:2012-05-29 10:49:35蛋疼蛋
日期:2012-06-04 17:13:15优秀写手
日期:2013-12-18 09:29:11
29#
 楼主| 发表于 2012-2-17 11:10 | 只看该作者
哦,对了,忘记说说latch结构了,知其然,还要知其所以然。一般来说,latch由三种内存元素组成:pid(进程id),内存地址和内存长度。当然,在同一时刻只允许一个进程修改latch和lock它们本身的数据结构是必须的。对latches来说这是简单的。因为每一个latch仅仅有一个内存位置,不象lock还有很多模式信息,获取了latch,就获取了latch对应的内存资源。Oracle能用硬件下原子指令设置如TEST,SET,LOAD,CLEAR,COMPARE和SWAP来对latch结构进行操作。也就是通过基本的原子操作对LATCH结构进行操作,就可以完成获取和释放功能。因为这是简单的保证原子的机器指令,没有其他锁结构被需要,所以latch的操作是很高效率的。Oracle锁的数据结构,有几部分,所以不能被自动修改。由于这种原因,Oracle用latches保护在锁上的操作。这种latch多样化的使用依靠锁的类型。
     例如, the library cache locks间接的被the library cache latches保护。
     the cache buffer locks间接的被the cache buffers chains latches保护。  
     the row cache enqueue locks被the row cache objects latch保护。
     因为latches是很有效的,所以比起lock和latch组合,Oracle宁愿用一个latch来保护那些间歇的、暂时的数据结构。像library cache,需要latch和lock,pin进行组合来保护,如果latch不可用,那么将记录latch释放失败。

使用道具 举报

回复
论坛徽章:
1
ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:07
30#
发表于 2012-10-17 10:29 | 只看该作者
我只能表示  我还是看不太懂

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表