我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Finding Sessions with High CPU Usage

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Finding Sessions with High CPU Usage

If database server CPU usage is showing 100%, or high 90%, DBA needs to find out which session is hogging the CPU(s) and
take appropriate action.

I will explain in the following that how can we find out the session(s) which are excessively using CPU.

v$statname and v$sesstat dictionary view contains different metrics values, and in this example we will
be checking values of 2 metrics highlighted in red bellow.

These metrics would help to find out CPU usage by the sessions.

SQL> set linesize 150
col name format a70
select statistic#,name
from v$statname
where upper(name) like '%CPU%';

STATISTIC# NAME
---------- ----------------------------------------------------------------------
         0 OS CPU Qt wait time
        10 recursive cpu usage
        16 CPU used when call started
        17 CPU used by this session
        61 IPC CPU used by this session
        64 global enqueue CPU used by this session
       229 gc CPU used by this session
       248 cell physical IO bytes sent directly to DB node to balance CPU
       581 parse time cpu

9 rows selected.


STATISTIC# NAME
---------- ----------------------------------------------------------------------
         0 OS CPU Qt wait time
        10 recursive cpu usage
        18 CPU used when call started
        19 CPU used by this session
        77 IPC CPU used by this session
        80 global enqueue CPU used by this session
       253 gc CPU used by this session
       275 cell physical IO bytes sent directly to DB node to balance CPU
       622 parse time cpu

9 rows selected.



If we want to check which session is top consumer of the CPU currently, we can use following script to find it out.
Script for 11g and bellow


alter session set nls_date_format='Dd-MON-YY HH24:MI:SS';


set lines 250
set pages 2000
col name format a26
col sid format 99999
col username format a15
col program format a40
col SESS_CPU_SECS wra format 999,999,999.99
col LAST_CPU_SECS wra format 999,999,999.99
col logon_secs  wra format 999,999,999
col Percent  wra format 999.99

select sess_cpu.sid,
       NVL(sess_cpu.username, 'Oracle Process') username,
       sess_cpu.status,
       sess_cpu.logon_time, 
       round((sysdate - sess_cpu.logon_time)*1440*60) logon_SECS,
       sess_cpu.value/100 SESS_CPU_SECS,
       (sess_cpu.value - call_cpu.value)/100 LAST_CPU_SECS,
       round ((sess_cpu.value/100)/round((sysdate - sess_cpu.logon_time)*1440*60)*100,2) Percent,
       sess_cpu.sql_id         
from  (select se.sql_id,ss.statistic#,se.sid, se.username, se.status, se.program, se.logon_time, sn.name, ss.value
       from v$session se, v$sesstat ss, v$statname sn
       where se.sid=ss.sid
       and sn.statistic#=ss.statistic#
       and sn.name in ('CPU used by this session') ) sess_cpu,
            (select ss.statistic#,se.sid, ss.value, value/100 seconds from v$session se, v$sesstat ss, v$statname sn
where se.sid=ss.sid
and sn.statistic#=ss.statistic#
and sn.name in ('CPU used when call started') ) call_cpu
where sess_cpu.sid=call_cpu.sid
order by SESS_CPU_SECS desc;


   SID USERNAME        STATUS   LOGON_TIME             LOGON_SECS   SESS_CPU_SECS   LAST_CPU_SECS PERCENT SQL_ID
