Oracle 19c RAC I/O等待异常:CPU 100%背后是aio-nr耗尽、io_submit失败

RAC 一个节点 CPU 直接打满,idle 掉到 0、Load Average 飙到 138,现场第一反应永远是:"上 Top SQL!"------可顺着 OS PID 追到 Oracle Session,又看到满屏的 i/o slave wait,执行计划却个个正常。

这条线索把"SQL 把 CPU 打满"的假设直接推翻了:SQL 没毛病,是 Oracle 在调异步 I/O 时,被 Linux 内核的 AIO 资源卡了脖子。

真相在 /proc/sys/fs/aio-nr里:aio-nr=65520几乎贴着 aio-max-nr=65536 的天花板,io_submit 开始失败。

这篇 Oracle 19c RAC 实战,带你走完"OS→进程→Session→内核"的完整证据链。

01

故障背景

某生产环境采用 Oracle Database 19c RAC 架构,共有两个 RAC 节点。

业务运行一段时间后,突然出现:

  • 应用访问数据库明显变慢;

  • 部分业务SQL执行时间明显增加;

  • RAC 整体业务响应变慢;

  • 其中一个 RAC 节点 CPU 使用率接近 100%;

  • OS Load Average 持续升高;

  • 数据库侧大量会话出现 I/O 相关等待。

现场第一反应通常是:CPU 100% → 是否存在高CPU SQL?

但经过逐层排查发现,真正的问题并不是 SQL 执行计划异常,而是Oracle 数据库异步 I/O 所依赖的 Linux AIO 内核资源接近耗尽。

02

第一现场:RAC节点 CPU 100%

首先从操作系统层面确认问题。

典型现场:

可以看到:

说明该节点 CPU 基本处于满负荷状态。

此时不能直接得出:数据库CPU消耗过高。

因为 CPU 100% 只是现象,还需要继续确认到底是什么进程消耗CPU。

03

第二步:确认到底是谁消耗CPU

执行:

或者:

重点观察 Oracle 进程。

典型现场:

进一步查看:

发现大量 CPU 消耗来自:

此时可以确定:CPU压力主要来自 Oracle 数据库进程。

但是这里仍然不能马上认定是 SQL CPU 消耗。

04

第三步:从 OS PID 定位 Oracle

Session

Oracle 19c RAC 中,可以根据 OS PID 找到对应的数据库会话。

首先查看:

例如:

这样就完成了:

这一步非常重要。

因为 DBA 不能只看到:

就直接去优化 SQL。

必须继续往 Oracle 内部追。

05

第四步:检查等待事件

进一步检查当前会话:

如果现场出现大量 I/O 相关等待,例如:

那么诊断方向就发生变化。

现在的问题已经不是:"哪个 SQL 把 CPU 打满?"

而应该变成:"为什么大量 Oracle 会话在进行 I/O 的同时,Oracle 进程出现异常的 CPU 消耗?"

06

第五步:不要看到等待事件就直接

优化SQL

此时选择几个 CPU 使用率较高的 Oracle 进程进行分析。

根据 PID 定位:

发现这些 Session 对应的 SQL 比较类似。

于是最容易产生一个误判:是不是这个 SQL 本身存在性能问题?

于是进一步检查 SQL。

07

第六步:检查 SQL 执行计划

Oracle 19c 可以通过:

重点关注:

  • 执行计划是否发生变化;

  • 是否出现全表扫描;

  • 是否存在异常Nested Loop;

  • 实际行数与估算行数是否严重偏差;

  • Buffer Gets;

  • Physical Reads;

  • A-Time;

  • Starts;

  • 是否存在大量临时表空间操作。

例如:

从执行计划来看:

  • SQL本身执行路径合理;

  • 行数估算基本正常;

  • 索引访问正常;

  • 没有明显的执行计划异常;

  • 单次SQL执行时间并不高。

因此可以暂时排除:单纯由于执行计划异常导致CPU 100%。

08

第七步:开始怀疑Oracle I/O

机制

此时需要换一个思路。

现场出现:

那么需要继续检查:Oracle执行I/O的时候发生了什么?

Oracle 19c 在 Linux 平台上通常会使用异步 I/O 等机制。

因此需要检查 Oracle I/O 相关参数。

例如:

继续检查:

例如:

