关于CPU使用率高的awr分析

今天看到一个报警信息,大体是CPU使用异常。

ZABBIX-监控系统:
------------------------------------
报警内容: CPU utilization is too high
------------------------------------
报警级别: PROBLEM
------------------------------------
监控项目: CPU idle time:55.17 %
------------------------------------
报警时间:2016.03.22-19:03:23

对于这个问题,看到CPU使用率过高,大体已经有了一些思路。但是还是需要一些论证。
首先查看sar的情况,可以看出CPU的平均使用率在30~40%
06:55:01 PM       all     32.35      0.00      7.57      0.00     60.08
06:56:01 PM       all     31.78      0.00      7.55      0.00     60.67
06:57:01 PM       all     31.65      0.00      7.52      0.01     60.82
06:58:01 PM       all     31.42      0.00      7.48      0.00     61.10
06:59:01 PM       all     30.91      0.00      7.58      0.00     61.51
07:00:02 PM       all     31.13      0.00      7.62      0.00     61.25
07:01:01 PM       all     30.84      0.00      7.62      0.02     61.53
07:02:01 PM       all     31.86      0.00      7.83      0.11     60.19
07:03:01 PM       all     32.88      0.00      7.64      0.06     59.43
Average:          all     24.34      0.00      7.11      0.04     68.51
但是top的结果却让我有些奇怪。
top - 19:04:19 up 68 days, 22:47,  2 users,  load average: 4.47, 4.58, 4.47
Tasks: 284 total,  14 running, 269 sleeping,   0 stopped,   1 zombie
Cpu(s): 31.6% us,  3.9% sy,  0.0% ni, 60.5% id,  0.0% wa,  0.1% hi,  3.9% si
Mem:  16430192k total, 16283948k used,   146244k free,   123716k buffers
Swap: 33551744k total,   115632k used, 33436112k free, 13809040k cached
可以看到CPU的使用率虽高,但是IO却几乎没有什么消耗。
然后查看部分的进程信息,发现有部分的进程CPU使用率较高。这个时候看起来是一个全表扫描的概率偏大了。
 
PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+ 
COMMAND                                                                
28185
oracle    16   0 6282m 835m 829m S 82.6  5.2   5:01.48 oracletest
(LOCAL=NO)                                                  
28237
oracle    16   0 6282m 832m 826m S 82.6  5.2   4:50.64 oracletest
(LOCAL=NO)                                                  
28345
oracle    16   0 6283m 874m 867m R 82.6  5.5   3:54.84 oracletest
(LOCAL=NO)                                                  
28425
oracle    16   0 6281m 689m 682m S 82.6  4.3   3:50.17 oracletest
(LOCAL=NO)                                                  
28703 oracle    16   0 6281m 571m 565m S 82.6  3.6   2:06.54 oracletest (LOCAL=NO)  
然后绑定进程,查看进程对应的session执行sql的情况,发现语句竟然是一句非常简单的查询。
PREV_SQL_ID                    SQL_TEXT
------------------------------ ------------------------------------------------------------
7gwxpwru0czqw                  select companyname from license   
执行计划如何呢,确实是一个全表扫描。
Plan hash value: 2492423498
-----------------------------------------------------------------------------
| Id  | Operation         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |         |       |       |     3 (100)|          |
|   1 |  TABLE ACCESS FULL| LICENSE |     1 |    29 |     3   (0)| 00:00:01 |
-----------------------------------------------------------------------------
但是这个时候的问题倒不是在于这个全表扫描了,关键就是这个表中目前只有1条数据。
为什么会有这个CPU消耗较大的情况呢,目前来看,语句的执行频率极高。

Per Second Per Transaction
Redo size: 3,455.88 0.53
Logical reads: 54,200.78 8.32
Block changes: 17.89 0.00
Physical reads: 5.72 0.00
Physical writes: 1.25 0.00
User calls: 39,104.93 6.01
Parses: 13,033.74 2.00
Hard parses: 4.75 0.00
Sorts: 12.16 0.00
Logons: 0.07 0.00
Executes: 13,035.13 2.00
Transactions: 6,512.05  

