db file async I/O submit 等待事件优化

db file async I/O submit 等待事件优化

一、数据发生db file async I/O submit

我们从数据库awr报告中经常会看到很高db file async I/O submit的等待事件:

SQL> select event,wait_class,wait_time from v$session_wait where wait_class<>'Idle'

EVENT                            WAIT_CLASS   WAIT_TIME
-------------------------------- ----------- ----------
SQL*Net message to client        Network             -1
Data file init write             User I/O             0
control file sequential read     System I/O           0
db file sync I/O submit          System I/O          79

二、分析db file async I/O submit

那么从这个等待事件的名称上来看,我们不难看出其和IO有关,IO分为如下:

同步IO:在同步IO中,线程启动一个IO操作然后就立即进入等待状态,知道IO操作完成后才继续执行其他事情。

异步IO:线程发送一个IO请求到内核,然后继续处理其它事情,内容完成IO请求后,将通知线程IO操作完成

IO总结:

如果IO请求需要大量时间执行的话,异步文件IO方式可以显著提高效率,因为在线程等待的这段时间内,CPU将会调度其它线程进行执行,如果没有其它线程需要执行的话,这段时间将会浪费掉(可能会调度操作系统的零页线程)。如果IO请求操作很快,用异步IO的方式更低效,此时同步IO会较优。

同步IO在同一时刻只允许一个IO操作,也就是说对于同一个文件句柄的IO操作是序列化的,及时使用两个线程也不能同时对一个文件句柄同时发出读写操作。重叠IO允许一个活多个线程同事发出IO请求。

异步IO在请求完成时,通过将文件句柄设为又信号状态来通知应用程序,或者应用程序通过GetOverlappedResult查看IO请求是否完成,也可以通过一个事件对象来通知应用程序。

三、找出相关的参数

那么我们看看有关异步IO的设置:

在Oracle 11g当中,其默认值为如下:

SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production

SQL>
SQL> show parameter disk_asynch_io

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
disk_asynch_io boolean TRUE
SQL> show parameter filesystemio 

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
filesystemio_options string none

四、对于filesystemio_options参数的解释:

You can use the FILESYSTEMIO_OPTIONS initialization parameter to enable or disable asynchronous I/O or direct I/O on file system files. This parameter is platform-specific and has a default value that is best for a particular platform.

使用FILESYSTEMIO_OPTIONS初始化参数在文件系统文件上启用或者禁用异步I/O或者直接I/O。这个参数是平台特有的,针对特定的平台最好有个默认值。

FILESYTEMIO_OPTIONS can be set to one of the following values:

ASYNCH: enable asynchronous I/O on file system files, which has no timing requirement for transmission.

在文件系统文件上启用异步I/O,在数据传送上没有计时要求。

DIRECTIO: enable direct I/O on file system files, which bypasses the buffer cache.

在文件系统文件上启用直接I/O,绕过buffer cache。

SETALL: enable both asynchronous and direct I/O on file system files.

在文件系统文件上启用异步和直接I/O。

NONE: disable both asynchronous and direct I/O on file system files.

在文件系统文件上禁用异步和直接I/O。

五、打开异步IO

这个时候我们通过如下语句打开filesystemio_options异步IO选项:

SQL> alter system set filesystemio_options =asynch sid = ‘*’ scope=spfile;

六、重启数据库后检查:

在Oracle11gR2中AIO默认已经是开启的了。可以通过ldd或者nm来检查oracle是否已经启用了AIO支持,有输出代表已经启用。

[[email protected] ~]# grep kio /proc/slabinfo
kioctx 104 140 384 10 1 : tunables 54 27 8 : slabdata 14 14 0
kiocb 123 210 256 15 1 : tunables 120 60 8 : slabdata 14 14 0

[[email protected] ~]# su - oracle
[[email protected] ~]$ /usr/bin/nm $ORACLE_HOME/bin/oracle | grep io_getevent
                 w [email protected]@LIBAIO_0.4

proc文件系统包含了两个虚拟文件,它们可以用来对异步 I/O的性能进行优化:

