标签:db_writer_processes dbwr_io_slaves disk_async_io redo allocation latc redo copy latch
Private Strands是10gR2才有的,它用于处理redo的latch(redo allocation latch)。是一种允许进程利用多个allocation latch更高效地将redo写入redo buffer cache的机制,它与9i中出现的log_parallelism参数相关。提出Strand的概念是为了确保实例的redo生成率达到最佳,并能确保在出现某种redo争用时,可以动态调整strand的数量进行补偿。初始分配的strand数量取决于CPU的数量,最少两个strand,其中一个strand用于active的redo生成。
对于大型的oltp系统,redo生成量非常大,因此当前台进程遇到redo争用时,这些strand会被激活。shared strand总是与多个private strand共存。Oracle 10g的redo(和undo)机制有一些重大变化,目的是为了减少争用。此机制不再实时记录redo,而是先记录在一个private area,并在commit时flush到redo log buffer中去。在这种新机制引入后,一旦用户进程申请到private strand,redo不再保存到pga中,因此不再需要redo copy latch这个过程。
如果想要在alert.log中避免出现Private strand flush not complete事件,那么可以通过增加参数db_writer_processes的值来实现,因为DBWn会触发LGWR将redo写入到logfile,如果有多个DBWn进程一起写,可以加速redo buffer cache写入redo logfile。
DBWR_IO_SLAVES主要用于模拟异步环境,在不支持异步操作的OS上,可以提高IO的读写速度。
多个DBWR进程可以并行地从data buffer中获取dirty block并且并行地写入磁盘。但是,在单DBWR+多个I/O slaves的场景下,只能是一个DBWR负责从data buffer中获取,而多个I/O slaves并行写入。如果系统支持AIO(disk_async_io=true),一般不用设置多dbwr
或io slaves。
如果在有多个cpu的情况下建议使用DB_WRITER_PROCESSES,因为这样的情况下不用去模拟异步模式,但要注意进程数量不能大于cpu数量。而在只有一个cpu的情况下建议使用DBWR_IO_SLAVES来模拟异步模式,以便提高数据库性能。
alert日志中出现Private Strand Flush Not Complete的处理方法
标签:db_writer_processes dbwr_io_slaves disk_async_io redo allocation latc redo copy latch
原文地址:http://blog.csdn.net/aaron8219/article/details/40398797