技术开发 频道

Oracle IO问题解析

  3.5 Buffer Cache相关的IO事件

  Buffer Cache是影响Oracle IO的重要因素。这里要解决的几个等待事件都是涉及到DBWR进程和IO从属进程(Slave)的Buffer Cache操作引起的等待事件。

  3.5.1 db file parallel write

  该事件和并行DML无关。这个等待事件出现在当DBWR进程提交了多IO请求来并行将Buffer Cache中的脏数据写入磁盘中后,等待所有提交的IO请求完成。通常是由于操作系统的IO系统导致的该事件的阻滞。

  事件中的P1、P2、P3参数分别代表:

  P1:(9.2.0.5之前)写入数据的文件号/(9.2.0.5之后)请求次数;

  P2:(9.2.0.5之前)写入的数据块号/(9.2.0.5之后)请求中断的次数;

  P3:(9.2.0.5之前)请求次数/(9.2.0.5之后)请求发生了Timeout的时间

  这一等待事件一般不会显著影响用户会话。但是当用户会话中有很高的“write complete waits”或“free buffer waits”事件的等待时间时,说明该事件已经影响到了用户会话。有时候这一事件对操作系统IO的影响也会影响到进程从同一磁盘读取数据的等待时间。

  解决该事件的关键在于减少相关磁盘的IO冲突。如果这事件已经影响到用户会话,我们需要结合其他等待事件信息,考虑采取均衡热地磁盘负载、提高存储设备IO效率、增加checkpoint间隔、增大Redo log文件等方法来减低该事件。

  3.5.2 db file single write

  当DBWR进程请求修改数据文件头,在等待IO请求完成时,会出现db file single write等待事件。

  事件中的P1、P2、P3参数分别代表:

  P1:写入数据的文件号;

  P2:写入的数据块号;

  P3:写入的数据块数(一般为1)。

  解决这一等待事件的关键还是要处理好磁盘的IO冲突问题,特别是发生该事件所在的磁盘。通过相关SQL的调优等手段来降低事件发生的磁盘的IO、采用更高效率的存储设备、均衡磁盘IO负载等方法是降低这一等待事件的主要方法。

  3.5.3 write complete waits

  当会话对一个正在被写写入磁盘的Buffer数据块发出请求时,需要等待其被写入磁盘完成,这时就会产生write complete waits等待事件。

  事件中的P1、P2、P3参数分别代表:

  P1:要写入数据的文件号;

  P2:要写入的数据块号;

  P3:无意义

  提高Buffer Cache脏数据写入磁盘的效率、提高整体IO效率是降低该等待事件的主要方法:

  配置数据库支持AIO;

  增加db_writer_processes(支持AIO时)或者db_io_slaves(不支持AIO时)大小以增加DBWR进程;

  其他提高IO效率(如采用裸设备等)、减少IO冲突的方法

  3.5.4 free buffer waits

  当会话在Buffer Cache中找不到空闲buffer块,或者在没有空闲buffer块来建立一致性读时,就会产生free buffer waits等待事件。

  事件中的P1、P2、P3参数分别代表:

  P1:要读取数据的文件号;

  P2:要读取的数据块号;

  P3:10gR1之前无意义,10gR1后表示在Buffer Cache中LRU和LRUW列表的SET_ID#

  这一等待事件通常表示Buffer Cache不足或者从Buffer Cache中将脏数据写入磁盘的效率太低。要降低该等待事件,我们就需要分别从这两方面入手:调整Buffer Cache的大小(如根据statspack的建议器来设置);按照我们前述的方法来提高存储设备的IO效率。

  4 结束语

  最后要说的是,一旦数据库服务器出现了IO问题后,首先要检查操作系统本身的IO系统是否有问题,然后再确认是否是Oracle出现了IO问题。

  其次要注意的一点是,上述等待事件在系统出现一定的等待次数对于系统来说是正常的,我们要解决的是对系统IO影响最大的一个或几个等待事件,而不是全部事件。

  总的来说,要调整Oracle中出现的IO性能问题,我们有两种手段:一种是针对特定等待事件的相应方法,如相关SQL语句的调优、相关参数的修改;另外一种是通过提升整体IO效率、减少IO冲突来降低IO等待,如均衡IO负载、使用效率更高的存储设备、激活AIO和重新分布对IO有不同要求的文件。

  事实上,数据库的性能问题大多数是由应用引起的,而其中大部分问题都是Top SQL造成。因此,这里要说的一句题外话就是:SQL调优是每一个DBA必须具备的最基本的技能。因为很多时候无论采用什么手段、什么工具来定位问题,通过各种内部机制来分析问题,但最终解决问题的手段就是SQL调优。

  5 参考文章

  1、 www.HelloDBA.com

  2、 Metalink.Oracle.com

  3、 Oracle OTN

  4、 Oracle Concept

  5、 Oracle Database Performance Tuning Guide

0
相关文章