cpu%和load average衡量维度不同,不可直接比较:cpu%反映实际cpu时间占比,load average体现就绪队列与不可中断进程数。
os stats里cpu%和load average数值对不上,哪个更可信?
awr报告中os stats部分的cpu utilization %和load average经常让人困惑:一个显示25%,另一个却标着8.4——这台8核机器到底忙不忙?答案是:它们衡量的根本不是一回事,不能直接比。cpu utilization %是oracle从/proc/stat算出的**实际cpu时间占比**(用户+系统态),而load average是从/proc/loadavg读的**就绪队列+不可中断状态进程的平均数量**,反映的是“有多少任务在排队等资源”。
实操建议:
- 看瓶颈先盯
CPU utilization %:持续 > 90% 说明CPU真饱和;但若它只有40%而Load Average长期 > CPU核数×2,大概率是I/O或锁导致进程卡在D(uninterruptible sleep)状态 -
Load Average三个值(1/5/15分钟)要一起看:如果1分钟值远高于15分钟,说明突发负载刚发生;反之则可能已持续过载 - 别只信AWR里的汇总值——它采样间隔默认是1小时,错过短时尖峰。用
adb -w 1 5或mpstat -P ALL 1 5现场抓实时数据交叉验证
为什么AWR里Load Average始终为0?
常见于Linux 2.6+内核但数据库版本较老(如10g R2、11.1.0.x),Oracle未正确解析/proc/loadavg格式。从2.6起该文件前3个字段是空格分隔,而旧版Oracle仍按制表符解析,导致截断失败,最终填入0。
实操建议:
- 手动检查:
cat /proc/loadavg确认输出是否为0.12 0.25 0.33 1/256 12345这类空格分隔格式 - 升级数据库补丁:11.2.0.3及以上版本已修复;10g需打
10.2.0.5 Patch Set或单独的Loadavg Parsing Fix(补丁号如9789725) - 临时绕过:用
DBMS_WORKLOAD_REPOSITORY手工插入自定义统计,或改用GV$OSSTAT查LOAD列(注意该视图字段名是LOAD,不是LOAD_AVERAGE)
OS Stats中的CPU%为何比top里看到的低很多?
AWR的CPU utilization %只统计Oracle进程自身消耗的CPU时间(即user + system time),而top默认显示的是整个系统的CPU使用率(含其他进程、中断、软中断)。更关键的是:AWR每小时只采样一次,且计算逻辑是(delta_cpu_time / delta_elapsed_time) × 100%,如果采样窗口内有大量空闲期,均值就被拉低了。
实操建议:
- 对比时必须用同粒度数据:
top -b -n 1 | grep 'Cpu(s)'取瞬时值,不能和AWR小时均值硬比 - 查真实Oracle开销:连到数据库执行
SELECT value/100 FROM v$sysmetric WHERE metric_name = 'CPU Usage Per Sec',这个才是每秒Oracle实际占的CPU毫秒数 - 注意虚拟化环境:Xen/KVM下
/proc/stat的cpu行可能被宿主机调度器干扰,此时OS Stats的CPU%会系统性偏低,应优先参考vmstat 1的us+sy列
Load Average高但CPU%低,下一步该查什么?
这是典型的非CPU瓶颈信号,重点不是优化SQL,而是定位阻塞源。Load Average高但CPU%低,说明大量进程在等待——最常见的是磁盘I/O、NFS挂载点卡住、或大量进程陷入D状态等锁。
实操建议:
- 立刻跑:
ps -eo pid,ppid,stat,%cpu,%mem,time,comm | awk '$3 ~ /D|UN/ {print}' | head -20,找状态含D(uninterruptible sleep)的进程 - 查I/O压力:
iostat -x 1 3看%util是否接近100%,以及await是否异常高(> 50ms需警惕) - 检查锁等待链:
SELECT * FROM gv$session WHERE state = 'WAITING' AND event LIKE 'enq:%' OR event LIKE 'latch%',尤其关注enq: TX - row lock contention或latch: cache buffers chains - 别忽略网络存储:NFS客户端卡在
rpc_wait_bit_killable也会推高Load,用showmount -e和rpcinfo -p快速验连通性
Load Average本身不带上下文,它只是个“警报灯”。真正要动手的,永远是那个卡在D状态的ora_pmon_进程,或者那条没加索引却在全表扫的UPDATE语句。










