当用户会话(前台进程)提交(或回滚)时,会话的redo信息需要刷入到重做日志文件中。 用户会话将使用LGWR来将日志缓冲区中所需的所有redo请求写入重做日志文件。当LGWR完成后,它将通知用户进程。用户会话将出现该等待事件,同时等待LGWR将其回发以确认所有重做更改都安全地在磁盘上。
换句话说,用户会话/前台进程花费的时间等待刷新重做以使得commit等待更长时间。因此,我们可以将这些等待视为来自前台进程(或通常的提交客户端)的提交延迟。
该等待事件越多,可能说明LGWR的写效率低或者系统提交(回滚)过于频繁。通常发生在OLTP系统上。
对于自身范围内产生的等待
1. 查看动态性能视图V$SESSION_WAIT涉及到的“log file sync”参数
P1 = buffer#
P2 = not used / sync scn
P3 = not used
注:
buffer#:此缓冲区编号(在日志缓冲区中)的所有更改都必须刷新到磁盘并确认写入以确保事务已提交,并且将在实例崩溃时保持提交。因此等待LGWR刷新到此buffer#。
sync scn:10.2.0.5.0及更高版本会使用到。表示需要同步到磁盘的SCN值的基础。等待LGWR刷新SCN值。
2. 等待时间
等待完全依赖于 LGWR写出到必要的重做块并确认完成返回用户会话。等待时间包括日志缓冲区的写入和post。在某些版本中,waiter超时并在等待时每隔一段时间增加序列号(旧版本中间隔时间是以1秒为单位,新版本中游戏自适应)。
3. 寻找“Blockers”
如果会话继续在相同的buffer#上等待,则V$SESSION_Whttp://www.cungun.comIT的SEQ#列可能会增加,具体取决于所使用的等待方案。如果buffer#值没有改变,需要检查看看LGWR正在等待什么,因为它可能被卡住了。还要检查等待进程是否还活着。
对于系统范围内产生的等待
“log file sync”上等待的系统范围的数字显示了等待提交(或回滚)完成所花费的时间。如果这很重要,那么LGWR可能存在问题。还需要关注:
1. LGWR的另一个等待事件"log file parallel write"
2. “user commit”和”user rollback”的统计信息,查看正在发出的提交和回滚的次数。
减少等待和等待时间的方法
有五个方法可以减少该等待事件的时间:
1. 调整 LGWR 获得更好的磁盘吞吐量。如: 不要将重做日志放在RAID 5上,因为RAID 5对于频繁写入的系统会带来较大的性能损失。
2. 如果有很多小事务,看是否可以将事务BATCH放在一起,从而减少不同的COMMIT操作。 每次提交都必须确认相关的REDO刷到磁盘上。尽管Oracle可以“piggybacked”提交,但通过批处理事务来减少提交的总数会产生非常好的效果。
3. 查看是否有任何处理可以使用COMMIT NOWAIT选项(但在使用之前一定要了解它的语义)。
4. 查看是否可以使用NOLOGGING / UNRECOVERABLE选项安全地完成任意操作。
5. 检查重做日志是否足够大。增大重做日志,使日志在15到20分钟之间切换。
另外,日志文件同步等待的总时间可以细分为以下几种:
1. 空闲时唤醒 LGWR
2. LGWR收集要写入的redo操作并发出I/O请求
3. 日志写I/O完成时间
4. LGWR I/O开始工作
5. LGWR通知写入完成的前台/用户会话
6. 前台/用户会话唤醒