AWR中OS CPU Utilization高不等于数据库满负荷计算,因其统计的是Oracle进程组总CPU占用,与DB CPU(真实SQL执行耗时)逻辑不同;需先看DB CPU/DB Time比值及AAS,再结合硬解析、Latch争用、OS层其他进程等排查。
AWR里OS CPU Utilization高 ≠ 数据库真在满负荷计算
awr报告中出现“os cpu utilization”偏高(比如 >80%),第一反应不是“sql太慢”,而是要确认这个值到底反映什么。它来自操作系统层面的vmstat或sar -u采集,和数据库内部的db cpu是两套统计逻辑——前者是os看到的整个oracle进程组的cpu占用总和,后者是oracle自己核算的、真正花在sql执行/解析等数据库操作上的时间。
常见误判场景:
- 多个后台进程(如
ora_mmon_、ora_pmon_)在做内存管理、清理、自动任务,它们吃CPU但不计入DB CPU,却拉高OS层统计 - 应用连接池空闲时仍维持大量长连接,每个连接对应一个
ora_进程,即使没跑SQL,也会有轻量级上下文切换开销 - Linux内核版本较老(如RHEL6),
perf_event_paranoid设为2,导致Oracle无法准确上报DB CPU,AWR被迫用OS采样值“凑数”
先看DB CPU占比,再决定要不要查OS CPU
打开AWR报告,在Time Model Statistics部分找这两行:
-
DB CPU:数据库实际消耗的CPU时间(单位:秒) -
DB Time:所有活动会话消耗的总时间(含等待、CPU、IO等)
真正关键的是比值:DB CPU / DB Time。如果这个值 70% 且Average Active Sessions (AAS)显著高于物理CPU核数(例如12核机器AAS > 16),才需要深挖CPU相关SQL。
注意:DB CPU是累计值——12核机器1秒最多贡献12秒DB CPU;报告里写“DB CPU = 43200秒”(即12小时),只代表平均下来每秒用了12秒CPU,刚好打满。
OS CPU高但DB CPU低?重点查硬解析和Latch争用
这种组合(OS CPU高 + DB CPU低 + Top 5等待事件里有latch: shared pool或cursor: pin S)几乎可以锁定是硬解析泛滥。Oracle把大量CPU耗在抢闩锁、校验SQL文本、生成执行计划上,而不是执行SQL本身。
验证步骤:
- 查
Instance Efficiency Percentages里的Parse CPU to Parse Elapsd %:低于20%说明解析过程卡在等待,不是真计算 - 算硬解析比例:
parse count (hard) / parse count (total)> 10% 就属异常 - 检查应用是否漏用绑定变量:抓
v$sql里sql_text相似但address不同的语句,比如WHERE id = 123和WHERE id = 456反复硬解析
别忽略OS层的真实瓶颈线索
AWR里的OS CPU数据虽不直接等于数据库负载,但它暴露了底层资源真实压力。如果OS CPU持续 >90%,而DB CPU占比又不高,就得跳出数据库看:
- 用
sar -u 1 10确认是不是其他进程(如备份脚本、监控agent、同机部署的Java服务)在抢CPU - 检查
/proc/<pid>/stat</pid>里oracle进程的utime(用户态时间)和stime(内核态时间):如果stime占比突增,可能是频繁系统调用(如大量小IO、缺页中断)导致内核忙 - 确认NUMA节点绑定是否合理:RAC环境下若实例被调度到远离其SGA内存的CPU节点,会引发跨节点访问延迟,表现为OS CPU高但DB效率低
AWR的OS CPU字段本身不带上下文,它只是个触发器——提醒你该去sar、perf或/proc里翻原始证据了。











