最近一天下午块下班时手机和邮件连续收到zabbix监控告警,提示同城机房某生产交易库asm日志有报错,报错信息如下:
[phx-hg-silk-db-oracle]oracle ora asm log error(s) found on phx-h-db-oracle-10.1.4.80-silkord1: problem (value: ora-27090: unable to reserve kernel resources for asynchronous disk i/o
ora-27090: unable to reserve kernel resources for asynchronous disk i/o。
该生产数据库是一套11g rac集群,前期这套数据库两台物理服务器硬件过保,过保之前使用的是centos 6操作系统,新采购的服务器无法安装centos 6,于是部署了centos 7.9操作系统,前期通过搭建dg并进行主备切换将过保服务器进行了替换,在系统替换前未出现同类报错信息。
于是登录该数据库环境,查看日志,显示只有节点一asm日志有此报错,报错信息如下:
errors in file /u01/app/grid/diag/asm/ asm/ asm1/trace/ asm1_ora_230236.trc:
ora-27090: unable to reserve kernel resources for asynchronous disk i/o
linux-x86_64 error: 2: no such file or directory
additional information: 3
additional information: 128
additional information: 1
sat apr 22 06:06:52 2023
errors in file /u01/app/grid/diag/asm/ asm/ asm1/trace/ asm1_ora_84473.trc:
ora-27090: unable to reserve kernel resources for asynchronous disk i/o
linux-x86_64 error: 2: no such file or directory
additional information: 3
additional information: 128
additional information: 1
sat apr 22 08:06:34 2023
errors in file /u01/app/grid/diag/asm/ asm/ asm1/trace/ asm1_ora_99517.trc:
ora-27090: unable to reserve kernel resources for asynchronous disk i/o
linux-x86_64 error: 2: no such file or directory
additional information: 3
additional information: 128
additional information: 369362919
sat apr 22 08:06:52 2023
errors in file /u01/app/grid/diag/asm/ asm/ asm1/trace/ asm1_ora_100200.trc:
ora-27090: unable to reserve kernel resources for asynchronous disk i/o
linux-x86_64 error: 11: resource temporarily unavailable
additional information: 3
additional information: 128
从问题出现当天下午16点出现报错后,频繁报错,每隔几分钟报错一次。
查询网上及mos资料,显示ora-27090: unable to reserve kernel resources for asynchronous disk i/o和操作系统aio设置相关。
查询到当前aio-nr和aio-max-nr信息如下:
[root@xxxxx ~]# cat /proc/sys/fs/aio-max-nr
1048576
[root@xxxx ~]# cat /proc/sys/fs/aio-nr
1047552
aio-nr是在io_setup系统调用上为所有当前活动的aio上下文指定的事件数的运行总数。如果aio-nr达到aio-max-nr,那么io_setup将因eagain而失败。
知识点:
在linux中,"aio-nr"是指异步输入输出(asynchronous i/o)操作的数量。异步i/o是一种在进行文件操作时,可以在操作完成之前继续执行其他任务的机制。通过异步i/o,应用程序可以发起i/o操作,然后继续执行其他任务,而不需要等待操作完成。
"aio-nr"是linux内核中的一个统计指标,表示当前系统中活动的异步i/o操作的数量。它反映了系统正在处理的异步i/o操作的负载情况。
异步i/o可以提高系统的性能和响应能力,特别是在需要处理大量i/o操作的高负载环境中。通过异步i/o,应用程序可以更有效地管理和利用系统资源,并提高对外部设备的访问效率。
"aio-max-nr"参数的作用是限制系统中可以同时进行的异步i/o操作的数量,以控制对系统资源的使用。它定义了系统所能支持的最大异步i/o操作数目,超过这个限制的操作将被拒绝。
通过适当配置"aio-max-nr"参数,可以平衡系统性能和资源利用的需求。如果应用程序需要大量的异步i/o操作,可能需要增加这个限制,以确保系统能够处理足够的异步i/o请求。但是,过高的限制可能会导致资源过度消耗。因此,这个参数的设置应该根据系统的特定需求和资源状况进行调整。
通过查询报错日志里的trc文件初步判定和定时监控asm_diskgroup相关。
[root@xxxx ~]# more /u01/app/grid/diag/asm/ asm/ asm1/trace/ asm1_ora_171522.trc
trace file /u01/app/grid/diag/asm/ asm/ asm1/trace/ asm1_ora_171522.trc
oracle database 11g enterprise edition release 11.2.0.4.0 - 64bit production
with the real application clusters and automatic storage management options
oracle_home = /u01/app/11.2.0/grid
system name: linux
node name: ph-silk-primary-db1
release: 3.10.0-1160.el7.x86_64
version: #1 smp mon oct 19 16:18:59 utc 2020
machine: x86_64
instance name: asm1
redo thread mounted by this instance: 0
oracle process number: 33
unix process pid: 171522, image: oracle@ph-silk-primary-db1 (tns v1-v3)
*** 2023-04-23 09:07:33.222
*** session id:(64.55981) 2023-04-23 09:07:33.222
*** client id:() 2023-04-23 09:07:33.222
*** service name:() 2023-04-23 09:07:33.222
*** module name:(sqlplus@ph-silk-primary-db1 (tns v1-v3)) 2023-04-23 09:07:33.222
*** action name:() 2023-04-23 09:07:33.222
warning:could not increase the asynch i/o limit to 256 for kfdparallelio.
*** 2023-04-23 09:07:33.222
dbkeddefdump(): starting a non-incident diagnostic dump (flags=0x0, level=1, mask=0x0)
----- error stack dump -----
ora-27090: unable to reserve kernel resources for asynchronous disk i/o
linux-x86_64 error: 11: resource temporarily unavailable
additional information: 3
additional information: 128
additional information: 386140135
----- current sql statement for this session (sql_id=7v21cmm3d7z26) -----
select name,state from v$asm_diskgroup
----- call stack trace -----
calling call entry argument values in hex
location type point (? means dubious value)
-------------------- -------- -------------------- ----------------------------
skdstdst() 41 call kgdsdst() 000000000 ? 000000000 ?
7ffeb42e36d0 ? 7ffeb42e37a8 ?
7ffeb42e8250 ? 000000002 ?
ksedst1() 103 call skdstdst() 000000000 ? 000000000 ?
7ffeb42e36d0 ? 7ffeb42e37a8 ?
7ffeb42e8250 ? 000000002 ?
根据mos建议,对该台服务器aio-max-nr调整为一个较大值,如下所示。
另可参照https://blog.pythian.com/troubleshooting-ora-27090-async-io-errors/ 这篇文章。
sysctl -w fs.aio-max-nr=50000000
[root@xxxx~]# cat /proc/sys/fs/aio-nr
1048576
[root@xxxx~]# cat /proc/sys/fs/aio-max-nr
50000000
为安全起见,先在测试环境进行了验证测试,待观察一段时间后没问题,在征得同意后对生产环境进行了修改。
aio-max-nr的修改无需重启操作系统。
因为该生产环境是rac环境,为保证两台环境参数尽可能一致,也对另一台未出现问题的服务器进行了同样修改。
修改后,告警消除,连续观察几天,也未再产生告警。