------ --------------- -------- -------------------- ------------ --------------- --------------- ------- -------------
   168 Oracle Process  ACTIVE   23-SEP-17 16:33:38      6,743,707       17,328.94       17,328.94     .26
     4 Oracle Process  ACTIVE   23-SEP-17 16:33:19      6,743,726        1,104.15        1,104.15     .02
   248 Oracle Process  ACTIVE   23-SEP-17 16:33:19      6,743,726          757.68          757.68     .01
   258 Oracle Process  ACTIVE   23-SEP-17 16:34:01      6,743,684          545.56          545.56     .01
    12 Oracle Process  ACTIVE   23-SEP-17 16:34:00      6,743,685          506.23          506.23     .01
    85 Oracle Process  ACTIVE   23-SEP-17 16:33:19      6,743,726          426.53          426.53     .01
    96 HIDS_AUDITOR    INACTIVE 04-DEC-17 19:14:47        513,238          264.17             .00     .05
    84 Oracle Process  ACTIVE   23-SEP-17 16:33:19      6,743,726          239.57          239.57     .00
   246 Oracle Process  ACTIVE   23-SEP-17 16:33:19      6,743,726          181.17          181.17     .00
   106 DBSNMP          INACTIVE 09-DEC-17 04:13:33        135,312           49.85             .00     .04
   273 DBSNMP          INACTIVE 04-NOV-17 18:11:31      3,109,034           38.04             .00     .00
   173 Oracle Process  ACTIVE   23-SEP-17 16:34:00      6,743,685           35.15           35.15     .00
   166 Oracle Process  ACTIVE   23-SEP-17 16:33:19      6,743,726           25.01           25.01     .00
   172 Oracle Process  ACTIVE   23-SEP-17 16:33:51      6,743,694           24.51           24.51     .00
   193 SHEC_USER       INACTIVE 09-DEC-17 21:46:15         72,150            5.41             .02     .01
   103 SHEC_USER       INACTIVE 09-DEC-17 21:45:35         72,190            2.41             .00     .00
    34 SHEC_USER       INACTIVE 09-DEC-17 21:45:35         72,190            1.80             .00     .00
    14 PUBLIC          INACTIVE 05-NOV-17 14:52:38      3,034,567            1.71             .00     .00
    20 SHEC_USER       INACTIVE 09-DEC-17 21:45:29         72,196            1.42             .00     .00
   101 Oracle Process  ACTIVE   09-DEC-17 00:50:37        147,488             .67             .67     .00
   192 SHEC_USER       INACTIVE 09-DEC-17 21:45:35         72,190             .60             .00     .00
   270 SHEC_USER       INACTIVE 09-DEC-17 21:45:35         72,190             .51             .23     .00
   196 SYS             ACTIVE   10-DEC-17 17:29:12          1,173             .40             .00     .03 ff0k8584k3x9j
    99 SHEC_USER       INACTIVE 09-DEC-17 21:45:29         72,196             .27             .00     .00
   190 SHEC_USER       INACTIVE 09-DEC-17 21:46:05         72,160             .14             .00     .00
   268 SHEC_USER       INACTIVE 09-DEC-17 21:45:29         72,196             .12             .00     .00
   271 SHEC_USER       INACTIVE 09-DEC-17 21:45:29         72,196             .12             .00     .00
   187 SHEC_USER       INACTIVE 09-DEC-17 21:45:29         72,196             .10             .00     .00
    89 Oracle Process  ACTIVE   23-SEP-17 16:33:49      6,743,696             .09             .09     .00
   263 SHEC_USER       INACTIVE 09-DEC-17 21:45:28         72,197             .08             .00     .00
   255 SHEC_USER       INACTIVE 09-DEC-17 21:46:09         72,156             .06             .00     .00
     6 SHEC_USER       INACTIVE 09-DEC-17 21:45:35         72,190             .06             .00     .00
   182 SHEC_USER       INACTIVE 09-DEC-17 21:45:29         72,196             .05             .01     .00
    98 SHEC_USER       INACTIVE 09-DEC-17 21:45:29         72,196             .04             .00     .00
   177 SHEC_USER       INACTIVE 09-DEC-17 21:45:28         72,197             .04             .00     .00
   272 SHEC_USER       INACTIVE 09-DEC-17 21:45:35         72,190             .04             .00     .00
   264 SHEC_USER       INACTIVE 09-DEC-17 21:45:35         72,190             .04             .00     .00
    23 SHEC_USER       INACTIVE 09-DEC-17 21:45:29         72,196             .03             .00     .00
   184 SHEC_USER       INACTIVE 09-DEC-17 21:45:54         72,171             .02             .00     .00
    28 SHEC_USER       INACTIVE 09-DEC-17 21:45:56         72,169             .02             .00     .00
    19 SHEC_USER       INACTIVE 09-DEC-17 21:45:35         72,190             .02             .00     .00
   256 Oracle Process  ACTIVE   23-SEP-17 16:34:00      6,743,685             .01             .01     .00
   266 SHEC_USER       INACTIVE 09-DEC-17 21:45:55         72,170             .01             .00     .00
   105 SHEC_USER       INACTIVE 09-DEC-17 21:46:13         72,152             .01             .00     .00
    91 Oracle Process  ACTIVE   23-SEP-17 16:34:00      6,743,685             .01             .01     .00
    93 SHEC_USER       INACTIVE 09-DEC-17 21:46:03         72,162             .01             .00     .00
    24 Oracle Process  ACTIVE   10-DEC-17 17:35:53            772             .01             .01     .00
   195 SHEC_USER       INACTIVE 09-DEC-17 21:45:35         72,190             .01             .00     .00
   186 DBSNMP          INACTIVE 10-DEC-17 17:43:12            333             .01             .00     .00
    21 SHEC_USER       INACTIVE 09-DEC-17 21:45:46         72,179             .01             .00     .00
   278 Oracle Process  ACTIVE   10-DEC-17 06:00:00         42,525             .00             .00     .00
   275 SHEC_USER       INACTIVE 09-DEC-17 21:45:59         72,166             .00             .00     .00
   269 SHEC_USER       INACTIVE 09-DEC-17 21:45:45         72,180             .00             .00     .00
   267 SHEC_USER       INACTIVE 09-DEC-17 21:46:19         72,146             .00             .00     .00
   252 Oracle Process  ACTIVE   23-SEP-17 16:33:41      6,743,704             .00             .00     .00
   250 Oracle Process  ACTIVE   23-SEP-17 16:33:38      6,743,707             .00             .00     .00
   247 Oracle Process  ACTIVE   23-SEP-17 16:33:19      6,743,726             .00             .00     .00
   245 Oracle Process  ACTIVE   23-SEP-17 16:33:18      6,743,727             .00             .00     .00
   244 Oracle Process  ACTIVE   23-SEP-17 16:33:25      6,743,720             .00             .00     .00
   197 SHEC_USER       INACTIVE 09-DEC-17 21:45:58         72,167             .00             .00     .00
   183 SHEC_USER       INACTIVE 09-DEC-17 21:45:43         72,182             .00             .00     .00
   181 SHEC_USER       INACTIVE 10-DEC-17 17:45:57            168             .00             .00     .00
   180 SHEC_USER       INACTIVE 09-DEC-17 21:45:29         72,196             .00             .00     .00
   169 Oracle Process  ACTIVE   23-SEP-17 16:33:38      6,743,707             .00             .00     .00
   167 Oracle Process  ACTIVE   23-SEP-17 16:33:27      6,743,718             .00             .00     .00
   165 Oracle Process  ACTIVE   23-SEP-17 16:33:19      6,743,726             .00             .00     .00
   164 Oracle Process  ACTIVE   23-SEP-17 16:33:19      6,743,726             .00             .00     .00
   163 Oracle Process  ACTIVE   23-SEP-17 16:33:18      6,743,727             .00             .00     .00
   104 SHEC_USER       INACTIVE 09-DEC-17 21:45:35         72,190             .00             .00     .00
   100 SHEC_USER       INACTIVE 09-DEC-17 21:45:57         72,168             .00             .00     .00
    97 SHEC_USER       INACTIVE 09-DEC-17 21:45:35         72,190             .00             .00     .00
    94 Oracle Process  ACTIVE   23-SEP-17 16:39:05      6,743,380             .00             .00     .00
    87 Oracle Process  ACTIVE   23-SEP-17 16:33:38      6,743,707             .00             .00     .00
    86 Oracle Process  ACTIVE   23-SEP-17 16:33:31      6,743,714             .00             .00     .00
    83 Oracle Process  ACTIVE   23-SEP-17 16:33:19      6,743,726             .00             .00     .00
    82 Oracle Process  ACTIVE   23-SEP-17 16:33:19      6,743,726             .00             .00     .00
    31 SHEC_USER       INACTIVE 09-DEC-17 21:45:51         72,174             .00             .00     .00
    27 HIDS_AUDITOR    INACTIVE 04-DEC-17 19:14:47        513,238             .00             .00     .00
    26 SHEC_USER       INACTIVE 09-DEC-17 21:46:11         72,154             .00             .00     .00
    25 SHEC_USER       INACTIVE 09-DEC-17 21:46:00         72,165             .00             .00     .00
    22 HIDS_AUDITOR    INACTIVE 04-DEC-17 19:14:45        513,240             .00             .00     .00
    16 Oracle Process  ACTIVE   05-NOV-17 14:45:13      3,035,012             .00             .00     .00
     7 Oracle Process  ACTIVE   23-SEP-17 16:33:38      6,743,707             .00             .00     .00
     5 Oracle Process  ACTIVE   23-SEP-17 16:34:00      6,743,685             .00             .00     .00
     3 Oracle Process  ACTIVE   23-SEP-17 16:33:19      6,743,726             .00             .00     .00
     2 Oracle Process  ACTIVE   23-SEP-17 16:33:19      6,743,726             .00             .00     .00
     1 Oracle Process  ACTIVE   23-SEP-17 16:33:19      6,743,726             .00             .00     .00