/proc/sys/fs/aio-nr文件提供了系统范围异步 I/O请求现在的数目。

/proc/sys/fs/aio-max-nr文件是所允许的并发请求的最大个数。最大个数通常是 64KB,这对于大部分应用程序来说都已经足够了。

检查异步I/O是否在使用

  根据[Note 370579.1],可以通过查看slabinfo统计信息查看操作系统中AIO是否运行,slab是Linux的内存分配器,AIO相关的内存结构已经分配,kiocb值的第二列和第三列非0即是已使用。与kernel
2.4.x不同,没有显示kiobuf,因为从kernel 2.5.43开始,kiobuf已经从内核中被移除。

kioctx:

AIO上下文在内核空间对应数据结构kioctx,它保存异步IO的所有信息:

[[email protected] ~]$ grep kio /proc/slabinfo
kioctx 103 140 384 10 1 : tunables 54 27 8 : slabdata 14 14 0
kiocb 134 195 256 15 1 : tunables 120 60 8 : slabdata 13 13 0

七、后记:

1、  使用操作系统cache:

操作系统和设备控制器提供了数据库缓存,这些不直接与数据库的缓存管理相冲突。尽管如此,这些架构可能消耗资源当有很少的或没有性能利益。当数据库文件存储在Linux或者UNIX文件系统上时,这种情况就显而易见了。默认情况下,所有的数据库I/O都要通过文件系统的缓存。

在一些Linux和UNIX系统上,直接I/O是可用的对于文件存储来说。这个协议允许数据库文件存取在文件系统范围内,绕过文件系统缓存。直接的I/O节约了CPU资源斌并且允许文件系统缓存是独立的在没有数据库活动的时候,例如program
texts 和spool files.

尽管操作系统的的cache经常是冗余的因为数据库的cache buffers blocks。在一些情况下,数据库不能用database buffer cache。在这些情况下,使用直接I/O或者裸设备可能产生更严重的性能问题比使用系统的buffer。例如

·         Reads or writes to the TEMP tablespace

·         Data stored in NOCACHE LOBs

·         Parallel Query slaves reading data

2、  相关参数介绍:

在oracle里为了提高io的速度,常用参数db_writer_processes和 dbwr_io_slaves

在数据库里事务数非常高,或db cache很大,一个DBWn process跟不上数据的load,我们可以调整这两个参数,这两个参数的作用就是增加io读写进程,启用异步io,加快io的速度

多个 slaves 可以并行写数据文件,而多个dbwr也可以并行写数据文件

一个 dbwr 多个 slaves是 dbwr搜集dirty  buffer而 slaves写数据文件

多个dbwr 可以并行地搜集dirty buffer 并且并行地写数据文件

但是如果系统支持AIO一般不用设置多dbwr 或者 io slaves

db_writer_processes:在多cpu,多磁盘的环境,一般是每8个cpu一个dbwr进程

什么时候配置这两个参数

如果系统的io是瓶颈是,检查os是否支持异步io,如果支持异步io,但目前没有使用,那就启用异步io来缓解io瓶颈。如果os不支持异步io,

或os已经启用异步io,但io还是瓶颈,那我们可以配置多个dbwr进程。配置这两个参数是要注意,大都是如下

一个db_writer_processes,多个dbwr_io_slaves

多个db_writer_processes,dbwr_io_slaves不启用

八、参考:

时间: 2024-08-19 19:50:14

db file async I/O submit 等待事件优化的相关文章

oracle启用异步IO(db file async I/O submit)

市局双随机awr报告中有大量db file async I/O submit等待事件 参考两篇文章: [案例]Oracle等待事件db file async I/O submit产生原因和解决办法 db file async I/O submit 等待事件优化 查看数据文件是否开启异步IO Select Name, Asynch_Io From V$datafile f, V$iostat_File i Where f.File# = i.File_No And (Filetype_Name =

ORACLE AWR报告之 log file sync等待事件优化的总结【转自ITPUB】

