zoukankan      html  css  js  c++  java
  • 根据dba_hist_osstat统计CPU占用情况

    在11g里面,视图dba_hist_osstat用来记录OS级别的time时间指标。视图dba_hist_osstat_name显示了相关的指标名称。

    SYS@134.32.114.1:1521/dzgddb> select * from DBA_HIST_OSSTAT_NAME;
    
               DBID         STAT_ID STAT_NAME
    --------------- --------------- ----------------------------------------------------------------
         3352298469               0 NUM_CPUS
         3352298469               1 IDLE_TIME
         3352298469               2 BUSY_TIME
         3352298469               3 USER_TIME
         3352298469               4 SYS_TIME
         3352298469               5 IOWAIT_TIME
         3352298469               6 NICE_TIME
         3352298469              14 RSRC_MGR_CPU_WAIT_TIME
         3352298469              15 LOAD
         3352298469              16 NUM_CPU_CORES
         3352298469              17 NUM_CPU_SOCKETS
         3352298469            1008 PHYSICAL_MEMORY_BYTES
         3352298469            1009 VM_IN_BYTES
         3352298469            1010 VM_OUT_BYTES
         3352298469            2000 TCP_SEND_SIZE_MIN
         3352298469            2001 TCP_SEND_SIZE_DEFAULT
         3352298469            2002 TCP_SEND_SIZE_MAX
         3352298469            2003 TCP_RECEIVE_SIZE_MIN
         3352298469            2004 TCP_RECEIVE_SIZE_DEFAULT
         3352298469            2005 TCP_RECEIVE_SIZE_MAX
         3352298469            2006 GLOBAL_SEND_SIZE_MAX
         3352298469            2007 GLOBAL_RECEIVE_SIZE_MAX
    
    22 rows selected.

    如上,nmu_cpu_cores是指cpu核心数,本例是32;num_cpus是指cpu核心线程数,本例是64;num_cpu_sockets是指cpu路数,也指cpu主板数,本例是4。

    关键的计算公式是:

    %User = USER_TIME/ (BUSY_TIME+IDLE_TIME)*100
    %Sys = SYS_TIME/ (BUSY_TIME+IDLE_TIME)*100
    %Idle = IDLE_TIME/ (BUSY_TIME+IDLE_TIME)*100
    BUSY_TIME + IDLE_TIME = ELAPSED_TIME * CPU_COUNT

    鉴于报表习惯,将关键指标%Idle换算为%CPU,则:

    %CPU = BUSY_TIME/ (BUSY_TIME+IDLE_TIME)*100

    顺带记录一下,LOAD指标记录的是snap_id起始点的OS Load值,对应AWR报告的Load Average End & Load Average Begin。

    以下是最终的SQL:根据dba_hist_osstat统计CPU占用情况,顺带附上另外几个关键指标

    SELECT sn.instance_number,
           sn.snap_id,
           to_char(sn.end_interval_time, 'YYYY-MM-DD HH24:MI') AS snaptime,
           newread.value - oldread.value "physical reads",
           newwrite.value - oldwrite.value "physical writes",
           round((newdbtime.value - olddbtime.value) / 1000000 / 60, 2) "DB time(min)",
           round((newbusy.value - oldbusy.value) /
                 ((newidle.value - oldidle.value) +
                 (newbusy.value - oldbusy.value)) * 100,
                 2) "CPU(%)"
      FROM dba_hist_sysstat        oldread,
           dba_hist_sysstat        newread,
           dba_hist_sysstat        oldwrite,
           dba_hist_sysstat        newwrite,
           dba_hist_sys_time_model olddbtime,
           dba_hist_sys_time_model newdbtime,
           dba_hist_osstat         oldidle,
           dba_hist_osstat         newidle,
           dba_hist_osstat         oldbusy,
           dba_hist_osstat         newbusy,
           dba_hist_snapshot       sn
     WHERE newread.stat_name = 'physical reads'
       AND oldread.stat_name = 'physical reads'
       AND newread.snap_id = sn.snap_id
       AND oldread.snap_id = sn.snap_id - 1
       AND newread.instance_number = sn.instance_number
       AND oldread.instance_number = sn.instance_number
       AND newread.dbid = sn.dbid
       AND oldread.dbid = sn.dbid
       AND newwrite.stat_name = 'physical writes'
       AND oldwrite.stat_name = 'physical writes'
       AND newwrite.snap_id = sn.snap_id
       AND oldwrite.snap_id = sn.snap_id - 1
       AND newwrite.instance_number = sn.instance_number
       AND oldwrite.instance_number = sn.instance_number
       AND newwrite.dbid = sn.dbid
       AND oldwrite.dbid = sn.dbid
       AND newdbtime.stat_name = 'DB time'
       AND olddbtime.stat_name = 'DB time'
       AND newdbtime.snap_id = sn.snap_id
       AND olddbtime.snap_id = sn.snap_id - 1
       AND newdbtime.instance_number = sn.instance_number
       AND olddbtime.instance_number = sn.instance_number
       AND newdbtime.dbid = sn.dbid
       AND olddbtime.dbid = sn.dbid
       AND newidle.stat_name = 'IDLE_TIME'
       AND oldidle.stat_name = 'IDLE_TIME'
       AND newidle.snap_id = sn.snap_id
       AND oldidle.snap_id = sn.snap_id - 1
       AND newidle.instance_number = sn.instance_number
       AND oldidle.instance_number = sn.instance_number
       AND newidle.dbid = sn.dbid
       AND oldidle.dbid = sn.dbid
       AND newbusy.stat_name = 'BUSY_TIME'
       AND oldbusy.stat_name = 'BUSY_TIME'
       AND newbusy.snap_id = sn.snap_id
       AND oldbusy.snap_id = sn.snap_id - 1
       AND newbusy.instance_number = sn.instance_number
       AND oldbusy.instance_number = sn.instance_number
       AND newbusy.dbid = sn.dbid
       AND oldbusy.dbid = sn.dbid
     ORDER BY sn.instance_number, sn.snap_id;
  • 相关阅读:
    理解java容器底层原理--手动实现HashSet
    理解java容器底层原理--手动实现HashMap
    理解java容器底层原理--手动实现LinkedList
    理解java容器底层原理--手动实现ArrayList
    Java 集合框架总结--导图
    java 容器(collection)--ArrayList 常用方法分析 源码分析
    java 递归及其经典应用--求阶乘、打印文件信息、计算斐波那契数列
    (四)消息中间件-面试问答
    (四)linux下开机自启
    (十)Dockfile创建Nginx镜像
  • 原文地址:https://www.cnblogs.com/likingzi/p/6397071.html
Copyright © 2011-2022 走看看