87 rows selected.



Script for 12c and above
Column CON_ID is added in the script to list the container id where sessions are connected. If CON_ID is 0, it would mean that this is an internal process/session. If value is 1, it would mean that this session is from container database. Any value other than 0 or 1 would represent a pluggable database sessions. Check v$containers to match container ID with your pluggable database.


alter session set nls_date_format='Dd-MON-YY HH24:MI:SS';


set lines 250
set pages 2000
col name format a26
col username format a15
col program format a40
col SESS_CPU_SECS wra format 999,999,999.99
col LAST_CPU_SECS wra format 999,999,999.99
col logon_secs  wra format 999,999,999
col Percent  wra format 999.99

select sess_cpu.con_id,
       sess_cpu.sid,
       NVL(sess_cpu.username, 'Oracle Process') username,
       sess_cpu.status,
       sess_cpu.logon_time, 
       round ((sysdate-sess_cpu.logon_time)*1440*60) logon_SECS,
       sess_cpu.value/100 SESS_CPU_SECS,
       (sess_cpu.value - call_cpu.value)/100 LAST_CPU_SECS,
       round((sess_cpu.value/100)/round((sysdate - sess_cpu.logon_time)*1440*60)*100,2) Percent,
       sess_cpu.sql_id         
from  (select se.con_id,se.sql_id,ss.statistic#,se.sid, se.username, se.status, se.program, se.logon_time, sn.name, ss.value
       from v$session se, v$sesstat ss, v$statname sn
       where se.sid=ss.sid
         and sn.statistic#=ss.statistic#
         and sn.name in ('CPU used by this session') ) sess_cpu,
         (select se.con_id, ss.statistic#,se.sid, ss.value, value/100 seconds
          from v$session se, v$sesstat ss, v$statname sn
          where se.sid=ss.sid
           and sn.statistic#=ss.statistic#
           and sn.name in ('CPU used when call started') ) call_cpu
