以百分比形式显示会话的oracle CPU使用率

时间:2015-06-03 09:40:58

标签: oracle

以下脚本返回活动会话的cpu使用情况。结果显示cpu使用情况,以秒为单位。

我需要的是与cpu使用百分比相同的报告。这样做的最佳方式是什么?

--
-- Show CPU Usage for Active Sessions
--

SET PAUSE ON
SET PAUSE 'Press Return to Continue'
SET PAGESIZE 60
SET LINESIZE 300

COLUMN username FORMAT A30
COLUMN sid FORMAT 999,999,999
COLUMN serial# FORMAT 999,999,999
COLUMN "cpu usage (seconds)"  FORMAT 999,999,999.0000

SELECT
   s.username,
   t.sid,
   s.serial#,
   SUM(VALUE/100) as "cpu usage (seconds)"
FROM
   v$session s,
   v$sesstat t,
   v$statname n
WHERE
   t.STATISTIC# = n.STATISTIC#
AND
   NAME like '%CPU used by this session%'
AND
   t.SID = s.SID
AND
   s.status='ACTIVE'
AND
   s.username is not null
GROUP BY username,t.sid,s.serial#
/

1 个答案:

答案 0 :(得分:3)

长话短说:单一查询无法完成,您需要编写PL / SQL来收集有用的数据,以获取有用的信息。

Oracle有“累积时间”统计信息,这意味着引擎会持续使用。您必须定义分析的开始时间和结束时间。

您可以从V $ SYS_TIME_MODEL

查询“DB CPU”
select value into t_db_cpu_i
from sys.V_$SYS_TIME_MODEL
where stat_name = 'DB CPU' ;  /* start time */ 
...
select value into t_db_cpu_f
from sys.V_$SYS_TIME_MODEL
where stat_name = 'DB CPU' ; /* end time */

如果您只有#1 CPU或#8 CPU,则会影响CPU统计信息。因此,您必须确定引擎使用的CPU数量。

您可以从V $ PARAMETER查询'cpu_count'以获取此值。

select value into t_cpus
from sys.v_$parameter
where name='cpu_count' ;

然后,这很简单:

最大总时间将是秒数* CPU数量,因此如果您只有#1 CPU,则最大总时间将为“60”,但如果您有#2 CPU,则最大总时间将为“120”。 #3 CPU将为“180”......等......

因此,您需要使用sysdate:

获取分析时段的开始时间和结束时间
t_start := sysdate ;
t_end := sysdate ;

现在你计算以下内容:

seconds_elapsed := (t_end - t_start)*24*60*60 ;
total_time := seconds_elapsed * t_cpus ; 
used_cpu := t_db_cpu_f - t_db_cpu_i ;
secs_cpu := seconds_elapsed/1000000 ;
avgcpu := (secs_cpu/total_time)*100 ;

就是这样,“avgcpu”是你正在寻找的价值。