暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

log file sync等待事件分析

B哥数据搬运工 2021-01-08
1117

背景:写这篇文章的前提是,近两个月来,接连有几个应用报生产commit缓慢问题,他们都有一些共同点,就是数据库版本均为Oracle 19.5,运行在Linux x86平台,系统的负载均很低,log file sync平均等待时间很高,有的高达几秒,但log file parallel write平均等待时间不到1毫秒,而在lms、lgwr日志却能看到大量的log writ broadcast wait time超过500毫秒的警告信息。该问题是命中Oracle Bug。从官方截取下图,可以看到,这个问题在19.8版本之后已经解决了,19c的其它版本需要打上对应的Patch。本文重点不是探讨这个BUG。



言归正传,平时我们在分析生产或测试环境AWR性能报告时,经常会碰到log file sync这个等待事件。到底什么是log file sync?与commit有什么关系?对我们应用程序有啥影响?导致log file sync平均等待时间长的原因有哪些?怎样去优化这个等待事件?下面将逐一进行说明:

1、什么是log file sync?

当一个会话发起commit时,该会话所产生的所有事务日志,需要从内存中log buffer刷出到磁盘日志文件(redo log file),确保事务对数据库的更改被持久化。大家都清楚,关系型数据库都是日志先行,而且是顺序写入,只要日志落盘成功,那么即使此时实例挂掉,数据也不会丢失。


2、log file sync的生命周期

从下图可以看到,log file sync生命周期指的是用户发出commit,直至收到日志已落盘完成,一共经历这6个阶段。如果这个过程等待时间过长,则意味着应用commit响应缓慢。图中,若log file sync(蓝色实线)平均等待时间较长(比如超过15ms),而log file parallel write(红色实线)平均等待时间却小于10ms,则可以初步排除存储IO性能问题。



3、哪些因素导致log file sync高?以及有哪些排查手段?

1)日志文件所在存储设备IO性能较差

  • 通过AWR性能报告分析,确认log file parallel write平均等待是否过高。按目前存储来说,小于10ms可认为是正常。

  • 通过分析lgwr、lms后台进程的trace文件,写入超过500ms,均会记录到trace文件中。


2)出现IO争用

数据文件、日志文件、归档等文件存放在同一块磁盘,导致IO争用。


3)commit过于频繁

若user calls / (user commits + user rollbacks) 小于30,可以认为应用程序提交过于频繁。



4)日志过多,日志切换过于频繁

  • 检查awr报告中的log switches,每小时切换次数或是直接查看alert.log中日志切换的警告信息


  • 检查日志文件大小


5)CPU出现瓶颈,lgwr,lms关键后台进程没有设置调度高优先级

通过检查数据库_high_priority_processes参数。


6)Oracle Bug

如背景所描述现象。



以下是主要优化参考点:

1)日志文件(redo log)单独存放在IO效率高的存储设备上

2)日志文件大小和组数按照基线规范(OLTP 1GB,OLAP 2GB,共8组,若应用日志量过大,导致日志切不过来,建议增加组数)

3)应用程序采用批量提交

4)打上补丁



文章转载自B哥数据搬运工,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论