where sess_cpu.sid=call_cpu.sid
and sess_cpu.con_id=call_cpu.con_id
order by SESS_CPU_SECS ;


LOGON_SECS column shows total time in seconds this session is connected to the database.
SESS_CPU_SECS columns shows number of seconds this session has spent using CPU.
LAST_CPU_SECS column shows the CPU taken by last execution call ¨C a single SQL may call CPU several times during its execution.
PERCENT column shows the percent of time this session has spent using CPU since this session has connect to the database.
  
Points to note
While on CPU, LAST_CPU_SECS would show zero (session status would be ACTIVE). During execution of SQL(s), session may be switching between CPU and IO - and hence we can see value changing under SESS_CPU_SECS and LAST_CPU_SECS columns as soon as session switches from CPU to IO.
If a session is on CPU, status would be ACTIVE and SESS_CPU_SECS would be showing last value captured for this session, and LAST_CPU_DECS would be 0.
If a session is on IO, status would be ACTIVE and SESS_CPU_SECS would be showing total seconds of CPU taken by the session until now.
LAST_CPU_SECS would show CPU seconds taken during last call to the CPU. I have also seen value of zero under this column even if session is not ACTIVE. I can't figure it out why, but most important thing is total time of CPU taken by the session which is under SESS_CPU_SECS.
See the following example where I have used ORDER BY SESS_CPU_SECS to display sessions which are at the top CPU consumption since log in.


If you see session bellow highlighted in red, it is connected to the database for 799 seconds
and out of which it has spent 260 seconds on CPU which accounts to 32.55 percent of total session time.


In real time scenario, if you see a session spending huge amount time on CPU, have a look at the SQL(s) it is executing (last column showing SQL_ID) and investigate further.
You can modify this script to ?°ORDER BY PERCENT?± to see which session has spent most of its connected time on CPU.

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Finding Sessions with High CPU Usage

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

目录