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 OCM 和PostgreSQL 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失败

相关推荐
聪明的笨猪猪17 小时前
企业知识库AI架构选型:落地导向的架构决策与组件清单
经验分享·面试·架构·embedding·数据库架构
Go Work19 小时前
两个等值条件摆着,MySQL 偏要全表扫
经验分享·笔记
深圳智根网络程序开发1 天前
WordPress固定链接怎么设?改不对谷歌收录直接崩
经验分享
德思特1 天前
如何提升 5G 移动性切换验证效率?德思特 Amarisoft Callbox 新增 NR SA LTM 测试功能详解
经验分享·无线通信·车载通信
虹科数字化与AR1 天前
农业机械AR质检ROI怎么算?从搬运、测量、返工和交付成本入手
经验分享·ar·质检·农业机械
聪明的笨猪猪2 天前
Java 工程案例:AI 生成 @Async 异步线程池踩坑
java·经验分享·面试·ai编程
仓库日记2 天前
Excel进销存何时该换?用3项检查判断是否需要软件
经验分享·excel·进销存·开单软件
AI工具挖掘机2 天前
开源!2个Skill复刻带货视频、图文和Live,做百号矩阵
经验分享
虹科网络安全3 天前
Redis Radar:在统一视图中掌握 Redis 部署、健康与容量
经验分享·redis·艾体宝·艾体宝it·艾体宝redis
聪明的笨猪猪3 天前
实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑
java·经验分享·面试·ai编程