如果看到这种情况,会发现目前的系统还是非常繁忙的,那么主要在哪儿忙呢。可以看到rollback的比例非常高。

% Blocks changed per Read: 0.03 Recursive Call %: 25.04
Rollback per transaction %: 99.97 Rows per Sort: 2027.20

从这个也可以看出应该是应用的逻辑部分出了问题,或者数据问题导致的校验失败导致回滚。
这个时候查看等待事件的情况如下。

Event Waits Time(s) Avg Wait(ms) % Total Call Time Wait Class
CPU time   10,839   100.1  
SQL*Net message to client 93,924,202 73 0 .7 Network
latch: cache buffers chains 79,297 8 0 .1 Concurrency
cursor: pin S 71,807 2 0 .0 Other
log file sync 7,136 1 0 .0 Commit

我们直接到sql的部分来看看。下面两条语句的执行频率极高,大概是1个小时2千多万次的频率。

Elapsed Time (s) CPU Time (s) Executions Elap per Exec (s) % Total DB Time SQL Id SQL Module SQL Text
1,470 1,414 23,451,700 0.00 13.57 7gwxpwru0czqw JDBC Thin Client select companyname from licens...
694 686 23,024,521 0.00 6.41 7nkxbfnwgx93v JDBC Thin Client select supdepid from mdepart...

那么怎么看出语句存在问题呢。可以在executions部分找到一些痕迹。

Executions Rows Processed Rows per Exec CPU per Exec (s) Elap per Exec (s) SQL Id SQL Module SQL Text
23,451,700 23,440,315 1.00 0.00 0.00 7gwxpwru0czqw JDBC Thin Client select companyname from licens...
23,024,521 0 0.00 0.00 0.00 7nkxbfnwgx93v JDBC Thin Client select supdepid from mdepart

第二条语句的执行频率和第一条一样都非常高,但是第二条语句的“Rows Processed"为0
如果查看语句的buffer gets,就会发现是0
$ sh showsql.sh 7nkxbfnwgx93v
HASH_VALUE PLAN_HASH_VALUE DISK_READS BUFFER_GETS      SORTS EXECUTIONS   CPU_TIME ELAPSED_TIME_S WAIT_TIME_EACH
---------- --------------- ---------- ----------- ---------- ---------- ---------- -------------- --------------
 956212347      3350531500          0           0          0 1806030210         29              0              2
这是为什么呢。因为语句是这样的形式。
select supdepid from mdepartment where id =''
其中这个表的id列有非空约束,还有对应的id索引,这种情况下,直接会返回0行,尽管这个表里有百万的数据。
所以从这些痕迹来看,这个问题是一个异常的状态,需要和开发人员协调,到底是数据问题还是调用的逻辑部分出了问题。

时间: 2024-10-29 04:40:58

关于CPU使用率高的awr分析的相关文章

CPU使用率高怎么办?

  CPU使用率高怎么办?            当出现由于CPU资源不足,往往很容易导致电脑卡或者无响应等情况. 那么针对CPU使用率高怎么办? 网上关于'cpu使用率忽高忽低不稳定'这个话题讨论很多,其实都是从两个方面去考虑:一个是软件方面,另外一个则是硬件方面,其中硬件方面其决定性因素. 下面就跟系统大全一起来详细了解分析下,是什么原因造成的'cpu使用率100%'以及'cpu使用率不稳定'.

.net-服务器CPU使用率高如何优化?

问题描述 服务器CPU使用率高如何优化? .net网站多用户同时访问导致服务器CPU使用率过高该怎么优化啊?才模拟了10个用户就94%了-用的虚拟空间,大家有什么优化建议呢?在此谢过各位大神了! 解决方案 这个问题需要具体分析一下.主要看项目运行的瓶颈在什么地方?1.业务层的计算?2数据库的数据处理 3,是否站用CPU进行绘图,文件输出等.然后看是否进行进一步的优化.针对分析出的结果然后找对应的解决方案.

解决Win7系统cpu使用率高的方法汇总

