健康的Oracle服務器在業務高峰期CPU使用率應維持在70-90%:
本文構建「系統→實例→會話→SQL」四層診斷模型,精準定位CPU消耗源頭。
# 顯示CPU使用率歷史(每10秒採樣,共10次)
sar -u 10 10
# 關鍵指標解讀
%user -- 用戶態(Oracle前台/後台進程)
%system -- 系統態(內核調度、系統調用)
%iowait -- I/O等待(高則說明存儲瓶頸)
%idle -- 空閒
添加計數器:Processor(_Total)\% Processor Time、Process(oracle.exe)\% Processor Time區分實例佔比。
SELECT name, value
FROM v$sysstat
WHERE name IN (
'CPU used by this session', -- Oracle消耗CPU總時間(百分之一秒)
'OS User level CPU time', -- OS用戶態CPU時間
'OS System call CPU time' -- OS系統態CPU時間
);
-- Oracle佔OS總CPU比例
SELECT
(cpu_used / (os_user + os_sys)) * 100 AS oracle_cpu_pct
FROM (
SELECT
MAX(DECODE(name,'CPU used by this session',value)) cpu_used,
MAX(DECODE(name,'OS User level CPU time',value)) os_user,
MAX(DECODE(name,'OS System call CPU time',value)) os_sys
FROM v$sysstat
WHERE name IN ('CPU used by this session','OS User level CPU time','OS System call CPU time')
);
SELECT
s.sid, s.serial#, s.username, s.module, s.machine,
ss.value/100 cpu_seconds,
sql.sql_text
FROM v$session s
JOIN v$sesstat ss ON s.sid = ss.sid
JOIN v$statname sn ON ss.statistic# = sn.statistic#
LEFT JOIN v$sql sql ON s.sql_id = sql.sql_id
WHERE sn.name = 'CPU used by this session'
AND s.status = 'ACTIVE'
AND s.type != 'BACKGROUND'
ORDER BY ss.value DESC
FETCH FIRST 10 ROWS ONLY;
-- AWR報告:@?/rdbms/admin/awrrpt.sql
-- ASH即時分析
SELECT sql_id, COUNT(*) samples, ROUND(COUNT(*)/10,2) active_seconds
FROM v$active_session_history
WHERE sample_time > SYSDATE - 1/24 -- 最近1小時
AND session_type = 'FOREGROUND'
GROUP BY sql_id
ORDER BY samples DESC
FETCH FIRST 20 ROWS ONLY;
SELECT
name, value,
CASE name
WHEN 'parse time cpu' THEN '解析CPU時間'
WHEN 'parse time elapsed' THEN '解析響應時間'
WHEN 'parse count (hard)' THEN '硬解析次數'
END descn
FROM v$sysstat
WHERE name IN ('parse time cpu','parse time elapsed','parse count (hard)');
(parse time elapsed - parse time cpu) / parse count (hard) → 應接近0parse count (hard) / parse count (total) → 應<5%SELECT sql_text, parse_calls, executions,
ROUND(parse_calls/NULLIF(executions,0),2) parse_per_exec
FROM v$sqlarea
WHERE parse_calls > 1000
ORDER BY parse_calls DESC
FETCH FIRST 20 ROWS ONLY;
parse_per_exec >> 1表明反復解析,典型原因:
SESSION_CACHED_CURSORS過小)| 策略 | 適用場景 | 實施動作 | 預期收益 |
|---|---|---|---|
| 綁定變量改造 | 高硬解析、字面量SQL | 應用層改用PreparedStatement;或CURSOR_SHARING=FORCE | 硬解析降低80%+ |
| 增加SESSION_CACHED_CURSORS | 軟解析高、重複SQL多 | ALTER SYSTEM SET session_cached_cursors=200 SCOPE=SPFILE | 軟解析減少50%+ |
| SQL計劃優化 | 高CPU消耗SQL | 索引優化、改寫、Hint、分區裁剪 | 單SQL CPU降低90%+ |
| 鎖爭用消除 | 高CPU伴隨enq等待 | 縮短事務、行級鎖優化、應用邏輯調整 | CPU利用率提升30%+ |
| 並行度適配 | 大查詢佔用過多CPU | 限制PARALLEL_MAX_SERVERS、RESOURCE_MANAGER管控 | 避免CPU過載 |
建議構建Grafana/Prometheus儀表盤,核心指標:
CPU used by this session增長率CPU診斷遵循「由外而內、由粗到細」:OS確認資源爭用→實例確認DB佔比→會話定位大戶→SQL釐清根因。硬解析風暴是最隱蔽卻破壞力最強的CPU殺手,綁定變量規範化是性價比最高的治本之策。建立分層監控體系,將CPU問題消滅在業務感知前。