operating system statistics是awr中反映数据库物理底座健康的关键部分,需结合趋势与业务时段分析:free_memory_bytes持续单向下降且inactive_memory_bytes未同步上升时,需排查非oracle进程;swap_free_bytes剩余量大不等于安全,须补查swap_used_bytes是否增长;iowait_time占比超5%或load升高而user_time占比低,提示io或内核态瓶颈;tcp_receive_size与global_receive_size_max不匹配可能引发rac网络延迟;os指标“全正常”时易掩盖瞬时问题,需结合ash秒级采样验证。
awr报告里的operating system statistics不是摆设,它直接反映数据库运行的物理底座是否健康。如果cpu、内存、i/o这些底层指标异常,再优化sql也白搭。
怎么看FREE_MEMORY_BYTES和SWAP_FREE_BYTES是否危险
这两个值不能只看绝对数字,得结合变化趋势和业务时段判断:
-
FREE_MEMORY_BYTES从151G降到150G看似微小,但如果在2小时快照窗口内持续单向下跌,且INACTIVE_MEMORY_BYTES没同步上升,就要查是否有非Oracle进程(比如备份脚本、日志轮转)悄悄吃掉内存 -
SWAP_FREE_BYTES剩68G不代表安全——关键看SWAP_USED_BYTES有没有在增长。AWR里不直接显示这个值,得用SELECT * FROM V$OSSTAT WHERE STAT_NAME IN ('SWAP_USED_BYTES')补查;一旦发现Swap使用量上升,哪怕只有几百MB,也要立刻检查SGA_TARGET和PGA_AGGREGATE_LIMIT是否设得过大,挤压了系统缓存空间 - Linux上
/proc/meminfo里的Active(anon)和Inactive(anon)比AWR的INACTIVE_MEMORY_BYTES更细粒度,建议在怀疑内存泄漏时同步比对
CPU指标中BUSY_TIME和IOWAIT_TIME谁更值得盯
别被BUSY_TIME(1293万)和IDLE_TIME(2.69亿)的巨大差距迷惑——真正要警觉的是IOWAIT_TIME(12580)和LOAD(从4升到9)的组合:
-
IOWAIT_TIME数值本身低,但若它占BUSY_TIME比例超过5%,就说明CPU在等IO,这时DB Time高大概率是磁盘拖慢的,不是SQL问题 -
LOAD升高而USER_TIME占比不高(当前仅1200万/1293万≈93%),反而说明负载集中在内核态或等待态,要重点翻Top 5 Timed Events里有没有db file sequential read或log file sync -
NUM_CPUS是112,但NUM_CPU_CORES只有56,意味着超线程开启。如果DB CPU长期卡在55%左右上不去,可能是某些SQL绑定了特定核心导致调度不均,需检查V$OSSTAT里的NUM_CPUS_ONLINE是否等于112
TCP_RECEIVE_SIZE_MAX这类网络参数怎么关联到AWR异常
AWR本身不监控网络包大小,但当出现大量gc cr block lost或gc buffer busy acquire(RAC环境)时,GLOBAL_RECEIVE_SIZE_MAX(4MB)和TCP_RECEIVE_SIZE(默认128KB)的不匹配就是元凶:
- Oracle RAC节点间传输数据块默认走UDP,但实际常回落到TCP。如果
TCP_RECEIVE_SIZE远小于GLOBAL_RECEIVE_SIZE_MAX,内核会频繁分片重组,增加延迟和丢包概率 - 验证方法:在节点上跑
ss -i看实际TCP socket的rcv_space是否接近TCP_RECEIVE_SIZE;若远小于此值,说明应用层没触发自动调优,需手动调大net.ipv4.tcp_rmem - 注意:改完内核参数后,必须重启数据库实例才能让Oracle读取新值,单纯重连客户端无效
OS Statistics最易被忽略的点是它不报错——所有指标都在“合理范围”内时,反而最难定位问题。比如IOWAIT_TIME低但LOAD高,可能只是存储队列深度压到了临界点,AWR快照间隔(默认1小时)根本捕获不到瞬时毛刺。这时候得切到ASH按秒级采样,再回溯OS指标。











