免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5208 | 回复: 11
打印 上一主题 下一主题

Oracle诊断案例-如何诊断和解决CPU高度消耗(100%)的数据库问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-10-07 18:45 |只看该作者 |倒序浏览
如何诊断和解决CPU高度消耗(100%)的数据库问题

原文链接:
http://www.eygle.com/case/how.to.getsql.which.cost.most.CPU.htm

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

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

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

1.首先通过Top命令查看


  1. $ top

  2. load averages:  1.61,  1.28,  1.25                     HSWAPJSDB             10:50:44
  3. 172 processes: 160 sleeping, 1 running, 3 zombie, 6 stopped, 2 on cpu
  4. CPU states:     % idle,     % user,     % kernel,     % iowait,     % swap
  5. Memory: 4.0G real, 1.4G free, 1.9G swap in use, 8.9G swap free

  6.    PID USERNAME THR PR NCE  SIZE   RES STATE   TIME FLTS    CPU COMMAND
  7. 20521 oracle     1 40   0  1.8G  1.7G run     6:37    0 47.77% oracle
  8. 20845 oracle     1 40   0  1.8G  1.7G cpu02   0:41    0 40.98% oracle
  9. 20847 oracle     1 58   0  1.8G  1.7G sleep   0:00    0  0.84% oracle
  10. 20780 oracle     1 48   0  1.8G  1.7G sleep   0:02    0  0.83% oracle
  11. 15828 oracle     1 58   0  1.8G  1.7G sleep   0:58    0  0.53% oracle
  12. 20867 root       1 58   0 4384K 2560K sleep   0:00    0  0.29% sshd2
  13. 20493 oracle     1 58   0  1.8G  1.7G sleep   0:03    0  0.29% oracle
  14. 20887 oracle     1 48   0  1.8G  1.7G sleep   0:00    0  0.13% oracle
  15. 20851 oracle     1 58   0  1.8G  1.7G sleep   0:00    0  0.10% oracle
  16. 20483 oracle     1 48   0  1.8G  1.7G sleep   0:00    0  0.09% oracle
  17. 20875 oracle     1 45   0 1064K  896K sleep   0:00    0  0.07% sh
  18. 20794 oracle     1 58   0  1.8G  1.7G sleep   0:00    0  0.06% oracle
  19. 20842 jiankong   1 52   2 1224K  896K sleep   0:00    0  0.05% sadc
  20. 20888 oracle     1 55   0 1712K 1272K cpu00   0:00    0  0.05% top
  21. 19954 oracle     1 58   0  1.8G  1.7G sleep  84:25    0  0.04% oracle

复制代码


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

论坛徽章:
0
2 [报告]
发表于 2004-10-07 18:46 |只看该作者

Oracle诊断案例-如何诊断和解决CPU高度消耗(100%)的数据库问题

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



  1. $ ps -ef|grep 20521
  2.   oracle 20909 20875  0 10:50:53 pts/10   0:00 grep 20521
  3.   oracle 20521     1 47 10:43:59 ?        6:45 oraclejshs (LOCAL=NO)
  4. $ ps -ef|grep 20845
  5.   oracle 20845     1 44 10:50:00 ?        0:55 oraclejshs (LOCAL=NO)
  6.   oracle 20918 20875  0 10:50:59 pts/10   0:00 grep 20845
复制代码

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

论坛徽章:
0
3 [报告]
发表于 2004-10-07 18:46 |只看该作者

Oracle诊断案例-如何诊断和解决CPU高度消耗(100%)的数据库问题

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




  1. SELECT   /*+ ORDERED */
  2.          sql_text
  3.     FROM v$sqltext a
  4.    WHERE (a.hash_value, a.address) IN (
  5.             SELECT DECODE (sql_hash_value,
  6.                            0, prev_hash_value,
  7.                            sql_hash_value
  8.                           ),
  9.                    DECODE (sql_hash_value, 0, prev_sql_addr, sql_address)
  10.               FROM v$session b
  11.              WHERE b.paddr = (SELECT addr
  12.                                 FROM v$process c
  13.                                WHERE c.spid = '&pid'))
  14. ORDER BY piece ASC
  15. /
复制代码


注意这里我们涉及了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视图,我们得以把操作系统和数据库关联了起来.

论坛徽章:
0
4 [报告]
发表于 2004-10-07 18:47 |只看该作者

Oracle诊断案例-如何诊断和解决CPU高度消耗(100%)的数据库问题

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

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


  1. $ sqlplus "/ as sysdba"

  2. SQL*Plus: Release 9.2.0.3.0 - Production on Mon Dec 29 10:52:14 2003

  3. Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.


  4. Connected to:
  5. Oracle9i Enterprise Edition Release 9.2.0.3.0 - 64bit Production
  6. With the Partitioning, OLAP and Oracle Data Mining options
  7. JServer Release 9.2.0.3.0 - Production

  8. SQL>; @getsql
  9. Enter value for spid: 20521
  10. old  10: where c.spid = '&pid'
  11. new  10: where c.spid = '20521'

  12. SQL_TEXT
  13. ----------------------------------------------------------------
  14. select * from (select VC2URL,VC2PVDID,VC2MOBILE,VC2ENCRYPTFLAG,S
  15. ERVICEID,VC2SUB_TYPE,CISORDER,NUMGUID,VC2KEY1, VC2NEEDDISORDER,V
  16. C2PACKFLAG,datopertime from hsv_2cpsync where datopertime<=sysda
  17. te and numguid>;70000000000308 order by NUMGUid) where rownum<=20

复制代码

论坛徽章:
0
5 [报告]
发表于 2004-10-07 18:48 |只看该作者

Oracle诊断案例-如何诊断和解决CPU高度消耗(100%)的数据库问题

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

论坛徽章:
0
6 [报告]
发表于 2004-10-07 18:48 |只看该作者

Oracle诊断案例-如何诊断和解决CPU高度消耗(100%)的数据库问题

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




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

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


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

  9. PL/SQL procedure successfully completed.

  10. SQL>; !

复制代码


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

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

论坛徽章:
0
7 [报告]
发表于 2004-10-07 18:49 |只看该作者

Oracle诊断案例-如何诊断和解决CPU高度消耗(100%)的数据库问题

6.一点说明

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

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

论坛徽章:
0
8 [报告]
发表于 2004-10-09 17:14 |只看该作者

Oracle诊断案例-如何诊断和解决CPU高度消耗(100%)的数据库问题

好,顶一下

论坛徽章:
0
9 [报告]
发表于 2004-10-09 18:31 |只看该作者

Oracle诊断案例-如何诊断和解决CPU高度消耗(100%)的数据库问题

酷。顶。。。。。。。。。

论坛徽章:
0
10 [报告]
发表于 2004-10-09 21:12 |只看该作者

Oracle诊断案例-如何诊断和解决CPU高度消耗(100%)的数据库问题

COOL!DING!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP