如何诊断和解决CPU高度消耗(100%)的数据库问题
2008-05-24 13:46

链接:http://www.eygle.com/archives/2004/10/howto_getsql_which_cost_most_cpu.html

很多时候我们的服务器可能会经历CPU消耗100%的性能问题.
排除系统的异常,这类问题通常都是因为系统中存在性能低下甚至存在错误的SQL语句, 消耗了大量的CPU所致.

本文通过一个案例就如何捕获这样的SQL给出一个通用的方法.

问题描述:系统CPU高度消耗,系统运行缓慢
OS:Sun Solaris8
Oracle:Oracle9203

1.首先通过Top命令查看

$ topload averages:  1.61,  1.28,  1.25                     HSWAPJSDB             10:50:44172 processes: 160 sleeping, 1 running, 3 zombie, 6 stopped, 2 on cpuCPU states:     % idle,     % user,     % kernel,     % iowait,     % swapMemory: 4.0G real, 1.4G free, 1.9G swap in use, 8.9G swap freePID USERNAME THR PR NCE  SIZE   RES STATE   TIME FLTS    CPU COMMAND20521 oracle     1 40   0  1.8G  1.7G run     6:37    0 47.77% oracle20845 oracle     1 40   0  1.8G  1.7G cpu02   0:41    0 40.98% oracle20847 oracle     1 58   0  1.8G  1.7G sleep   0:00    0  0.84% oracle20780 oracle     1 48   0  1.8G  1.7G sleep   0:02    0  0.83% oracle15828 oracle     1 58   0  1.8G  1.7G sleep   0:58    0  0.53% oracle20867 root       1 58   0 4384K 2560K sleep   0:00    0  0.29% sshd220493 oracle     1 58   0  1.8G  1.7G sleep   0:03    0  0.29% oracle20887 oracle     1 48   0  1.8G  1.7G sleep   0:00    0  0.13% oracle20851 oracle     1 58   0  1.8G  1.7G sleep   0:00    0  0.10% oracle20483 oracle     1 48   0  1.8G  1.7G sleep   0:00    0  0.09% oracle20875 oracle     1 45   0 1064K  896K sleep   0:00    0  0.07% sh20794 oracle     1 58   0  1.8G  1.7G sleep   0:00    0  0.06% oracle20842 jiankong   1 52   2 1224K  896K sleep   0:00    0  0.05% sadc20888 oracle     1 55   0 1712K 1272K cpu00   0:00    0  0.05% top19954 oracle     1 58   0  1.8G  1.7G sleep  84:25    0  0.04% oracle

我们发现在进城列表里,存在两个高CPU耗用的Oracle进城,分别消耗了47.77%和40.98%的CPU资源.

2.找到存在问题的进程信息

                        $ ps -ef|grep 20521oracle 20909 20875  0 10:50:53 pts/10   0:00 grep 20521oracle 20521     1 47 10:43:59 ?        6:45 oraclejshs (LOCAL=NO)$ ps -ef|grep 20845oracle 20845     1 44 10:50:00 ?        0:55 oraclejshs (LOCAL=NO)oracle 20918 20875  0 10:50:59 pts/10   0:00 grep 20845

确认这是两个远程连接的用户进程.

3.熟悉一下我的getsql.sql脚本

                        SELECT   /*+ ORDERED */sql_textFROM v$sqltext aWHERE (a.hash_value, a.address) IN (SELECT DECODE (sql_hash_value,0, prev_hash_value,sql_hash_value),DECODE (sql_hash_value, 0, prev_sql_addr, sql_address)FROM v$session bWHERE b.paddr = (SELECT addrFROM v$process cWHERE c.spid = '&pid'))ORDER BY piece ASC/

注意这里我们涉及了3个视图,并应用其关联进行数据获取.
首先需要输入一个pid,这个pid即process id,也就是在Top或ps中我们看到的PID.
通过pid和v$process.spid相关联我们可以获得Process的相关信息
进而通过v$process.addr和v$session.paddr相关联,我们就可以获得和session相关的所有信息.
再结合v$sqltext,我们即可获得当前session正在执行的SQL语句.

通过v$process视图,我们得以把操作系统和数据库关联了起来.

4.连接数据库,找到问题sql及进程

通过Top中我们观察到的PID,进而应用我的getsql脚本,我们得到以下结果输出.

                        $ sqlplus "/ as sysdba"SQL*Plus: Release 9.2.0.3.0 - Production on Mon Dec 29 10:52:14 2003Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.Connected to:Oracle9i Enterprise Edition Release 9.2.0.3.0 - 64bit ProductionWith the Partitioning, OLAP and Oracle Data Mining optionsJServer Release 9.2.0.3.0 - ProductionSQL> @getsqlEnter value for spid: 20521old  10: where c.spid = '&pid'new  10: where c.spid = '20521'SQL_TEXT----------------------------------------------------------------select * from (select VC2URL,VC2PVDID,VC2MOBILE,VC2ENCRYPTFLAG,SERVICEID,VC2SUB_TYPE,CISORDER,NUMGUID,VC2KEY1, VC2NEEDDISORDER,VC2PACKFLAG,datopertime from hsv_2cpsync where datopertime<=sysdate and numguid>70000000000308 order by NUMGUid) where rownum<=20

那么这段代码就是当前正在疯狂消耗CPU的罪魁祸首.
接下来需要进行的工作就是找出这段代码的问题,看是否可以通过优化提高其效率,减少资源消耗.

5.进一步的我们可以通过dbms_system包跟踪该进程

SQL> @getsid
Enter value for spid: 20521
old 3: select addr from v$process where spid = &spid)
new 3: select addr from v$process where spid = 20521)

SID SERIAL# USERNAME MACHINE
----------------------------------------------------------------
45 38991 HSUSER_V51 hswapjsptl1.hurray.com.cn

SQL> exec dbms_system.set_sql_trace_in_session(45,38991,true);

PL/SQL procedure successfully completed.

SQL> !

这部分内容可以参考:
http://www.eygle.com/case/sql_trace_1.htm

对于Windows上的类似问题,可以参考:
http://www.eygle.com/faq/Use.Nt.tools.manage.Oracle.htm

6.一点说明

很多时候,高CPU消耗都是由于问题SQL导致的,所以找到这些SQL通常也就找到了问题所在,通过优化调整
通常就可以解决问题。

但是有时候你可能会发现,这些最消耗CPU的进程是后台进程,这一般是由于异常、BUG或者恢复后的异常
导致的,需要具体问题具体分析了.

(转)如何诊断和解决CPU高度消耗(100%)的数据库问题相关推荐

  1. windows下设置进程CPU相关性/亲合度,解决CPU使用率占用100%的问题

    windows下设置进程CPU相关性/亲合度,解决CPU使用率占用100%的问题 参考文章: (1)windows下设置进程CPU相关性/亲合度,解决CPU使用率占用100%的问题 (2)https: ...

  2. [组图教程]:8大方法!解决CPU资源占用100%[ZT]

    第1页:CPU资源占用100%:看驱动,看启动,看病毒      相信你的一定遇到过电脑动弹不得的时候,或许是只能眼看鼠标滑动而不能进行任何操作的时候,很多人都会经常遇到这样的问题:CPU占用率100 ...

  3. Linux下解决CPU占用率100%问题的步骤

    CPU占用率100%问题的解决步骤 1. 确定cpu占用率高的进程ID - PID 2. 查看进程中cpu占用率高的线程ID - TID 3. 将线程ID - TID 转换成16进制 - XTID 4 ...

  4. XP中CPU占用率100%原因及解决方法

    我们在使用Windows XP操作系统的时候,用着用着系统就变慢了,一看"任务管理器"才发现CPU占用达到100%.这是怎么回事情呢?遇到病毒了,硬件有问题,还是系统设置有问题,在 ...

  5. 【Git学习】解决GitLab内存消耗大的问题

    一.问题描述 今天有提示反馈Gitlab服务器push不上去,让我看看是不是Gitlab服务器出了什么问题. 我查看了下gitlab在线的信息 这台服务器消耗了31.3GB内存. 然后我11:14分尝 ...

  6. html5游戏占内存和cpu,IIS解决CPU和内存占用率太高的问题

    发现进程中的w3wp占用率太高.html 通过查询,发现以下:web w3wp.exe是在IIS(因特网信息服务器)与应用程序池相关联的一个进程,若是你有多个应用程序池,就会有对应的多个w3wp.ex ...

  7. 电脑CPU占用率100%如何处理 电脑CPU占用率100%解决方法

    电脑CPU占用率100%如何处理 电脑CPU占用率100%解决方法 2 年前电脑CPU占用率100%怎么解决 ?电脑没有运行太多程序,但是在任务管理器中总显示占用率100%这里就为大家介绍下,一起来看 ...

  8. 禁用software reporter tool.exe 解决CPU高占用率的问题

    禁用software reporter tool.exe 解决CPU高占用率的问题 参考文章: (1)禁用software reporter tool.exe 解决CPU高占用率的问题 (2)http ...

  9. 高cpu_实用脚本:检查高 CPU / 内存消耗进程 | Linux 中国

    本教程中包含两个脚本,它们可以帮助你确定 Linux 上高 CPU/内存消耗进程的运行时间. • 来源:linux.cn • 作者:Magesh Maruthamuthu • 译者:geekpi • ...

  10. Replication--复制延迟的诊断和解决

    要解决复制延迟问题,需要首先定位复制延迟发生点,再找出复制延迟的原因,再做相应处理. 复制延迟发生点: 1. 发布服务器 2. 分发服务器 3. 订阅服务器 4. 发布服务器与分发服务器和分发服务器与 ...

最新文章

  1. 数据科学家必须要掌握的5种聚类算法
  2. 大区块的BCH给智能合约更大的发展潜力
  3. Android Jetpack组件之ViewModel使用
  4. openwrt gpio控制与使用
  5. java用户角色权限管理 只显示姓_java权限管理与用户角色权限设计
  6. HDU 6090 Rikka with Graph 思维 公式
  7. oracle检查表失效,PL/SQL联系oracle成功可以sql解决的办法是检查表的名称无法显示...
  8. 实现商品库存信息管理页面
  9. 优质软文怎么写----皆义 网途
  10. CCF 202206-2 寻宝!大冒险!
  11. 基于Matlab对大米计数的研究
  12. 2018年浙江省网络安全技能竞赛ctf部分解题思路writeup
  13. 年轻人最in的选择!HCK哈士奇x可口可乐联名限量款冰吧
  14. 如何锁定计算机桌面图标,用Desklock轻松设置和锁定桌面图标 -电脑资料
  15. MySQL-表连接的几种方式
  16. 网站压力测试工具was
  17. 阅文与掌阅的真假繁华
  18. 查询批量文件中关键数据方法--uedit32工具
  19. 线束音视频传输连接器FAKRA与HSD区别?
  20. Learn to See in the Dark 论文解读

热门文章

  1. voices——最后的决赛
  2. 获取字符串中不重复的第一个字符
  3. TP5.0 Redis(单例模式)(原)
  4. Tomcat Linux下自启动
  5. Ubuntu10.04下载并编译Android4.3源代码
  6. pku 2976 Dropping tests 01分数规划
  7. .net中即时消息发送的实现
  8. 065 循环导入问题
  9. 命令解析optparse
  10. 韩顺平 java笔记 第8讲 this 类变量 第9讲 类方法