log file sync等待高不等于磁盘慢,需先对比log file parallel write延迟:若两者接近则指向I/O问题;若log file sync显著更高(如15ms vs 1ms),则重点排查CPU争用、Latch冲突或_use_adaptive_log_file_sync触发的10ms polling机制。
log file sync 等待高 ≠ 磁盘慢,先看 LGWR 是否被卡住
oracle 11g 中 log file sync 高等待,90% 的情况不是磁盘本身慢,而是 lgwr 进程在提交路径上被阻塞或延迟。关键要区分:是 lgwr 写得慢(log file parallel write 也高),还是 lgwr 响应慢(log file parallel write 正常但 log file sync 很高)。前者指向 i/o 或存储配置问题,后者更可能是内部机制或资源争用。
实操建议:
- 查 AWR/ASH 报告,对比
log file sync和log file parallel write的平均等待时间(Avg wait ms):若两者接近(比如都 >5ms),优先排查存储;若log file sync显著高于log file parallel write(如 15ms vs 1ms),说明 LGWR 写完后通知前台进程的过程被拖慢——这时重点看 CPU、Latch 或自适应日志同步特性 - 检查
v$event_histogram中log file sync的分布:SELECT event, wait_time_milli, wait_count FROM v$event_histogram WHERE event = 'log file sync' ORDER BY wait_time_milli;如果大量集中在 10ms 档位(如 8–12ms),极可能触发了_use_adaptive_log_file_sync的 polling 机制(固定 10ms 轮询) - 确认是否为 RAC 环境:如果是,
LGWR-LNS wait on channel出现且阻塞前台会话,大概率是 DG 同步模式(如 MAXIMUM AVAILABILITY)下备库响应延迟导致 LGWR 卡住
_use_adaptive_log_file_sync 在 11.2.0.3+ 默认开启,容易引发 10ms 级别抖动
Oracle 11.2.0.3 引入的 _use_adaptive_log_file_sync 特性,默认值为 TRUE,本意是动态切换 post/wait 与 polling 模式以优化 LGWR 唤醒效率。但在某些场景下(尤其 CPU 负载不均、RAC 节点间调度偏差),它会强制 LGWR 使用 polling,而 polling 间隔硬编码为 10ms —— 这直接把 log file sync 的下限卡死在 10ms 左右,掩盖真实 I/O 延迟。
实操建议:
- 立即验证该参数状态:
SELECT ksppinm, ksppstvl FROM x$ksppi x, x$ksppcv y WHERE x.indx = y.indx AND ksppinm = '_use_adaptive_log_file_sync'; - 若返回
TRUE且log file sync平均值稳定在 9–12ms 区间,可临时禁用:ALTER SYSTEM SET "_use_adaptive_log_file_sync"=FALSE SCOPE=SPFILE;(需重启生效) - 注意:该参数为隐含参数,修改前务必确认 Oracle 版本补丁级别(Bug 13551402 在 11.2.0.2/3 中存在,官方补丁已修复部分平台)
事务太碎、提交太勤,LGWR 根本没法“组提交”
频繁小事务提交(比如每条 INSERT 后跟 COMMIT)会导致 LGWR 被反复唤醒,无法合并多个事务的 redo 批量写出(即 Group Commit 失效)。此时 user commits 统计值会异常高,而 redo writes 与 redo blocks written 的比值偏低(例如 avg.redo write size
实操建议:
- 查统计信息:
SELECT name, value FROM v$sysstat WHERE name IN ('user commits', 'redo writes', 'redo blocks written');计算平均写大小:(redo blocks written / redo writes) * 512—— 若结果 - 应用层能改则改:把循环中的单条 COMMIT 改为批量后统一 COMMIT;或使用
BULK COLLECT + FORALL减少上下文切换 - DB 层临时缓解(慎用):
ALTER SYSTEM SET commit_write='BATCH,NOWAIT';可让 LGWR 异步批量写,但异常宕机时可能丢失最近几毫秒事务
redo 日志文件和数据文件混放 RAID5,I/O 竞争放大延迟
RAID5 对小块随机写有严重惩罚(写放大 + 校验计算),而 LGWR 是顺序小 I/O(通常 1–4KB),DBWR 是大块随机写。两者共用同一 RAID5 卷时,LGWR 的写请求会被 DBWR 的读写操作打断,导致 log file parallel write 延迟升高,进而传导为 log file sync 延迟。
实操建议:
- 检查 redo 日志位置:
SELECT group#, member FROM v$logfile;确认是否与v$datafile路径重叠 - 理想部署:redo 日志必须独占高速物理盘(如 NVMe 或专用 SAS SSD),且禁用 RAID5;至少用 RAID10;归档日志也应分离
- 若硬件无法调整,可尝试增大
log_buffer(如从 8MB → 16MB),减少 LGWR 唤醒频率,但治标不治本
真正棘手的是混合原因:比如自适应日志同步开启 + 提交频繁 + RAID5 共享磁盘,三者叠加会让 log file sync 表现为“看起来像磁盘问题”,但调优时只盯 I/O 就会漏掉最关键的参数开关。实际排查必须按“等待分布 → 参数状态 → 事务模式 → 存储拓扑”顺序推进,跳步容易误判。


















