首先看看官方文档中的描述

This wait event indicates that a server process was unable to find a free buffer and has posted the database writer to make free buffers by writing out dirty buffers. A dirty buffer is a buffer whose contents have been modified. Dirty buffers are freed for reuse when DBWR has written the blocks to disk.

当session试图将block读入buffer cache,或者由于读一致需要构造cr的block却找不到free buffer而产生的等待,需要等待DBWR进程将脏块写回磁盘。为什么找不到free buffer,可能原因如下:

 

一、 free buffer wait常见原因

  • buffer cache 太小,free buffer本来就少
  • DML操作并发过高,产生脏块过多,来不及写出
  • DBWR写出过慢,可能是因为DBWR进程过少(db_writer_processes参数),也可能服务器IO有问题
  • 烂SQL导致大量的物理读

 

二、 对应解决方法

  • 加大buffer cache
  • 检查DML操作并发过高原因,是真的需要还是有程序bug,能否错开执行时间,是否有使用索引
  • 如果DBWR进程过少,可以适当增加
  • 如果服务器IO有问题,建议vmotion到较高性能存储
  • SQL使用绑定变量,避免大量物理读
  • 过大sql可以使用直接IO,绕过buffer cache
  • 使用较大的data block(一般不建议)

 

三、 图解Oracle寻找free buffer过程

Oracle等待事件(二)—— free buffer wait 常见原因及对应解决方法_服务器

Oracle等待事件(二)—— free buffer wait 常见原因及对应解决方法_SQL_02

Oracle等待事件(二)—— free buffer wait 常见原因及对应解决方法_oracle_03

buffer cache LRU链如下

Oracle等待事件(二)—— free buffer wait 常见原因及对应解决方法_服务器_04

Oracle等待事件(二)—— free buffer wait 常见原因及对应解决方法_SQL_05

LRU链如下(橙色部分)

Oracle等待事件(二)—— free buffer wait 常见原因及对应解决方法_oracle_06

Oracle等待事件(二)—— free buffer wait 常见原因及对应解决方法_SQL_07

Oracle等待事件(二)—— free buffer wait 常见原因及对应解决方法_服务器_08

Oracle等待事件(二)—— free buffer wait 常见原因及对应解决方法_SQL_09

Oracle等待事件(二)—— free buffer wait 常见原因及对应解决方法_SQL_10

Oracle等待事件(二)—— free buffer wait 常见原因及对应解决方法_SQL_11

Oracle等待事件(二)—— free buffer wait 常见原因及对应解决方法_oracle_12

Oracle等待事件(二)—— free buffer wait 常见原因及对应解决方法_oracle_13

 

参考

https://sites.google.com/site/embtdbo/oracle

https://www.slideshare.net/khailey/oracle-10g-performance-chapter-06-buffer-cache