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'EVENTWAIT_CLASS WAIT_TIME——————————– ———– ———-SQL*Net message to clientNetwork-1Data file init writeUser I/O0control file sequential readSystem I/O0db file sync I/O submitSystem I/O79二、分析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 ProductionPL/SQL Release 11.2.0.4.0 – ProductionCORE 11.2.0.4.0 ProductionTNS for Linux: Version 11.2.0.4.0 – ProductionNLSRTL Version 11.2.0.4.0 – Production SQL>SQL> show parameter disk_asynch_io NAME TYPE VALUE———————————— ———– ——————————disk_asynch_io boolean TRUESQL> show parameter filesystemio NAME TYPE VALUE———————————— ———– ——————————filesystemio_options string none四、对于filesystemio_options参数的解释:

You can use theFILESYSTEMIO_OPTIONSinitialization 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.

FILESYTEMIO_OPTIONScan 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支持,有输出代表已经启用。

[root@db02 ~]# grep kio /proc/slabinfokioctx 104 140 384 10 1 : tunables 54 27 8 : slabdata 14 14 0kiocb 123 210 256 15 1 : tunables 120 60 8 : slabdata 14 14 0[root@db02 ~]# su – oracle[oracle@db02 ~]$ /usr/bin/nm $ORACLE_HOME/bin/oracle | grep io_geteventw io_getevents@@LIBAIO_0.4

/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:

对于沙漠中的旅行者,最可怕的不是眼前无尽的荒漠,而是心中没有绿洲。

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

相关文章:

你感兴趣的文章:

标签云: