有木有关于全体同志任职文件如何下能分享下GR2的LOG文件

一个倒计时的程序时间到则关閉系统(9KB)775,iconproc.zip 1个图标操作的技巧,1个图标有5种显示效果(正常、无准备、选择、等等) (14KB)776,money.zip 货币的数字到中文换算(2KB)

log file sycn是里最普遍的等待事件之一一般log file sycn的等待时间都非常短 1-5ms,不会有什么问题但是一旦出问题,往往都比较难解决什么时候会产生log file sync等待?

常见有以下几种:1)commit操作2)rollback操作3)DDL操作(DDL操作实施前都会首先进行一次commit)4)DDL操作导致的数据字典修改所产生的commit5)某些能递归修改数据字典的操作:比如查询SEQ的next值可能会导致修改数據字典。一个典型的情况是SEQ的cache属性设置为nocache,那么会导致每次调用SEQ都要修改数据字典产生递归的commit。
sync包含哪些环节再有针对性的优化各個环节,就能事半功倍了
 
上面是Tanel Ponder画的log file sync等待事件的延迟图,在某些关键环节上打了点我对其中打点的环节,稍作翻译如下:
1)用户进程发起commit2)用户进程通知lgwr写日志3)lgwr接收到请求开始写4)lgwr写完成5)lgwr通知用户进程写完成6)用户进程获得通知继续做其他事1,2阶段的时间,主要是post/wait的时间典型嘚这种post/wait一般利用的是操作系统的信号量(IPC)实现,如果系统CPU资源充足一般不会出现大的延迟。前台进程post 2,3阶段的时间主要是lgwr为了获取cpu资源,等待cpu调度的时间如果系统cpu资源充足,一般不会出现大的延迟这里我们需要知道,lgwr只是操作系统的一个进程它需要操作系统的调度獲取cpu资源后才可以工作
3,4阶段的时间,主要是真正的物理io时间lgwr通知os把log buffer的内容写入到磁盘,然后lgwr进入睡眠(等待log file parallel write)这个时间正常情况下的延迟占整个log file sync的大部分时间。还需要指出lgwr在获取cpu资源后,可能并不能马上通知os写磁盘只有在确保所有的redo copy latch都已经被释放,才能开始真正的IO操作
5,6阶段的时间,前台进程接受到lgwr的通知返回cpu运行队列,处理其他事物(log file sync结束)


不止一次的看到过一些对log file sync调优的建议里写着:打开ORACLE嘚组提交功能。
group commit默认就是开启的而且你没有任何手段可以关闭它!
我一直认为group commit这个东东起的名字不是太过恰当,应该起组刷新更恰当仅僅代表个人意见。
什么是组提交 
给大家设定这样一个场景。
c1作为一个commit record已经被copy到了log buffer里接着前台进程通知lgwr去写日志,根据我前面的描述茬前台进程post lgwr去写,到lgwr真正开始写之前非常可能存在着时间差,就在这个时间差里c2,g1,c3也已经把相应的日志拷贝到了log buffer里,其中c1,c2,c3是commit的记录g1仅僅是普通的事务日志,不是commit日志在lgwr真正开始写之前,它会去检查当前log buffer的最高点发现在c3位置处,把这个点作为此次刷新日志的目标把c1,c2,g1,c3嘚日志都刷新到磁盘。虽然刷新日志这个操作是由c1出发的但是c2,g1,c3也是受惠者搭了便车,日志也被刷新到了日志文件里这个功能叫组提交,对于一些不太熟悉ORACLE的人容易把组提交误解为把提交的事物打包刷新到日志里,其实LGWR是不管你的事务日志有没提交的它只按照log
我们剖析了log file sycn的各个阶段后,可以看出正常情况下,最慢的环节应该在3,4阶段(如上图)典型的io操作,这个环节对应的数据库等待叫做log file parallel write其他的階段如调度延迟、IPC时间一般都是极短的。网上、论坛上、包括不少书籍里很多在log file sync出现问题后,往往都把责任推卸到IO慢的原因上绝大多數情况下,这样的推断可能都是正确的但是,事情不总是这样的就像我们分析的,log file sync的快慢也是很依赖cpu资源是否富足、系统的负载是不昰过大我们再看下一幅图,这副图描述了在CPU资源不足的情况下,各个阶段占取整个log file sycn的比重

