Oracle进程_笔记7:DBWn 数据库块写入器
DBWn:数据库块写入器
数据库块写入器(Database Block Writer)是负责将脏块写入磁盘的后台进程。DBWn会写出缓冲区缓存中的脏块,通常是为了在缓存中腾出更多的空间(释放缓冲区来读入其他数据),或者是为了推进检查点(将在线重做日志文件中的位置前移,如果出现失败,Oracle会从这个位置开始读取来恢复实例)。
注意:推进日志文件只是导致检查点活动的途径之一。???有一些增量检查点诸如
FAST_START_MTTR_TARGET之类的参数以及导致脏块刷新输出到磁盘的其他触发器控制。
可以看到,DBWn的性能可能很重要。如果它写出块的速度不够快,不能很快地释放缓冲区(可以重用来缓存其他块),就会看到Free Buffer Waits和Write Complete Waits的等待数和等待时间开始增长。
可以配置多个DBWn。实际上,可以配置多达20个DBWn。大多数系统都只有一个数据库块写入器,但是更大的多CPU系统可以利用多个块写入器。通常为了保持SGA中的一个大缓冲区缓存“干净”,将脏的(修改过的)块刷新输出到磁盘,就可以利用多个DBWn来分布工作负载。
最好的情况下,DBWn使用异步I/O将块写至磁盘。采用异步I/O,DBWn会收集一批要写的块,并把它们交给操作系统。DBWn并不等待操作系统真正将块写出;而是立即返回,并收集下一批要写的块,当操作系统完成写操作时,它会异步地通知DBWn写操作已经完成。这样,与所有工作都串行进行相比,DBWn可以更快地工作。
根据定义,块写入器进程会把块写出到所有磁盘,即分散在各个磁盘上,也就是说,DBWn会做大量的分散写(scattered write)。执行一个更新时,你会修改多处存储的索引块,还可能修改随机地分布在磁盘上的数据块。另一方面,LGWR则是向重做日志完成大量的顺序写(sequential write)。这是一个很多重要的区别,Oracle之所以不仅有一个重做日志和LGWR进程,还有DBWn进程,其原因就在于此。分散写比顺序写慢多了。通过在SGA中缓存脏块,并由LGWR进程完成大规模顺序写(可能重建这些脏缓冲区),这样可以提升性能。DBWn在后台完成它的任务(很慢),而LGWR在用户等待时完成自己的任务(这个任务比较快),这样我们就能得到更好的整体性能。尽管从技术上讲这样会使Oracle执行更多不必要的I/O(写日志以及写数据文件),但整体性能还是会提高,从理论上讲,如果提交期间Oracle已经将已修改的块物理地写出到磁盘,就可以跳过写在线重做日志文件。但在实际中并不是这样:LGWR还是会把每个事务的重做信息写至在线重做日志,DBWn则在后台将数据块刷新输出到磁盘。
本文来源 我爱IT技术网 http://www.52ij.com/jishu/5181.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
