题
Oracle 视图 V$OSSTAT 保存一些操作统计信息,包括:
- IDLE_TICKS 处理器空闲的百分之一秒数(所有处理器的总和)
- BUSY_TICKS 处理器忙于执行用户或内核代码的百分之一秒数,所有处理器的总和
我读过的文档并不清楚这些是否被重置。有人知道吗?
我的另一个问题是我想计算出系统正在经历的平均 CPU 负载。为此,我希望我必须去:
busy_ticks / (idle_ticks + busy_ticks)
它是否正确?
11 月 8 日更新
Oracle 10g r2 在该表中包含一个名为 LOAD 的统计数据。它提供读取该值时机器的当前负载。这比使用其他信息要好得多,因为 *_ticks 数据是“自实例启动以来”而不是当前时间点。
解决方案
如果可用,您需要包含“IOWAIT_TICKS”。
IDLE_TICKS-处理器已闲置的一秒钟数量,总计在所有处理器上
BUSY_TICKS - 百分之一秒的数 处理器一直忙于执行 用户或内核代码,总计 处理器
IOWAIT_TICKS - 百分之一秒的数目 处理器一直在等待 I/O 完整,总 LED 总 处理器
这是一个查询。
SELECT (select value from v$osstat where stat_name = 'BUSY_TICKS') /
(
NVL((select value from v$osstat where stat_name = 'IDLE_TICKS'),0) +
NVL((select value from v$osstat where stat_name = 'BUSY_TICKS'),0) +
NVL((select value from v$osstat where stat_name = 'IOWAIT_TICKS'),0)
)
FROM DUAL;
在 10.2 及更高版本中,名称 _TICKS 已更改为 _TIME。
当数据库实例关闭时,动态视图中的累积值将被重置。
其他提示
我不相信我需要包含 USER_TICKS 和 SYS_TICKS。
BUSY_TICKS 的文档指出:
"...been busy executing user or kernel code, totalled over all processors"
这表明 BUSY_TICKS 已经包含 USER_TICKS 和 SYS_TICKS。
NICE_TICKS 也是如此 - 这仍然是用户时间(只是优先级较低)。
不过,包括 IOWAIT_TICKS 似乎是必要的。
想想看,如果我的目的是了解总体机器负载,我可能最好在分子和分母中包含 IOWAIT_TICKS,以了解我的工作不可用的 CPU 时间量。
SELECT (
(select value from v$osstat where stat_name = 'BUSY_TICKS') +
(select value from v$osstat where stat_name = 'IOWAIT_TICKS'))
/
(
NVL((select value from v$osstat where stat_name = 'IDLE_TICKS'),0) +
NVL((select value from v$osstat where stat_name = 'BUSY_TICKS'),0) +
NVL((select value from v$osstat where stat_name = 'IOWAIT_TICKS'),0)
)
FROM DUAL;
这将确保如果机器的 IO 争用或等待率较高,我不会被误导,并且会通过运行更多作业来加剧问题。
取决于你的观点。知道你追求什么,我认为你是对的。
您对“忙碌”值的看法是正确的。我检查了我的一个系统,Busy 等于 User + Sys。
我还确认了我的系统上所有时间都处于忙碌和空闲状态(我的系统没有 IOWAIT)。