首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle CPU使用率深度診斷:從系統層面到SQL級別的完整排查體系

     編輯:Oracle 資料庫基礎

前言:CPU是數據庫的「心臟指標」

健康的Oracle服務器在業務高峰期CPU使用率應維持在70-90%:

  • 空閒期>90%:CPU資源不足,需擴容或優化
  • 高峰期<50%:CPU閒置,可能存在I/O瓶頸、鎖等待或配置不足

本文構建「系統→實例→會話→SQL」四層診斷模型,精準定位CPU消耗源頭。

第一層:作業系統級CPU視圖

Linux/Unix:sar命令

# 顯示CPU使用率歷史(每10秒採樣,共10次)
sar -u 10 10

# 關鍵指標解讀
%user   -- 用戶態(Oracle前台/後台進程)
%system -- 系統態(內核調度、系統調用)
%iowait -- I/O等待(高則說明存儲瓶頸)
%idle   -- 空閒

Windows:性能監視器

添加計數器:Processor(_Total)\% Processor Time、Process(oracle.exe)\% Processor Time區分實例佔比。

第二層:實例級CPU消耗分析

核心視圖:V$SYSSTAT

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')
);
  • >90%:CPU主要被Oracle佔用,優化重點在SQL/邏輯
  • <50%:外部進程搶佔CPU,檢查備份、監控Agent、中間件進程

第三層:會話級CPU大戶識別

實時Top SQL腳本

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;

歷史Top SQL(AWR/ASHC)

-- 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;

第四層:SQL解析與執行深度剖析

硬解析風暴診斷

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) → 應接近0
  • 硬解析率 = parse count (hard) / parse count (total) → 應<5%

定位高解析SQL

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表明反復解析,典型原因:

  • 未使用綁定變量(字面量SQL)
  • 游標未緩存(SESSION_CACHED_CURSORS過小)
  • DDL導致游標失效

五大CPU優化實戰策略

策略適用場景實施動作預期收益
綁定變量改造高硬解析、字面量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儀表盤,核心指標:

  • OS CPU:User/System/IOWait/Idle趨勢
  • DB CPU:CPU used by this session增長率
  • 硬解析率、解析CPU佔比
  • Top 10 CPU會話/SQL實時榜單
  • 並行查詢活躍度

總結

CPU診斷遵循「由外而內、由粗到細」:OS確認資源爭用→實例確認DB佔比→會話定位大戶→SQL釐清根因。硬解析風暴是最隱蔽卻破壞力最強的CPU殺手,綁定變量規範化是性價比最高的治本之策。建立分層監控體系,將CPU問題消滅在業務感知前。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved