DBWn
DBWn定期写脏数据到磁盘。频繁的磁盘I/O会影响性能,所以每当数据库内存中产生脏数据时,是不一定也不应该产生写数据到磁盘的操作的,DBWn会尽量少的写入磁盘。
虽然一个数据库DBW0进程适用于所有系统,为了提高数据库写的能力可以配置DBW1-DBW9,DBWa-DBWj。这些新增的DBWn不使用于单处理器系统。
在以下情况DBWn进程写脏数据到磁盘:
?
When a server process cannot find a clean reusable buffer after scanning a threshold number of buffers, it signals DBWn to write. DBWn writes dirty buffers to disk asynchronously if possible while performing other processing.当服务器进程扫描所有buffer后不能找到干净可用的buffer,服务器进程会发消息给DBWn去写。DBWn会同步写脏数据到磁盘。?
?
DBWn periodically writes buffers to advance the checkpoint, which is the position in the redo thread from which instance recovery begins. The log position of the checkpoint is determined by the oldest dirty buffer in the buffer cache.为了提升检查点,DBWn周期性的写脏数据。检查点的位置取决于在buffer cache中最旧的脏数据
在很多情况下,DBWn写的块分布在整个磁盘,因此写数据的速度会慢于LGWR连续写日志的速度。DBWn为了提高写的效率会多块写。多块写的块数取决于操作系统。
DB_WRITER_PROCESSES
DB_WRITER_PROCESSES参数可用设置DBWn的个数。设置多个DBWR进程可用分散写脏数据到磁盘的任务,也分散了进程的IO。强烈建议在多个CPU或者多个进程组情况下使用多个DBWR进程,至少每8个CPU使用一个DBWR进程。
在多个CPU和进程组的情况下,数据库使用合适的默认DBWn数或者直接使用DB_WRITER_PROCESSES指定DBWn个数。
DBWR_IO_SLAVES
如果使用多个DBWR进程不实用,oracle提供了可用分散IO的奴隶进程。DBWR是唯一一个可用扫描buffer cache中LRU的进程。然而,这些块的IO由IO slave表现。IO slave的数量取决于DBWR_IO_SLAVES参数。
在不能使用DB_WRITER_PROCESSES 的情况下(比如只有一个CPU),就需要使用DBWR_IO_SLAVES。异步IO同样也适用于不能使用异步IO的情况。如果系统支持异步IO,就使用异步IO。
在数据库开启后的获取到第一个IO请求时DBWR IO slave便会立即分配。DBWR仍然做着自己相关的工作,IO被分开。
使用DBWR_IO_SLAVES需要额外的内存分配IObuffer和响应队列。多DBWR进程不能使用IO slave。使用IO slave只能有一个DBWR进程。
在一个DBWR不能跟上系统压力需求时,使用多个DBWR进程可用提高性能。然而在使用多个DBWR进程前,需要确认异步IO是否可用,是否已使用。如果系统支持异步IO但没有使用,开启一步IO功能并查看是否减缓了IO问题。如果系统不支持异步IO,或者异步IO已经使用但仍然存在DBWR性能瓶颈,那么需要使用多DBWR进程。
如果异步IO不可用,设置DISK_ASYNCH_IO为FALSE去关闭异步IO。
因为多个DBWR进程同步获取buffer,所以多DBWR进程会比多IO slave的单DBWR要快。因为如此,在不能使用多DBWR进程时才应该去考虑IO slave。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31461640/viewspace-2141492/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/31461640/viewspace-2141492/