这说明 Oracle 正在使用异步 I/O。

09

第八步:检查Oracle Trace中的

AIO异常

这一步是整个案例最关键的转折点。

针对异常 Oracle Process,可以使用:

然后:

并获取 Trace 文件位置:

Oracle 19c 中也可以结合 ADR 查看:

例如:

在 Process State / Trace 中发现类似异常信息:

此时整个问题开始清晰起来:

10

第九步:检查Linux AIO资源

继续从操作系统检查:

以及:

例如现场:

可以看到:

说明系统当前可用的异步 I/O 资源已经非常紧张。

这与 Oracle Trace 中出现的:

以及:

能够形成完整的证据链。

11

第十步:形成最终根因

至此可以排除几个常见方向:

不是单纯CPU不足

虽然表现为:

但 CPU 高并不是根因。

不是单条SQL执行计划异常

检查多个高CPU会话对应的 SQL 后:

  • 执行计划正常;

  • SQL本身执行效率正常;

  • 没有发现明显的计划突变;

  • 没有发现异常的全表扫描或笛卡尔积。

不是单纯磁盘IO慢

如果只是存储性能下降,通常应该重点观察:

以及:

但本案例最关键的证据并不是磁盘响应时间,而是:

12

最终根因

最终定位为:Oracle 19c RAC节点所在Linux操作系统的异步I/O资源配置不足,AIO资源接近耗尽,导致Oracle异步I/O请求受到限制,进一步引发Oracle进程异常处理和大量I/O相关等待,最终表现为RAC节点CPU异常升高、系统Load持续升高以及业务响应变慢。

整个故障链条可以总结为:

13

处理方案

首先确认当前参数:

临时调整:

检查:

确认:

然后持续观察:

同时观察:

以及 Oracle:

重点确认:

14

永久配置

如果确认调整后的参数能够解决问题,需要写入系统配置。

例如:

执行:

确认:

实际生产环境中,具体参数值不能机械照搬,需要结合:

  • Oracle实例数量;

  • RAC节点数量;

  • 并发Session;

  • 数据库I/O规模;

  • 存储架构;

  • Oracle版本;

  • Linux内核版本;

  • 当前 aio-nr 使用情况;

综合评估。

15

这个案例最值得DBA学习的地方

这个案例最大的价值,并不是记住:

而是学习故障定位思维。

很多 DBA 看到:

第一反应就是:

但这个案例说明:CPU 100%只是现象,不一定意味着SQL在消耗CPU。

正确的诊断路径应该是:

也就是说:DBA诊断性能问题,不能只盯着SQL,要建立"OS → Oracle进程 → Session → Wait Event → SQL → 内核资源"的完整证据链。

16

Oracle 19c RAC生产故障诊断

检查清单

出现"RAC节点CPU 100%"时,可以按照下面的顺序排查:

第一层:OS

确认:

第二层:RAC实例

确认到底是:

还是:

出现异常。

第三层:Session

第四层:Top SQL

第五层:执行计划

第六层:Oracle进程

根据 OS PID:

第七层:Process State

重点关注:

第八层:Linux内核资源

重点检查:

形成最终判断:

17

DBA最终应该记住的一句话

Oracle 19c RAC出现CPU 100%,不要看到CPU高就直接去找"高CPU SQL"。

真正成熟的排障方式是:先确认CPU是谁消耗的,再确认Oracle进程在干什么;再结合等待事件判断问题属于CPU、I/O、锁还是资源限制;最后把Oracle内部证据和OS层证据串起来。

本案例最终形成的证据链就是:

写在最后

这篇案例最该刻进 DBA DNA的一句话:CPU 100% 只是现象,不一定等于 SQL 在吃 CPU------先确认 CPU 被谁消耗,再看 Oracle 进程在等什么,最后把 Oracle 内部证据和 OS 内核资源串成一条链。

本例根因是 Linux AIO 配额(fs.aio-max-nr)耗尽,而 sysctl -w fs.aio-max-nr=1048576只是止血,具体值得按实例数 / RAC 节点 / 并发量重新评估,别照抄。

记住那个黄金排查顺序:OS → Oracle 进程 → Session → Wait Event → SQL_ID → 执行计划 → Process State → OS 内核资源。

看到 CPU 高就直奔 Top SQL,是最容易白忙活的诊断姿势。

