【等待事件】System I/O类 等待事件(3.2)--control file parallel write
SELECT A.*
FROM V$EVENT_NAME A
WHERE NAME IN ('control file parallel write');
这个等待事件包含三个参数:
files:Oracle要写入的控制文件个数。
block#:写入控制文件的数据块数目。
requests:写入控制文件请求的I/O次数。
在V$SESSION_WAIT这个视图里面,这个等待事件有三个参数P1、P2、P3,这三个参数都设置为同样的值,代表控制文件对I/O的请求数量。当Oracle更新控制文件的时候是同时更新所有控制文件并写入同样的信息。
这个等待事件表明服务器进程在更新所有的控制文件的时候等待I/O的完成。因为控制文件所在的磁盘的I/O过高引起无法完成对所有控制文件的物理写入,写入控制文件的这个会话会拥有CF队列,因此其他的会话都会在这个队列中等待。
一般环境下,因为更新控制文件的次数不多,因此不怎么发生control file parallel write等待现象。但如下情况下可能发生与控制文件相关的争用。
1) 日志文件切换经常发生时:
日志文件过小时,将经常发生日志文件的切换。每当发生日志文件切换时,需要对控制文件进行更新,所以LGWR进程等待control file parallel write事件的时间将延长。
2) 检查点经常发生时:
MTTR设定得过短或频繁发生人为的检查点时,CKPT进程等待control file parallel write事件的时间将延长。
3) nologging引起频繁的数据文件修改时:
对数据文件在nologging选项下执行修改工作时,为了修改unrecoverable SCN需要更新控制文件。这时,服务器进程将等待control file parallel write事件。
4) I/O系统的性能缓慢时:
最好是将控制文件位于独立的磁盘空间上,使用裸设备或direct I/O。
control file parallel write等待,通常与control file sequential read等待或enq: CF - contention等待一同出现的情况较多。enq: CF - contention等待是在多个会话为了同时更新控制文件获得CF锁的过程中发生的。control file parallel write、control file sequential read、CF - contention等待,全是因为过多的控制文件更新或I/O系统的性能问题引发的。
当server 进程更新所有控制文件时,这个事件可能出现。如果等待很短,可以不用考虑。如果等待时间较长,检查存放控制文件的物理磁盘I/O 是否存在瓶颈。
多个控制文件是完全相同的拷贝,用于镜像以提高安全性。对于业务系统,多个控制文件应该存放在不同的磁盘上,一般来说三个是足够的,如果只有两个物理硬盘,那么两个控制文件也是可以接受的。在同一个磁盘上保存多个控制文件是不具备实际意义的。
当数据库中有多个控制文件的拷贝时,Oracle 需要保证信息同步地写到各个控制文件当中,这是一个并行的物理操作过程,因为称为控制文件并行写,当发生这样的操作时,就会产生control file parallel write等待事件。
控制文件频繁写入的原因很多,比如:
l 日志切换太过频繁,导致控制文件信息相应地需要频繁更新。当系统出现日志切换过于频繁的情形时,可以考虑适当地增大日志文件的大小来降低日志切换频率。
l 系统I/O 出现瓶颈,导致所有I/O出现等待。
如果在等待时间中这个等待事件占的比重比较大,可以从如下几个方面来调整:
l 在确保控制文件不会同时都丢失的前提下,将控制文件的数量减小到最少,降低控制文件的拷贝数量(在确保安全的前提下)。
l 如果系统支持异步I/O,则推荐尽量使用异步I/O,这样可以实现真正并行的写入控制文件。
l 将控制文件移动到负载比较低,速度比较快的磁盘上去。
l 将控制文件的拷贝存放在不同的物理磁盘上的方式来缓解I/O 争用。