职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 2698|回复: 0

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

[复制链接]
zlyuanna 发表于 2006-9-29 10:37 | 显示全部楼层 |阅读模式
<SPAN class=tpc_content><FONT size=2>很多时候我们的服务器可能会经历CPU消耗100%的性能问题.<BR>排除系统的异常,这类问题通常都是因为系统中存在性能低下甚至存在错误的SQL语句,<BR>消耗了大量的CPU所致.<BR><BR>本文通过一个案例就如何捕获这样的SQL给出一个通用的方法.<BR><BR>问题描述:系统CPU高度消耗,系统运行缓慢<BR>OS:Sun Solaris8<BR>Oracle:Oracle9203<BR><BR>1.首先通过Top命令查看<BR><BR><BR>代码:<BR>CODE:<BR><BR>--------------------------------------------------------------------------------<BR>$ top<BR><BR>load averages: 1.61, 1.28, 1.25 HSWAPJSDB 10:50:44<BR>172 processes: 160 sleeping, 1 running, 3 zombie, 6 stopped, 2 on cpu<BR>CPU states: % idle, % user, % kernel, % iowait, % swap<BR>Memory: 4.0G real, 1.4G free, 1.9G swap in use, 8.9G swap free<BR><BR>ID USERNAME THR PR NCE SIZE RES STATE TIME FLTS CPU COMMAND<BR>20521 oracle 1 40 0 1.8G 1.7G run 6:37 0 47.77% oracle<BR>20845 oracle 1 40 0 1.8G 1.7G cpu02 0:41 0 40.98% oracle<BR>20847 oracle 1 58 0 1.8G 1.7G sleep 0:00 0 0.84% oracle<BR>20780 oracle 1 48 0 1.8G 1.7G sleep 0:02 0 0.83% oracle<BR>15828 oracle 1 58 0 1.8G 1.7G sleep 0:58 0 0.53% oracle<BR>20867 root 1 58 0 4384K 2560K sleep 0:00 0 0.29% sshd2<BR>20493 oracle 1 58 0 1.8G 1.7G sleep 0:03 0 0.29% oracle<BR>20887 oracle 1 48 0 1.8G 1.7G sleep 0:00 0 0.13% oracle<BR>20851 oracle 1 58 0 1.8G 1.7G sleep 0:00 0 0.10% oracle<BR>20483 oracle 1 48 0 1.8G 1.7G sleep 0:00 0 0.09% oracle<BR>20875 oracle 1 45 0 1064K 896K sleep 0:00 0 0.07% sh<BR>20794 oracle 1 58 0 1.8G 1.7G sleep 0:00 0 0.06% oracle<BR>20842 jiankong 1 52 2 1224K 896K sleep 0:00 0 0.05% sadc<BR>20888 oracle 1 55 0 1712K 1272K cpu00 0:00 0 0.05% top<BR>19954 oracle 1 58 0 1.8G 1.7G sleep 84:25 0 0.04% oracle<BR>.--------------------------------------------------------------------------------<BR><BR>[Copy to clipboard]<BR><BR><BR>我们发现在进城列表里,存在两个高CPU耗用的Oracle进城,分别消耗了47.77%和40.98%的CPU资源.<BR><BR>2.找到存在问题的进程信息<BR><BR><BR><BR>代码:<BR>CODE:<BR><BR>--------------------------------------------------------------------------------<BR>$ ps -ef|grep 20521<BR>oracle 20909 20875 0 10:50:53 pts/10 0:00 grep 20521<BR>oracle 20521 1 47 10:43:59 ? 6:45 oraclejshs (LOCAL=NO)<BR>$ ps -ef|grep 20845<BR>oracle 20845 1 44 10:50:00 ? 0:55 oraclejshs (LOCAL=NO)<BR>oracle 20918 20875 0 10:50:59 pts/10 0:00 grep 20845<BR>.--------------------------------------------------------------------------------<BR><BR>[Copy to clipboard]<BR><BR>确认这是两个远程连接的用户进程.<BR><BR>3.熟悉一下我的getsql.sql脚本<BR><BR>代码:<BR>CODE:<BR><BR>--------------------------------------------------------------------------------<BR>SELECT /*+ ORDERED */<BR>sql_text<BR>FROM v$sqltext a<BR>WHERE (a.hash_value, a.address) IN (<BR>SELECT DECODE (sql_hash_value,<BR>0, prev_hash_value,<BR>sql_hash_value<BR>),<BR>DECODE (sql_hash_value, 0, prev_sql_addr, sql_address)<BR>FROM v$session b<BR>WHERE b.paddr = (SELECT addr<BR>FROM v$process c<BR>WHERE c.spid = \'&pid\'))<BR>ORDER BY piece ASC<BR>/<BR><BR>.--------------------------------------------------------------------------------<BR><BR>[Copy to clipboard]<BR><BR>注意这里我们涉及了3个视图,并应用其关联进行数据获取.<BR>首先需要输入一个pid,这个pid即process id,也就是在Top或ps中我们看到的PID.<BR>通过pid和v$process.spid相关联我们可以获得Process的相关信息<BR>进而通过v$process.addr和v$session.paddr相关联,我们就可以获得和session相关的所有信息.<BR>再结合v$sqltext,我们即可获得当前session正在执行的SQL语句.<BR><BR>通过v$process视图,我们得以把操作系统和数据库关联了起来.<BR><BR><BR>4.连接数据库,找到问题sql及进程<BR><BR>通过Top中我们观察到的PID,进而应用我的getsql脚本,我们得到以下结果输出.<BR><BR><BR>代码:<BR>CODE:<BR><BR>--------------------------------------------------------------------------------<BR>$ sqlplus \"/ as sysdba\"<BR><BR>SQL*Plus: Release 9.2.0.3.0 - Production on Mon Dec 29 10:52:14 2003<BR><BR>Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.<BR><BR><BR>Connected to:<BR>Oracle9i Enterprise Edition Release 9.2.0.3.0 - 64bit Production<BR>With the Partitioning, OLAP and Oracle Data Mining options<BR>JServer Release 9.2.0.3.0 - Production<BR><BR>SQL> @getsql<BR>Enter value for spid: 20521<BR>old 10: where c.spid = \'&pid\'<BR>new 10: where c.spid = \'20521\'<BR><BR>SQL_TEXT<BR>----------------------------------------------------------------<BR>select * from (select VC2URL,VC2PVDID,VC2MOBILE,VC2ENCRYPTFLAG,S<BR>ERVICEID,VC2SUB_TYPE,CISORDER,NUMGUID,VC2KEY1, VC2NEEDDISORDER,V<BR>C2PACKFLAG,datopertime from hsv_2cpsync where datopertime<=sysda<BR>te and numguid>70000000000308 order by NUMGUid) where rownum<=20<BR>.--------------------------------------------------------------------------------<BR><BR>[Copy to clipboard]<BR><BR><BR>那么这段代码就是当前正在疯狂消耗CPU的罪魁祸首.<BR>接下来需要进行的工作就是找出这段代码的问题,看是否可以通过优化提高其效率,减少资源消耗. <BR><BR><BR>5.进一步的我们可以通过dbms_system包跟踪该进程.<BR><BR><BR><BR>代码:<BR>CODE:<BR><BR>--------------------------------------------------------------------------------<BR>SQL> @getsid<BR>Enter value for spid: 20521<BR>old 3: select addr from v$process where spid = &spid)<BR>new 3: select addr from v$process where spid = 20521)<BR><BR>SID SERIAL# USERNAME MACHINE<BR>----------------------------------------------------------------<BR>45 38991 HSUSER_V51 hswapjsptl1.hurray.com.cn<BR><BR><BR>SQL> exec dbms_system.set_sql_trace_in_session(45,38991,true);<BR><BR>L/SQL procedure successfully completed.<BR><BR>SQL> !<BR><BR>.--------------------------------------------------------------------------------<BR><BR><BR>[Copy to clipboard]<BR><BR>这部分内容可以参考:<BR></FONT><A href=\"http://www.eygle.com/case/sql_trace_1.htm\" target=_blank><FONT size=2>http://www.eygle.com/case/sql_trace_1.htm</FONT></A><BR><BR><FONT size=2>对于Windows上的类似问题,可以参考:<BR></FONT><A href=\"http://www.eygle.com/faq/Use.Nt.tools.manage.Oracle.htm\" target=_blank><FONT size=2>http://www.eygle.com/faq/Use.Nt.tools.manage.Oracle.htm</FONT></A><BR><BR><BR><FONT size=2>一点说明<BR><BR>很多时候,高CPU消耗都是由于问题SQL导致的,所以找到这些SQL通常也就找到了问题所在,通过优化调整<BR>通常就可以解决问题。<BR><BR>但是有时候你可能会发现,这些最消耗CPU的进程是后台进程,这一般是由于异常、BUG或者恢复后的异常<BR>导致的,需要具体问题具体分析了.</FONT></SPAN><BR>
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-4-29 06:55 , Processed in 0.110463 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表