Win7系统cpu使用率高的解决方法汇总: 1.你打开任务管理器,再点进程,看哪些程序占用了CPU,然后关掉就可以了. 2.在任务管理器中看看是那个进程占用CPU比较大,找到这样的进程后在百度上搜一下这个进程是干什么用的,知道是干什么用的之后就可以决定是留还是关. 3.使用3方软件,诸如超级兔子,硬件大师之流的. 4.木有办法,win7的内存太大了之前我用xp的才9%,换了win7的达到了21%,所谓的鱼和熊掌不能兼得. 5.关闭相应占用cpu多的程序,但是,要确定它是安装软件后自动启动的噢,有

win7下cpu使用率高怎么办?

在这win7下cpu使用率高怎么办呢? 只要两个步骤就可以轻松享受win7视频大宴,不用担心CPU使用率100%卡机等等问题 此为微软win7一个机制当检测到开启视频相关服务就将CPU多分配一些供其使用 解决办法分两步: 一.修改注册表 电脑常识 二.修改服务将其禁用 三.重新启动,ok,搞定!

cpu使用率高的解决方法

  cpu使用率高的解决方法 排除病毒感染 如果电脑中病毒或木马的情况下,木马恶意程序很可能会大量占用CPU资源,尤其是一些顽固病毒木马,一直都在恶意循环活动,感染各类系统文件,大量占用CPU资源,这种情况就很容易出现CPU使用率过高,即便是较高的CPU也经不起反复大量的恶意程序运行,因此如果发现CPU使用过高,首先应想下是否是电脑中病毒了,建议安装如金山杀毒进行全面查杀. 系统优化 排除病毒感染后,就需要从系统优化入手了.建议优化开启启动项,尽量让不需要使用到的软件不开机自动启动,比如一些播放

Win7系统程序运行少CPU使用率高该怎么办

  在操作ghost win7的时候,CPU使用率越高,系统也会变得缓慢.卡机甚至死机等问题,因此释放CPU空间来提升系统性能是很有必要的,最近有用户在win7系统中通过任务管理器来查看系统进程相关信息,发现应用程序并不是很多,但CPU使用率特别高,系统运行也会变得有点慢,出现这种现象很有可能是系统有较多的相关服务所致,下面来看看具体解决方法吧. 解决方法/步骤: 1.打开电脑之后,就直接打开系统的任务管理器. 2.点击可以展开的所有进程,右键单击打开服务,这时候就会弹出来弹出窗口服务. 3.这

找出程序cpu使用率高的原因

确定是CPU过高 使用top观察是否存在CPU使用率过高现象 找出线程 对CPU使用率过高的进程的所有线程进行排序 ps H -e -o pid,tid,pcpu,cmd --sort=pcpu |grep xxx得到如下结果,其中线程2909使用了7.8%的CPU. 2907 2913 0.0 ./xxx 2907 2909 7.8 ./xxx也可以通过查看/proc中的信息来确定高CPU线程. 打印了4列,线程ID,线程名,用户时间和内核时间(排名未分先后) awk '{print $1,$

执行计划变化导致CPU负载高的问题分析

前几天碰到一个CPU负载较高的问题.从系统层面来看,情况不是很严重,但是从应用的角度来说,已经感觉到很慢了.因为前端的调用频率还是比较高.所以会把这个问题放大. 使用top -c查看了基本的服务器信息.可以看到负载大概在30%左右.IO wait不高. top - 19:30:48 up 179 days,  4:54,  3 users,  load average: 4.43, 4.28, 4.14 Tasks: 669 total,   6 running, 661 sleeping,  

cpu使用率高怎么办

产生原因 1.当机器慢下来的时候,首先我们想到的当然是任务管理器了,看看到底是哪个程序占了较高的比例,如果是某个大程序那还可以原谅,在 关闭该程序后只要CPU正常了那就没问题:如果不是,那你就要看看是什么程序了,当你察不出这个进程是什么的时候就去google或者baidu搜. 有时只结束是没用的,在xp下我们可以结合msconfig里的启动项,把一些不用的项给关掉.在2000下可以去下个winpatrol来用. 2.一些常用的软件,比如浏览器占用了很高的CPU,那么就要升级该软件或者干脆用别的同