在Oracle数据库的运维和性能优化中,监控CPU使用率是至关重要的一环。过高的CPU消耗往往会导致系统响应变慢、事务处理延迟,甚至引发宕机风险。因此,掌握如何准确查看和分析Oracle数据库的CPU使用情况,是每位DBA(数据库管理员)必备的技能。本文将详细介绍几种专业的查看方法,并提供扩展的诊断思路。

查看Oracle数据库的CPU使用情况,主要可以通过以下三种途径实现:操作系统级工具、Oracle动态性能视图以及AWR报告(自动工作负载仓库报告)。每种方法各有侧重,通常需要结合使用才能全面了解CPU资源的消耗情况。
一、 使用操作系统工具
这是最直接的方法,可以查看数据库服务器整体的CPU负载。常用的操作系统命令包括:
| 命令/工具 | 主要参数/用法 | 关键输出项 | 说明 |
|---|---|---|---|
| top | 直接运行 `top` | %Cpu(s): us, sy, id, wa | `us`(用户空间CPU), `sy`(内核空间CPU), `id`(空闲), `wa`(等待I/O) |
| vmstat | `vmstat [间隔] [次数]` 如 `vmstat 5 3` | r, us, sy, id, wa | `r`(运行队列), `us/sy/id/wa`同top |
| mpstat | `mpstat -P ALL [间隔] [次数]` | %usr, %sys, %iowait, %idle | 可查看每个CPU核心的利用率 |
| sar | `sar -u [间隔] [次数]` | %user, %system, %iowait, %idle | 历史数据可查看趋势 |
这些工具显示的是整个操作系统的CPU使用情况。如果发现`%us`(用户空间CPU)很高,且主要是Oracle进程(如`ora_`、`oracle`进程)消耗的,那么就需要进一步分析数据库内部的CPU使用情况。
二、 查询Oracle动态性能视图
Oracle提供了丰富的动态性能视图(以`V$`或`GV$`开头),用于监控数据库内部的性能指标,包括CPU消耗:
| 视图/查询 | 关键指标 | 说明 |
|---|---|---|
| V$SYSSTAT | `'CPU used by this session'` `'parse time cpu'` `'recursive cpu usage'` |
显示自实例启动以来,所有会话消耗的总CPU时间(单位:厘秒)。重点关注`'CPU used by this session'`。 |
| V$SESSTAT + V$SESSION | `s.statistic# = st.statistic#` `st.name = 'CPU used by this session'` |
结合`V$SESSION`,可查询具体会话(SID, SERIAL#)消耗的CPU时间。用于定位高CPU会话。 |
| V$SQL / V$SQLSTATS | `CPU_TIME`, `ELAPSED_TIME` | 查看SQL语句消耗的CPU时间和总耗时。`CPU_TIME`高的SQL是优化重点。 |
示例查询当前高CPU会话:
```sql SELECT s.sid, s.serial#, s.username, s.program, st.value / 100 "CPU_SECONDS" FROM v$sesstat st, v$statname sn, v$session s WHERE st.statistic# = sn.statistic# AND sn.name = 'CPU used by this session' AND st.sid = s.sid AND st.value > 0 ORDER BY st.value DESC; ```
三、 分析AWR报告
AWR报告是Oracle提供的强大的性能诊断工具,它定期(默认每小时)收集数据库的性能快照。AWR报告中的Load Profile和Top SQL部分提供了CPU消耗的详细信息:
| AWR报告部分 | 关键CPU指标 | 说明 |
|---|---|---|
| Load Profile | `Per Second`中的`DB Time`、`DB CPU` | `DB CPU`:数据库在用户调用(如SQL执行)和递归调用(如空间管理)上消耗的CPU时间(秒/每秒)。`DB Time`包含等待时间。 |
| Top 5 Timed Foreground Events | `CPU time`事件 | 如果`CPU time`出现在Top 5等待事件中,且等待时间长,表明CPU是瓶颈。 |
| SQL Statistics -> Order by CPU Time | SQL的`CPU Time (s)` | 列出消耗CPU最多的SQL语句,是优化的关键目标。 |
| Instance Efficiency Percentages | `CPU Efficiency %` | 理想情况应接近100%。如果较低,表明CPU可能花费过多时间在非理想工作上(如解析、锁等待)。 |
生成AWR报告的命令:`@?/rdbms/admin/awrrpt.sql`(文本)或`@?/rdbms/admin/awrrpti.sql`(指定实例)。
扩展:CPU高负载的诊断思路
当发现数据库服务器或数据库自身CPU使用率过高时,可以按照以下思路进行诊断:
1. 定位源头:使用操作系统命令确认是系统整体CPU高,还是Oracle进程消耗高。使用`top`或`ps`命令查看具体的Oracle进程。
2. 识别会话:通过查询`V$SESSION`和`V$SESSTAT`,找出消耗CPU最多的数据库会话(SID, SERIAL#)。
3. 分析SQL:关联`V$SESSION`和`V$SQL`,找到高CPU会话正在执行的SQL语句(`SQL_ID`)。
4. 检查执行计划:使用`DBMS_XPLAN`(如`SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('&sql_id', null, 'ADVANCED'));`)查看高CPU SQL的执行计划,判断是否存在全表扫描、低效索引、错误的连接方式等问题。
5. 审查等待事件:检查高负载时的主要等待事件(`V$SYSTEM_EVENT`, `V$SESSION_WAIT`, AWR报告的Top 5事件)。例如,频繁的`latch free`或`library cache`争用也可能间接导致CPU升高。
6. 检查解析:高解析(硬解析)会消耗大量CPU。查看`V$SYSSTAT`中的`parse count (hard)`和`parse time cpu`。
7. 利用AWR/ASH:对于历史问题或需要更长时间范围的分析,详细查看AWR报告或使用ASH报告(`@?/rdbms/admin/ashrpt.sql`)进行更细粒度的分析。
总结
监控Oracle数据库的CPU使用情况是一个多层面的工作。熟练运用操作系统工具、Oracle动态性能视图和AWR报告,DBA可以精准定位CPU消耗的来源,无论是系统瓶颈、低效SQL、解析问题还是内部争用。掌握这些方法并结合科学的诊断思路,是保障Oracle数据库高性能运行的关键。