来自白大师(白鳝)对log file sync等待事件优化的总结,供各位puber们学习参考: 一. log file sync平均等待事件时间超过7ms,如果等待时间过长,说明log write每次写入的时间过长,如果能够优化redo日志文件存储,使之存放在更快的磁盘上,就可以减少这个等待事件的单次等待时间.(RAID 5--> RAID 10)   当无法通过优化redo日志的I/O性能来解决问题,或者优化了redo日志的I/O性能后还是无法达到我们的预期,那么该如何处理呢? 二. 有经验的

Oracle Study之--Oracle等待事件(3)

Oracle Study之--Oracle等待事件(3) Db file parallel read这是一个很容易引起误导的等待事件,实际上这个等待事件和并行操作(比如并行查询,并行DML)没有关系. 这个事件发生在数据库恢复的时候,当有一些数据块需要恢复的时候,Oracle会以并行的方式把他们从数据文件中读入到内存中进行恢复操作.这个等待事件包含三个参数:Files: 操作需要读取的文件个数.Blocks: 操作需要读取的数据块个数.Requests: 操作需要执行的I/O次数. 案例分析:

Oracle常见的几种等待事件

1. CPU time 正常情况,在等待事件中排首位 NUM_CPU_SOCKETS    物理CPU的数目 NUM_CPU_CORES       CPU的核数 NUM_CPUS                  逻辑CPU的数目 2. Buffer busy waits (Buffer busy wait / read by other session) 一般这2个等待事件可以归为一起处理,建议进行监控 . 可能是如下操作引起 select/select --- read by other

oracle之 等待事件LOG FILE SYNC (awr)优化

log file sycn是ORACLE里最普遍的等待事件之一,一般log file sycn的等待时间都非常短 1-5ms,不会有什么问题,但是一旦出问题,往往都比较难解决.什么时候会产生log file sync等待?常见有以下几种:1)commit操作2)rollback操作3)DDL操作(DDL操作实施前都会首先进行一次commit)4)DDL操作导致的数据字典修改所产生的commit5)某些能递归修改数据字典的操作:比如查询SEQ的next值,可能会导致修改数据字典.一个典型的情况是,

Oracle常见等待事件说明

Oracle的等待事件是衡量Oracle运行状况的重要依据及指标.等待事件的概念是在Oracle7.0.1.2中引入的,大致有100个等待事件.在Oracle 8.0中这个数目增加到了大约150个,在Oracle8i中大约有200个事件,在Oracle9i中大约有360个等待事件.主要有两种类别的等待事件,即空闲(idle)等待事件和非空闲(non-idle)等待事件. 空闲事件指Oracle正等待某种工作,在诊断和优化数据库的时候,我们不用过多注意这部分事件. 常见的空闲事件有: ? disp

Oracle db file parallel write 和 log file parallel write 等待事件

一. db file parallel write等待事件 引自如下blog: http://oradbpedia.com/wiki/Wait_Events_-_db_file_parallel_write db文件并行写 db文件并行写等待事件属于Oracle数据库写入程序(DBWR)进程,因为它是将块从SGA写入数据文件的唯一进程.当是写入时,DBWR进程编译一组脏块,将批处理交给操作系统,并等待db文件并行写事件以完成I / O.虽然用户会话从来没有遇到db文件并行写等待事件,但这并不意味

详解 db file sequential read 等待事件

db file sequential read (本文由thomaswoo_dba翻译,转载请注明出处) db file sequential read 事件有三个参数:file#,first block#, block count, 在oracle 10g里,此等待事件在归于 User I/O wait class 下面的. 处理db file sequential read 事件要牢牢把握下面三个主要思想: 1)oracle 进程需要访问的block不能从SGA 中获取,因此oracle 进

db file sequential read等待事件 --转载

db file sequential read db file sequential read等待事件有3个参数:file#,first block#,和block数量.在10g中,这等待事件受到用户I/O等待级别的影响.当处理db file sequential read等待事件的时候,牢记以下关键想法. l         Oracle进程需要一个当前不在SGA中的块,等待数据库块从磁盘读入到SGA中 l         要看的两个重要的数字是单独会话的TIME_WAITED和AVERAGE