作者介绍

大家好,我是刘峰,安丫科技创始人,一名专注数据库实战的技术讲师与顾问。

我拥有 Oracle OCMPostgreSQL ACE 双认证 ,同时是 PostgreSQL 中国分会官方授权讲师

技术栈覆盖主流商业库Oracle、SQL Server、MySQL,开源库 PostgreSQL,以及国产数据库 OceanBase、达梦、瀚高等产品。

过去十余年,我深度参与了电信、金融、政务、制造、互联网等多个行业的数据库项目。

完整经历过从传统 Oracle、MySQL 架构向 PostgreSQL、分布式数据库、国产信创库的技术演进与迁移实战。

项目交付内容涵盖数据库安装部署、备份恢复、巡检监控、高可用建设、性能调优、版本升级、异构迁移以及运维规范建设等多个方向。

性能优化与故障诊断方面,我积累了大量实战经验。

从慢查询诊断、执行计划分析、索引优化、参数调优,到故障根因定位、应急处理,能够快速定位问题并给出可落地的解决方案。

特别是在跨数据库平台的性能对比与优化适配上,形成了一套相对系统的方法论。

除项目交付外,我也长期投入企业数据库技术培训工作。

面向 DBA 团队、开发团队和运维团队开展专题课程,内容包括 PostgreSQL 运维与调优、Oracle 数据库管理、MySQL 性能优化、国产数据库迁移适配、SQL 调优方法论、故障案例分析等。

安呀智数据坊|我们能做什么

无论你是业务系统的技术负责人,还是数据部门的第一响应人,我们都能为你提供可靠的支持:

  • 数据库类型支持

Oracle / MySQL / PostgreSQL / SQL Server 等主流数据库

  • 核心服务内容

性能优化 / 故障处理 / 数据迁移 / 备份恢复 / 版本升级 / 补丁管理

  • 系统性支持

深度巡检 / 高可用架构设计 / 应用层兼容评估 / 运维工具集成

  • 专项能力补充

定制课程培训 / 甲方团队辅导 / 复杂问题协作排查 / 紧急救援支持

【安呀智数据坊·应急响应中心】

数据库故障往往发生在那 1% 的不可控时刻。

如果你正面临生产库崩溃、误操作导致数据丢失,且通过常规手段无法解决,请直接联系我们。

服务承诺: 我们秉承**"问题解决为先,方案闭环为本"**的服务理念。

安全底线: 全程签署企业级保密协议(NDA),保障数据安全是我们的第一铁律。

技术支援: 拥有 Oracle ACE 专家带队的"十五年数据库急诊"团队。

END


本文涉及关键词:

Oracle 19c RAC、CPU 100%、aio-max-nr、aio-nr、Linux AIO、异步 I/O、io_submit failed、i/o slave wait、oradebug processstate、fs.aio-max-nr、RAC 节点 CPU、gv$session、等待事件、内核资源耗尽、Oracle 性能诊断

原文链接:Oracle 19c RAC I/O等待异常:CPU 100%背后是aio-nr耗尽、io_submit失败

相关推荐
天工开户013 小时前
Facebook Ads 里开始出现付款状态计数器了
经验分享·facebook
童园管理札记3 小时前
CSDN 学前入门高质量指南:从零搭建编程学习体系
人工智能·经验分享·职场和发展·生活·学习方法
blue_ice .3 小时前
DDS原理及简易实现
开发语言·经验分享·笔记·嵌入式硬件·fpga开发
bug嘛我经常写4 小时前
MIKE21结合ArcGIS制作随时间变化的降水文件(.dfs2)-笔记
经验分享·笔记·arcgis
David猪大卫13 小时前
【C++修炼】智能指针使用及原理
开发语言·c++·经验分享·笔记·学习·考研·面试
luj_176821 小时前
一线一区一变破解人盯人防守密码
开发语言·网络·c++·经验分享·算法
luj_176821 小时前
中锋卡位与开放线博弈
c语言·开发语言·网络·经验分享·算法
tianxuanjg21 小时前
工业/协作机器人不锈钢精密零件批量加工难点与量产解决方案
人工智能·经验分享·机器人·无人机·制造
迪康coolmu1 天前
企业文档防泄密五层防护实战:基于迪康端点安全一体化管理系统的设计与落地
运维·经验分享·安全