暂无图片
oracle的db file async I/O submit等待事件和redo状态全部active
我来答
分享
薯yaya
2022-05-30
oracle的db file async I/O submit等待事件和redo状态全部active

各位大佬,请教一下oracle的db file async I/O submit等待事件有没有排查思路呢?数据库运行缓慢的时候查询了库里的等待情况和redo的状态:




也测了一下磁盘的写情况


我来答
添加附件
收藏
分享
问题补充
10条回答
默认
最新
和光同尘

dbwr写异常

暂无图片 评论
暂无图片 有用 0
薯yaya
题主
2022-05-30
请问这个异常是因为dbwr个数少了吗,目前是5个
Root__Liu

可以看到1579这个sid实际上就是后台dbwn进程,这个等待事件也是跟io有关的等待事件,是异步IO相关的等待事件,简单说就是io请求是异步的。

可以研究下这几个参数
disk_asynch_io
filesystemio_options
disk_asynch_io为TRUE,filesystemio_options为NONE的情况下,出现db file async I/O submit等待,可以设置filesystemio_options参数为ASYNCH或者SETALL,使得db file parallel write等待代替db file async I/O submit等待。

参考这个文档:(Doc ID 1274737.1)

暂无图片 评论
暂无图片 有用 0
薯yaya
题主
2022-05-31
谢谢~我有搜到网上有的博客说异步io可能会导致坏块,新手请教一下这个参数是不是普遍设置为异步的呢
和光同尘

可以参考楼下说的,查看异步IO是否开启,不行的话可以配置更多的DBWR,但是DBWR不能超过CPU个数。

暂无图片 评论
暂无图片 有用 0
杨卓

你这个等待事件是oracle计算异步io类的等待事件;但是有没有真正的启用异步Io要看你的参数,另外就是需要看你的awr里面的io等待时间。
1.disk_asynch_io,filesystemio_options参数发出来;
2.awr发出来看看
可以参考
https://www.modb.pro/db/21265

暂无图片 评论
暂无图片 有用 0
薯yaya
题主
2022-05-31
已上传截图和awr,谢谢您
薯yaya
暂无图片 评论
暂无图片 有用 0
薯yaya

IO参数截图.jpg

暂无图片 评论
暂无图片 有用 0
杨卓

根据上传的awr
image.png
io很差,当然和数据库有备份也有关系。
参考
How To Check if Asynchronous I/O is Working On Linux (Doc ID 237299.1)
无论 filesystemio_options 参数如何,ASM 固有地执行异步 I/O(文档 ID 751463.1)
Oracle Database - Enterprise Edition - Version 9.0.1.0 to 12.1.0.2 [Release 9.0.1 to 12.1]
你的awr是no rac使用文件系统,排除asm干扰。

那么结合参数看,你这个虽然disk_asynch_io True看起来启用了异步IO,但是由于参数filesystemio_options = none,实际上没有真正的使用异步IO。
Example strace of dbw0 process with AIO enabled (init.ora parameter filesystemio_options = asynch) shows:


io_submit(3071864832, 1, {{0xb7302e34, 0, 1, 0, 21}}) = 1
gettimeofday({1176916625, 58882}, NULL) = 0
io_getevents(-1223102464, 1, 1024, {{0xb7302e34, 0xb7302e34, 8192, 0}}, {600, 0}) = 1

Example strace of dbw0 process with AIO disabled (filesystemio_options = none):


pwrite64(21, “\6\242\0\0004\21\300\0\220B\243\0\0\0\1\6\207\357\0\0\1”…, 8192, 36077568) = 8192
times(NULL) = 1775653082
times(NULL) = 1775653082
pwrite64(21, “\6\242\0\0<\21\300\0\220B\243\0\0\0\1\6\254\0\0\0\2\0*”…, 8192, 36143104) = 8192

建议比较简单,和上面的说的一样,调整参数
设置filesystemio_options参数为ASYNCH
这样数据库真正使用异步IO写,在IO比较差的环境下,可以减少IO类的等待,整体提升数据库性能。

另外就是你的awr log file switch (checkpoint incomplete) 这个是什么原因导致的? 你的日志组数量,日志文件大小这块有没有格式化。 一般建议日志大小是20分钟切换一个redo,日志组一般是1个thread设置10组,当然如果业务很少3组就够了。 你的问题是所有redo都是active,这说明日志文件大小+日志文件组 不够用。
dbca默认3组redo,每个日志文件50M;
group 1 50m 写满;
group 2 50m 写满;
group 3 50m 写满;
这个时候redo需要切换,复用group 1 or group 2;
那这个复用的前提条件是group 1 or group 2对应的buffer cache中的脏块落盘,dbwr写脏块完成。

然后你的系统dbwr写的贼慢!!! 当然redo大小不合理也存在这个问题。 例如dbca默认的情况下150M redo就会发送等待,所有redo都是active. 如果10组redo,每组1g size . 那么redo只有写入100G的时候,才可能出现所有redo都是active 状态。

暂无图片 评论
暂无图片 有用 0
薯yaya
题主
2022-05-31
很详细,谢谢,我再请教下我的centos7.8的操作系统看cat /proc/slabinfo |grep kio的时候只有一行kioctx的结果,没有网上检查异步IO是否成功开启的kiocb这行,这个是什么原因呢,另外目前还没重启库,业务还不让重启。
杨卓

10*1=10g 笔误,可以看看https://www.cnblogs.com/lvcha001/p/9180514.html

暂无图片 评论
暂无图片 有用 0

从你AWR看,一个是对hdi_larexadet_list的delete、insert操作上,产生了buffer waits,一个是RMAN backup & recovery I/O,由于这两个消耗了IO。可以按楼上说的调节参数试下,还有就是SQL优化上的,和开发讨论怎么处理好这样的操作。有些事DBA不背锅。



暂无图片 评论
暂无图片 有用 0
薯yaya
题主
2022-05-31
谢谢您给的建议~~我试试
薯yaya

操作系统检查异步IO截图.png

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
附件列表
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