原文:https://www.cnblogs.com/muzisanshi/p/11933539.html
当一个用户会话提交,那个用户产生的所有redo需要从内存刷新到重做日志文件,使事务对数据库的修改永久化。
在提交时,用户会话会通知 LGWR 把日志缓冲区中的信息写到重做日志文件(当前所有未被写入磁盘的 redo 信息,包括本次会话的 redo 信息)。当 LGWR 发现写操作完成后,它会通知用户会话。当等待 LGWR 通知确认所有 redo 已经安全的保存到磁盘的过程时,用户会话会等待‘log file sync‘。
用户会话显示等待‘log file sync‘,是用户会话通知 LGWR 和 LGWR 通知用户的写操作完成之间的时间。
注意在11.2及以上版本,LGWR会在默认的post/wait模式和polling模式之间自动切换。在polling模式下,写操作的进展会维护在一个内存结构中,等待‘log file sync‘的会话可以不时检查这个内存结构看是否自己所发起的事务对应的redo已经写入磁盘。这时,等待时间会从用户会话通知 LGWR开始到会话自己发现对应的redo已经写入磁盘结束。
初步分析等待‘log file sync‘,下面的信息是有帮助的:
‘log file sync’可以在用户会话通知 LGWR 写日志,和 LGWR 写完日志后通知用户会话(本地重做日志以及同步模式下的远程备库的日志),及用户会话被唤醒间来接受LGWR的通知或者poll LGWR的写入的日志的进展的任何一个点发生。
更多详情,请参照文档:
其中的最常见的原因:
这些原因以及如何解决它们详情概述如下:
我们在这里回答的主要问题是“是否 LGWR 写入磁盘慢?”,下面的步骤可以帮助确定是否是这个导致的。
等待事件‘log file parallel write‘表示 LGWR 正在等待写 redo 操作。该事件的持续时间就是等待 IO 操作部分的时间。关于‘log file parallel write‘的更多信息,请参阅:
结合事件“log file sync”看同步操作消耗在 IO 的时间,由此推断,有多少处理时间消耗在 CPU 上。
上面的例子显示了‘log file sync‘ 和 ‘log file parallel write‘ 都有很高的等待时间
如果‘log file sync‘的时间消耗在‘log file parallel write‘上的比例高,那么大部分的等待时间是由于 IO(等待 redo 写入)。应该检查 LGWR 在 IO 方面的性能。作为一个经验法则,‘log file parallel write‘平均时间超过 20 毫秒, 意味着 IO 子系统有问题。(当然这个时间对于拥有更多cache的现代的存储系统以及SSD, NVRAM来说会更小)
LGWR倾向于做很多小的IO操作,而不是大块的IO操作。大部分的磁盘配置并不能在这种场景下很好的工作,可能会发生间歇性物理IO缓慢。但是从平均等待时间来看,IO等待的时间并不长(它们仅仅是不善于处理这种小而多的IO负载),磁盘设备提供商据此断定没有磁盘问题。 因为系统里还有其它的IO操作,这些正常的IO操作的等待时间很短,所有这些IO操作平均起来的等待时间并不长,这就掩盖了间歇性物理IO缓慢(IO异常值)的问题。 但是间歇性物理IO缓慢的问题会造成很高的‘log file sync‘, 虽然平均的‘log file parallel write‘是处于正常性能的范围。
如果你发现系统的‘log file sync‘很高,但是‘log file parallel write‘是处于正常的范围,那么这可能是由于间歇性物理IO缓慢导致的。可以检查AWR的部分,也可以使用一些像OSWatcher一样的工具(参照 Document 301137.1)来确定是否系统中存在间歇性物理IO缓慢。如果可以确定存在间歇性物理IO缓慢, 那么你需要与磁盘提供商一起来解决这个问题。
尽管‘log file parallel write‘的平均等待时间可能在一个合理的区间范围内,在峰值时刻写操作时间还是可能会很长进而影响’log file sync’的等待时间。从10.2.0.4 开始如果写操作超过 500 毫秒我们会在 LGWR 的 trace 中写警告信息。这个阀值很高所以就算没有警告也不代表没有问题。警告信息如下:
注意:上面的峰值如果时间间隔的很远,可能不会对‘log file parallel wait‘有大的影响。 但是,如果有 100 个会话等待‘log file parallel wait‘完成,‘log file sync‘总等待可能就会很高,因为等待时间将被乘以会话的个数 100。因此,值得探讨日志写 IO 高峰的原因。
请参阅:
每次重做日志切换到下一个日志时,会执行‘log file sync‘操作,以确保下一个日志开始之前信息都写完。 标准建议是日志切换最多 15 至 20 分钟一次。 如果切换比这更频繁,那么将发生更多的‘log file sync‘操作,意味着更多的会话等待。
增加redo logs的大小
在这种情况下,要回答的问题是“是否应用程序 commit 过于频繁? ”。
如果是,那么过多的 commit 活动可能会导致性能问题,因为把 redo 从日志缓冲区刷新到重做日志可能会导致等待‘log file sync‘。
如果’log file sync’的平均等待时间比’log file parallel write’高很多,这意味着大部分时间等待不是由于等待 redo 的写入,因而问题的原因不是 IO 慢导致。 剩余时间是 CPU 活动,而且是过多的 commit 导致的最常见的竞争。
此外,如果‘log file sync‘的平均等待时间低,但等待次数高,那么应用程序可能 commit 过于频繁。
在 AWR 或 Statspack 报告中,如果每次 commit/rollback 的平均 user calls("user calls/(user commits+user rollbacks)") 小于 30, 表明 commit 过于频繁
在上面的例子中,我们看到,平均每 5.76 次 user calls 就会有一次 commit, 大约高出建议值 5 倍。基于经验,我们期望 user calls/user commit 至少是 25。当然,这取决于应用程序设计。
检查 AWR 报告,看是否有跟 LGWR 相关的,显示占用了显著数量时间的其他事件,因为这可能会给出导致这个问题的一个线索。前台和后台事件都应该进行检查。
例如下面的 AWR 显示某些其他前台和后台等待事件等待高,意味着传输重做日志到远程位置的问题,这可能会导致 fore gorund 进程等待"log file sync"。
11.2 中引入了 Adaptive Log File sync,由参数 _use_adaptive_log_file_sync 控制,在 11.2.0.1 和 11.2.0.2 默认设置为 false。
从 11.2.0.3 开始默认是 true。 当启用时,Oracle 可以在两种方法之间切换:
更多关于这个特性的信息,请参阅:
统计值‘redo synch time overhead‘在11.2.0.4和12c被引入,记录了理想的log file sync时间以及真正的log file sync时间的差值。
如果这个差值很小,说明log file sync等待次数可能是log file parallel write等待之外的原因导致的
关于 ‘log file sync‘ 的已知bug,请参照:
下列文件可以帮助特定环境下的已知问题:
下面的脚本着眼于与‘log file sync‘等待有关的重要参数,‘log file sync‘等待直方图数据和相关信息。
当使用 Data Guard SYNC 和 commit WAIT 默认配置时,可能需要更多的时间。在 Data Guard 环境中,虽然上述调整步骤仍然适用,网络写和 RFS/redo 写入备用重做日志的时间也需要加以考虑。下面的白皮书解释了‘Log File Sync‘如何适用于 Data Guard:
在主数据库和备用数据库的设置信息可以通过从以下文档的脚本来收集:
故障排除:"log file sync"等待 (文档 ID 1626301.1)
原文:https://www.cnblogs.com/ss-33/p/15073092.html