首先看看官方文档中的描述
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过程
buffer cache LRU链如下
LRU链如下(橙色部分)
参考
https://sites.google.com/site/embtdbo/oracle
https://www.slideshare.net/khailey/oracle-10g-performance-chapter-06-buffer-cache
标签:DBWR,buffer,cache,free,Oracle,buffers,wait From: https://blog.51cto.com/u_13631369/6202563