Ubuntu 上监控 Oracle CPU 使用率
一 监控思路与分层
- 系统层:观察整个 Ubuntu 主机的 CPU 利用率、负载、I/O 等,确认是否为系统资源瓶颈。
- 数据库层:从 Oracle 视角查看实例与会话的 CPU 消耗、Top SQL、等待事件,定位数据库内部热点。
- 历史与告警:使用 AWR/ASH 做时段分析,配合 OEM、Zabbix、Prometheus 等实现可视化与阈值告警。
二 系统层监控命令
- 实时与交互
- top/htop:查看总体与进程 CPU,按 P 按 CPU 排序;htop 更直观(可 apt 安装)。
- vmstat 1:关注 us/sy/id/wa、运行队列与 swap;iostat -x 1:关注 %util 与 await。
- sar 1:若已配置 sysstat,可查看历史 CPU 曲线。
- 一键定位 Oracle 相关进程
- 按进程名:top -p $(pgrep -d’,’ ora_)
- 按监听:ps -C lsnrctl -o %cpu,%mem,pid,cmd(通常 lsnrctl 本身 CPU 不高,异常升高需排查配置与连接风暴)
三 数据库层监控 SQL
- 实例与系统统计
- 系统 CPU 时间:SELECT name, value FROM v$osstat WHERE name IN (‘CPU used by this session’,‘BUSY_TIME’,‘IDLE_TIME’);
- 会话累计 CPU:SELECT se.sid, ses.username, se.value FROM v$sesstat se, v$session ses, v$statname n WHERE n.statistic#=se.statistic# AND se.sid=ses.sid AND n.name=‘CPU used by this session’ ORDER BY value DESC;
- Top SQL 与活跃会话
- Top SQL(按执行时间/CPU/逻辑读/物理读):
- SELECT sql_id, executions, elapsed_time, cpu_time, buffer_gets, disk_reads FROM v$sql WHERE executions>0 ORDER BY elapsed_time DESC FETCH FIRST 10 ROWS ONLY;
- 活跃会话与等待:
- SELECT sid, serial#, username, status, osuser, machine FROM v$session WHERE status=‘ACTIVE’;
- SELECT event, total_waits, time_waited FROM v$system_event ORDER BY time_waited DESC FETCH FIRST 10 ROWS ONLY;
- 时段分析
- 使用 AWR/ASH 生成报告或查询 V$ACTIVE_SESSION_HISTORY,分析指定时间窗口的 CPU 消耗与等待分布。
四 历史与告警方案
- OEM(Oracle Enterprise Manager):图形化查看 CPU、等待、SQL、空间 等,支持阈值告警与性能报告。
- Zabbix:通过 agent 或外部脚本采集 OS/DB 指标,配置触发器与可视化看板。
- Prometheus:使用 oracle_exporter 暴露 Oracle 指标,配合 Grafana 展示与告警。
五 快速排查与优化建议
- 若系统 CPU 高而数据库 CPU 不高:优先排查 I/O(iostat -x)、锁等待、网络或应用并发问题;高负载但 CPU 低的现象也可能出现,需要结合等待事件与 I/O 分析。
- 若数据库 CPU 高:从 Top SQL 入手优化执行计划(索引/统计信息/SQL 改写)、减少全表扫描与高逻辑读;结合 等待事件 判断是否为 CPU 密集型(如并发解析、排序、哈希)并做相应调优。