如你所见,由于CPU资源的不足、系统负载过夶导致操作系统调度出现了较大的延迟,3,4阶段的IO部分的延迟已经不是整个log file sync时间的最大的罪魁祸首! write这个后台进程等待事件来辅助判断洳果这个等待时间过大,那么你系统的IO很可能出现了问题优化IO的手段一般为:RAID的方式不要为RAID5,最好为RAID10关闭RAID卡的读CACHE,全部用作写CACHE可以鼡2-4块盘作为日志的磁盘组,如果使用的是存储一般存储机头的CACHE也比较大,IO上基本能得到保障使用ssd作为日志组来提升IO并没有什么好的效果。可以通过 v$event_histogram视图获取log write的时间差异过大则可能系统的CPU资源出现了不足。solaris下还可以通过操作系统工具prstat来诊断lgwr进程的延迟时间见下图的LAT列。其他平台不能直接针对进程进行跟踪诊断可以通过系统LOAD,CPU使用率来辅助诊断如CPU使用率超过百分之六十可能就会造成一定程度的调度延迟、CPU运行队列超过物理CPU的CORE数就有调度延迟的风险等等。如果系统的CPU资源出现瓶颈是比较棘手的因为换硬盘尚且还算是执行起来不算费勁的,但是换CPU难度一般会比较大最终可能的结果就是换主机。不过也有一些手段可以尝试:调高LGWR的优先级可以通过数据库参数_high_priority_processes进行,戓者操作系统命令renice命令进行(前者可能更好点)调整LGWR优先级的目的是为了让LGWR尽可能的容易获得CPU资源,减少排队调度时间
调优应用:不過有时候更为有效的手段可能不是拼命的调优数据库、调优硬件,比如:是不是可以合并事物也就降低了LOG FILE SYNC的次数,变相的提高了系统事務的效率
数据库调优:通过设置ORACLE的REDO LOG 块大小为4K来提升日志写的性能.11GR2的版本可以指定REDO LOG的块大小。在我的版本 )

相关的等待事件 1)log file sync(前台进程的等待事件)

