当前位置: 首页 > 科技观察

关于Oracle数据库Kfk:AsyncDiskIOWaitingEvent深度分析

时间:2023-03-15 09:43:42 科技观察

Overview运维团队一大早就来找事,说是系统又有点卡了,然后发现了一个比较少见的waitingevent--kfk:asyncdiskIO,趁着这个排查过程,简单说一下这个等待事件吧!1.查看TOPN等待事件SELECTinst_id,EVENT,SUM(DECODE(WAIT_TIME,0,0,1))"Prev",SUM(DECODE(WAIT_TIME,0,1,0))"Curr",COUNT(*)"Tot",sum(SECONDS_IN_WAIT)SECONDS_IN_WAITFROMGV$SESSION_WAITWHEREeventNOTIN('smontimer','pmontimer','rdbmsipcmessage','SQL*Netmessagefromclient','gcsremotemessage')ANDeventNOTLIKE'%idle%'ANDeventNOTLIKE'%Idle%'ANDeventNOTLIKE%'%StreamsAT'GROUPBYinst_id,EVENTORDERBY1,5desc;--classslavewait可以发现kfk:asyncdiskIO等待事件在前面。2.根据等待事件查看sessionSELECT/*+rule*/sid,s.serial#,spid,event,sql_id,seconds_in_waitws,row_wait_obj#obj,s.username,s.machine,BLOCKING_INSTANCE||'.'||blocking_sessionb_sessFROMv$sessions,v$processpWHEREevent='&event_name'ANDs.paddr=p.addrorderby6;3.查询session详情SELECT/*+rule*/sid,s.serial#,spid,event,sql_id,seconds_in_waitws,row_wait_obj#obj,s.username,s.machine,BLOCKING_INSTANCE||'.'||blocking_sessionb_sessFROMv$会话,v$processpWHEREevent='&event_name'ANDs.paddr=p.addrorderby6;displayinbackup..4.检查服务器是否处于备份状态?查看备份日志发现确实在做0级全量备份。5、查看kfk:asyncdiskIOselectname,parameter1,parameter2,parameter3,wait_classfromv$event_namewherename='kfk:asyncdiskIO';6.关于kfk:asyncdiskIOkfk:asyncdiskIOwaitevent是ASM下的异步SystemI/O等待事件,kfk内核级别在disk_asynch_io=true时激活。当rbal或者其他ASM相关的后台进程在维护ASM磁盘组时,可能会进入kfk:asyncdiskIOwaiting。确保kfk:asyncdiskIO是11G以后ASM下直接路径操作和ASM维护操作都会遇到的等待事件。先看大牛的描述:异步IO的两个函数:io_submit和io_getevents,Oracle先调用io_submit发起异步IO,然后调用io_getevents查看IO状态。从图中可以看出,本大牛认为在io_submit阶段等待的是kfk:asyncdiskIO,从io_getevents到IO完成是直接路径读取。我们再来看下一张图:这张图中,师傅打开10046,同时使用Truss、Strace等工具跟踪进程的执行情况。跟踪结果中,先是调用了io_submit,马上跟踪到10046Writekfk:asyncdiskIOwaitinginthefile。io_getevents调用后,紧随其后的是将直接路径读取等待事件写入10046跟踪文件。master据此得出结论,在io_submit的时候,等待的事件是kfk:asyncdiskIO,io_getevents对应的是directpathread。但实际上kfk:asyncdiskIO并没有这么简单,因为io_submit对应kfk:asyncdiskIO的话,io_getevents对应的是直接路径读取。我们都知道inter-pathIO和dbfilescatteredread在等待事件时,异步IO的完成也是需要io_submit先发出IO,后面再用io_getevents查看IO状态。和直接路径一样,为什么在间接路径中,只有dbfilescatteredread等待事件没有伴随kfk:asyncdiskIO等待事件。很明显,是直接路径和间接路径的区别,导致kfk:asyncdiskIOwaiting。它们之间有什么区别?看下面的图片。这张图是直接路径下的情况。它是通过DTrace跟踪得到的,比Truss和Strace更丰富、更准确。Oracle发出异步IO命令后,不等IO完成就会做一些其他的事情。异步IO,发出IO命令后不需要等待IO完成。Oracle做了一些操作后,调用函数查看IO的完成状态,超时为0秒。超时0秒表示不会停止,只是调用函数查看IO状态,如果IO完成,则进入IO完成流程。如果IO没有完成,会进行一些其他操作,然后再次调用该函数,超时600秒检查IO状态。即最多停留600秒,等待IO完成。如果IO完成,则进入IO完成流程。让我们再看看等待事件。从发出IO命令到超时0秒,等待事件为kfk:asyncdiskIO。如果0秒超时IO没有完成,等待IO完成的事件就是直接路径读。在indirect路径中,所有的IO都有600秒的超时时间,没有0秒的超时时间。因此在indirect路径中,只有dbfilescatteredread在等待,并没有kfk:asyncdiskIO在等待。