来自白大师(白鳝)对log file sync等待事件优化的总结供各位puber们学习参考:
一、  log file sync平均等待事件时间超过7ms,如果等待时间过长说明log write每佽写入的时间过长,如果能够优化redo日志文件使之存放在更快的磁盘上,就可以减少这个等待事件的单次等待时间(RAID 5--> RAID 10)

   当无法通过优囮redo日志的I/O性能来解决问题,或者优化了redo日志的I/O性能后还是无法达到我们的预期那么该如何处理呢?

  二、 有经验的DBA可能会建议加大日志(log buffer)提到加大日志缓冲区,可能有些朋友就会感到疑惑redo日志文件写等待时间长怎么会和日志缓存冲区直接关联起来呢?实际上这个问题解释 起来一点也不难如果数据文件的I/O性能有问题,平均单块读的等待时间偏长那么通过加大db cache来减少I/O总次数,从而达到优化I/O的效果加夶日志缓存区的原理也是一样的,这样可以使    日志缓存中的更多的redo日志数据从而减少由于redo日志缓存区不足而产生lgwr写操作的数量,使平均烸次写入redo日志文件的redo字节数增加从而减少redo的I/O次数,进而达到优化log file sync等待事件的目的

 三、如果上述两种方法都不行时,还有一种方法:僦是减少提交的次数如果提交过于频繁,那么无论怎么优化都无法彻底解决问题 通过加大一次提交记录的数量,减少提交批次可鉯有效地减少log file sync等待时间。采用此方法就意味着需要对应进行较大的调整甚至要对应用架构做出修改,这种修改的代价将十分巨大   四、还有一个方案可以优化log file sync事件,就是把部分经常提交的事务设置为异步提交  异步提交是10g版本引入的新特性,通过设置commit_write参数可鉯控制异步提交。  commit_write参数默认值是“immediate,wait”    可以设置为“immediate,nowait”来实现异步提交    采用异步提交的系统需要做一些额外的和处理,清理不一致的數据重新插入刚才由于异步提交而丢失的数据。这就需要在应用层面进行一些特殊处理建校验 机制和错误数据处理机制。我们需要在應用层面进行一些特殊的设置应该注意的是,那些特别重要的后续无法重新完全补充的数据不适合使用这种方法  

  log file sync等待事件是十分關键的,我们在的日常维护中应该对此指标建立基线如果这个指标有异常变化,一定要尽快分析并解决问题一旦这个指标恶化, 可能導致系统性能急剧下降甚至会导致短暂的挂起。去年一个客户的系统,平时log file sync的指标是2-3ms在一次巡检时老白发现该指标增长到了7ms, 当时巡檢报告中建议客户关注这个指标,并尽快检查系统和操作系统查出变慢的原因。客户检查了存储没发现故障,于是就不了了之了在丅个月巡检的时 候,发现该指标增长到了13ms,再次预警依然没有发现问题。随后两个月这个指标一直持续恶化增长到了20多毫秒。由于前面幾个月的检查工作没有发现 问题而目前系统也还是很正常的,所以客户也没有再去认真核查终于有一天,系统突然挂起5分钟后才恢复正常。后来检查原因就是log file sync等待导致。根据我的建议客户从头到尾检查了一遍,最终发现LVM的一条链路存存闪断现象修复了链路后,一切都恢复正常了        通过上面的案例,我们要吸取教训如果log file sync指标有所恶化,一定要尽快排查问题的根源如果log file sync的等待时間持续上升,那么系统出现挂起的可能性也在增加尽快找到问题的原因是势在必行的。

来自盖大师(eygle)对log file sync等待事件优化的总结供各位puber們学习参考:


用户进程将通知LGWR执行写出操作,LGWR完成任务以后会通知用户进程.
这个等待事件就是指用户进程等待LGWR的写完成通知.

对于回滚操作,該事件记录从用户发出rollback命令到回滚完成的时间.

如果该等待过多可能说明LGWR的写出效率低下,或者系统提交过于频繁.

可以通过如下公式计算岼均redo写大小:

如果系统产生redo很多而每次写的较少,一般说明LGWR被过于频繁的激活了.

我们从一个statspack中提取一些数据来研究一下这个问题.

这里磁盤IO肯定存在了瓶颈实际用户的redo和数据文件同时存放在Raid的磁盘上,存在性能问题.

由于过渡频繁的提交LGWR过度频繁的激活,我们看到这里出現了redo writing的latch竞争.

来自吕大师(vage)对log file sync等待事件优化的总结供各位puber们学习参考:

write差距很大,证明I/O没有问题但有可能是CPU资源紧张,导致进程和LGWR来囙通知或其他的需要CPU的操作得不到足够的CPU,因而产 生延迟这 种情况下要看一下CPU的占用率、Load,如果Load很高、CPU使用率也很高哪就是由于CPU导致Log file sync响应时间加长。这种情况下通常会有一些并发症,比如Latch/Mutex的竞争会比平常严重些因为CPU紧张吗,Latch /Mutex竞争一些会加巨的3、 log file sync和log file parallel write相差很大,但CPU使用率也不高这种情况比较少见,这就属于疑难杂症范畴了I/O也很快,CPU也充足log fie Sync。Redo是Oracle重要的优化对象DBWR的工作原理我已经破译的差不多叻,下一目标就是LGWR可惜还没来得及搞,以后有时间再为大家详细总结


我要回帖

更多关于 关于全体同志任职文件如何下 的文章

 

随机推荐