- 浏览: 758153 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
di1984HIT:
哈哈,都不错。
Linux 环境下SQLPLUS 回退键无法使用处理方法 -
di1984HIT:
还可以查到sql
oracle中查询被锁的表并释放session -
di1984HIT:
呵呵,真的不错。
Oracle数据库经常会遇到CPU利用率很高的情况 -
李君寻:
...
解读java连接db2的四种类型 -
清风123:
dx>=this.length
js删除Array数组中的某个元素
Oracle数据库经常会遇到CPU利用率很高的情况,这种时候大都是数据库中存在着严重性能低下的SQL语句,这种SQL语句大大的消耗了CPU资源,导致整个系统性能低下。当然,引起严重性能低下的SQL语句的原因是多方面的,具体的原因要具体的来分析,下面通过一个实际的案例来说明如何来诊断和解决CPU利用率高的这类问题。
操作系统:solairs8
数据库:Oracle9.2.0.4
问题描述:现场工程师汇报数据库非常慢,几乎所有应用操作均无法正常进行。
首先登陆主机,执行top发现CPU资源几乎消耗殆尽,存在很多占用CPU很高的进程,而内存和I/O都不高,具体如下:
last pid: 26136; load averages: 8.89, 8.91, 8.12
216 processes: 204 sleeping, 8 running, 4 on cpu
CPU states: 0.6% idle, 97.3% user, 1.8% kernel, 0.2% iowait, 0.0% swap
Memory: 8192M real, 1166M free, 14M swap in use, 8179M swap free
PID USERNAME THR PRI NICE SIZE RES STATE TIME CPU COMMAND
25725 oracle 1 50 0 4550M 4508M cpu2 12:23 11.23% oracle
25774 oracle 1 41 0 4550M 4508M run 14:25 10.66% oracle
26016 oracle 1 31 0 4550M 4508M run 5:41 10.37% oracle
26010 oracle 1 41 0 4550M 4508M run 4:40 9.81% oracle
26014 oracle 1 51 0 4550M 4506M cpu6 4:19 9.76% oracle
25873 oracle 1 41 0 4550M 4508M run 12:10 9.45% oracle
25723 oracle 1 50 0 4550M 4508M run 15:09 9.40% oracle
26121 oracle 1 41 0 4550M 4506M cpu0 1:13 9.28% oracle
于是先查看数据库的告警日志ALERT文件,并没有发现有什么错误存在,日志显示数据库运行正常,排除数据库本身存在问题。
然后查看这些占用CPU资源很高的Oracle进程究竟是在做什么操作,使用如下SQL语句:
select sql_text,spid,v$session.program,process from
v$sqlarea,v$session,v$process
where v$sqlarea.address=v$session.sql_address
and v$sqlarea.hashvalue=v$session.sql_hash_value
and v$session.paddr=v$process.addr
and v$process.spid in (PID);
用top中占用CPU很高的进程的PID替换脚本中的PID,得到相应的Oracle进程所执行的SQL语句,发现占用CPU资源很高的进程都是执行同一个SQL语句:
SELECT d.domainname,d.mswitchdomainid, a.SERVICEID,a.SERVICECODE,a.USERTYPE,a.STATUS,a.NOTIFYSTATUS,to_char(a.DATECREATED,'yyyy-mm-dd hh24:mi:ss') DATECREATED,VIPFLAG,STATUS2,CUSTOMERTYPE,CUSTOMERID FROM service a, gatewayloc b, subbureaunumber c, mswitchdomain d WHERE b.mswitchdomainid = d.mswitchdomainid and b.gatewaysn = c.gatewaysn AND a.ServiceCode like c.code||'%' and a.serviceSpecID=1 and a.status!='4' and a.status!='10' and a.servicecode like '010987654321%' and SubsidiaryID=999999999
基本上可以肯定是这个SQL引起了系统CPU资源大量被占用,那究竟是什么原因造成这个SQL这么大量占用CPU资源呢,我们先来看看数据库的进程等待事件都有些什么:
SQL> select sid,event,p1,p1text from v$session_wait;
SID EVENT P1 P1TEXT
---------- ----------------------------------------------------------------
12 latch free 4.3982E+12 address
36 latch free 4.3982E+12 address
37 latch free 4.3982E+12 address
84 latch free 4.3982E+12 address
102 latch free 4.3982E+12 address
101 latch free 4.3982E+12 address
85 latch free 4.3982E+12 address
106 latch free 4.3982E+12 address
155 latch free 4.3982E+12 address
151 latch free 4.3982E+12 address
149 latch free 4.3982E+12 address
147 latch free 4.3982E+12 address
1 pmon timer 300 duration
从上面的查询我们可以看出,大都是latch free的等待事件,然后接着查一下这些latch的等待都是什么进程产生的:
SQL> select spid from v$process where addr in
(select paddr from v$session where sid in(84,102,101,106,155,151));
SPID
------------
25774
26010
25873
25725
由此看出latch free这个等待事件导致了上面的那个SQL语句都在等待,占用了大量的CPU资源。我们来看看究竟主要是那种类型的latch的等待,根据下面的SQL语句:
SQL> SELECT latch#, name, gets, misses, sleeps
FROM v$latch
WHERE sleeps>0
ORDER BY sleeps;
LATCH# NAME GETS MISSES SLEEPS
---------- ----------------------------------------------------------------
15 messages 96876 20 1
159 library cache pin allocation 407322 43 1
132 dml lock allocation 194533 213 2
4 session allocation 304897 48 3
115 redo allocation 238031 286 4
17 enqueue hash chains 277510 85 5
7 session idle bit 2727264 314 16
158 library cache pin 3881788 5586 58
156 shared pool 2771629 6184 662
157 library cache 5637573 25246 801
98 cache buffers chains 1722750424 758400 109837
由上面的查询可以看出最主要的latch等待是cache buffers chains,这个latch的等待表明数据库存在单独的BLOCK的竞争这些latch,我们来看这个latch存在的子latch及其对应的类型:
SQL> SELECT addr, latch#, gets, misses, sleeps
FROM v$latch_children
WHERE sleeps>0
and latch# = 98
ORDER BY sleeps desc;
ADDR LATCH# GETS MISSES SLEEPS
---------------- ---------- ---------- ---------- ----------
000004000A3DFD10 98 10840661 82891 389
000004000A698C70 98 159510 2 244
0000040009B21738 98 104269771 34926 209
0000040009B227A8 98 107604659 35697 185
000004000A3E0D70 98 5447601 18922 156
000004000A6C2BD0 98 853375 7 134
0000040009B24888 98 85538409 25752 106
……………
接着我们来查看sleep较多的子latch对应都有哪些对象:
SQL> select distinct a.owner,a.segment_name,a.segment_type from
dba_extents a,
(select dbarfil,dbablk
from x$bh
where hladdr in
(select addr
from (select addr
from v$latch_children
order by sleeps desc)
where rownum < 5)) b
where a.RELATIVE_FNO = b.dbarfil
and a.BLOCK_ID <= b.dbablk and a.block_id + a.blocks > b.dbablk;
OWNER SEGMENT_NAME SEGMENT_TYPE
---------------------------------------------------------------------------
TEST I_SERVICE_SERVICESPECID INDEX
TEST I_SERVICE_SUBSIDIARYID INDEX
TEST SERVICE TABLE
TEST MSWITCHDOMAIN TABLE
TEST I_SERVICE_SC_S INDEX
…………………
我们看到在开始的那个SQL语句中的几个对象都有包括在内,于是来看看开始的那个SQL的执行计划:
SQL> set autotrace trace explain
SQL>SELECT d.domainname,d.mswitchdomainid, a.SERVICEID,a.SERVICECODE,a.USERTYPE,a.STATUS,a.NOTIFYSTATUS,to_char(a.DATECREATED,'yyyy-mm-dd hh24:mi:ss') DATECREATED,VIPFLAG,STATUS2,CUSTOMERTYPE,CUSTOMERID FROM service a, gatewayloc b, subbureaunumber c, mswitchdomain d WHERE b.mswitchdomainid = d.mswitchdomainid and b.gatewaysn = c.gatewaysn AND a.ServiceCode like c.code||'%' and a.serviceSpecID=1 and a.status!='4' and a.status!='10' and a.servicecode like '010987654321%' and SubsidiaryID=999999999;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 NESTED LOOPS
2 1 NESTED LOOPS
3 2 NESTED LOOPS
4 3 TABLE ACCESS (FULL) OF 'SUBBUREAUNUMBER'
5 3 TABLE ACCESS (BY INDEX ROWID) OF 'GATEWAYLOC'
6 5 INDEX (UNIQUE SCAN) OF 'PK_GATEWAYLOC' (UNIQUE)
7 2 TABLE ACCESS (BY INDEX ROWID) OF 'MSWITCHDOMAIN'
8 7 INDEX (UNIQUE SCAN) OF 'PK_MSWITCHDOMAIN' (UNIQUE)
9 1 TABLE ACCESS (BY INDEX ROWID) OF 'SERVICE'
10 9 AND-EQUAL
11 10 INDEX (RANGE SCAN) OF 'I_SERVICE_SERVICESPECID' (NON
-UNIQUE)
12 10 INDEX (RANGE SCAN) OF 'I_SERVICE_SUBSIDIARYID' (NON-
UNIQUE)
根据开始查到的引起latch free等待中的对象和SQL语句的执行计划,觉得SERVICE表上的索引有问题,似乎存在了过多的扫描,于是将同样的SQL语句在别的地市的同样的数据库上执行一下,查看相应的执行计划:
SQL> set autotrace trace explain
SQL>SELECT d.domainname,d.mswitchdomainid, a.SERVICEID,a.SERVICECODE,a.USERTYPE,a.STATUS,a.NOTIFYSTATUS,to_char(a.DATECREATED,'yyyy-mm-dd hh24:mi:ss') DATECREATED,VIPFLAG,STATUS2,CUSTOMERTYPE,CUSTOMERID FROM service a, gatewayloc b, subbureaunumber c, mswitchdomain d WHERE b.mswitchdomainid = d.mswitchdomainid and b.gatewaysn = c.gatewaysn AND a.ServiceCode like c.code||'%' and a.serviceSpecID=1 and a.status!='4' and a.status!='10' and a.servicecode like '010987654321%' and SubsidiaryID=999999999;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'SERVICE'
2 1 NESTED LOOPS
3 2 NESTED LOOPS
4 3 NESTED LOOPS
5 4 TABLE ACCESS (FULL) OF 'SUBBUREAUNUMBER'
6 4 TABLE ACCESS (BY INDEX ROWID) OF 'GATEWAYLOC'
7 6 INDEX (UNIQUE SCAN) OF 'PK_GATEWAYLOC' (UNIQUE)
8 3 TABLE ACCESS (BY INDEX ROWID) OF 'MSWITCHDOMAIN'
9 8 INDEX (UNIQUE SCAN) OF 'PK_MSWITCHDOMAIN' (UNIQUE)
10 2 INDEX (RANGE SCAN) OF 'I_SERVICE_SC_S' (NON-UNIQUE)
对比两个执行计划,发现索引I_SERVICE_SERVICESPECID和I_SERVICE_SUBSIDIARYID是不应该走的,于是又对比了两个地方SERVICE表上的索引个数:
SQL> select index_name from user_indexes where table_name='SERVICE';
INDEX_NAME
------------------------------
I_SERVICE_ACCOUNTNUM
I_SERVICE_CID
I_SERVICE_DATEACTIVATED
I_SERVICE_PRICEPLANID
I_SERVICE_SC_S
I_SERVICE_SERVICECODE
I_SERVICE_SERVICESPECID
I_SERVICE_SUBSIDIARYID
PK_SERVICE_SID
SQL> select index_name from user_indexes where table_name='SERVICE';
INDEX_NAME
------------------------------
I_SERVICE_ACCOUNTNUM
I_SERVICE_CID
I_SERVICE_DATEACTIVATED
I_SERVICE_SC_S
I_SERVICE_SERVICECODE
PK_SERVICE_SID
发现存在问题的数据库中的SERVICE表上不知道怎么多出了I_SERVICE_PRICEPLANID、I_SERVICE_SERVICESPECID 、I_SERVICE_SUBSIDIARYID三个索引,而这些索引就是导致了开始那个SQL语句用了不该用的索引,引起latch free等待和CPU占用很高的罪魁祸首,于是删除了那三个索引,重新执行相应的SQL语句,很快就得出了结果,CPU的利用率也马上下降为正常了,观察结果如下:
last pid: 26387; load averages: 1.61, 1.38, 1.21
195 processes: 194 sleeping, 1 on cpu
CPU states: 96.2% idle, 1.6% user, 1.7% kernel, 0.5% iowait, 0.0% swap
Memory: 8192M real, 1183M free, 14M swap in use, 8179M swap free
PID USERNAME THR PRI NICE SIZE RES STATE TIME CPU COMMAND
26383 oracle 1 59 0 4550M 4506M sleep 0:12 4.52% oracle
409 root 15 59 0 7168K 7008K sleep 173.1H 0.53% picld
25653 oracle 1 59 0 4550M 4508M sleep 2:12 0.48% oracle
26384 root 1 59 0 2800K 1912K cpu2 0:00 0.21% top-3.5b8-sun4u
25569 oracle 1 59 0 4550M 4508M sleep 0:12 0.09% oracle
25717 oracle 1 59 0 4550M 4507M sleep 0:07 0.05% oracle
25571 oracle 1 59 0 4550M 4507M sleep 0:10 0.04% oracle
25681 oracle 1 59 0 4550M 4508M sleep 0:10 0.04% oracle
25544 oracle 1 58 0 4554M 4501M sleep 0:14 0.03% oracle
25703 oracle 1 59 0 4550M 4506M sleep 0:23 0.03% oracle
………………
对于CPU利用率过高的情况,如果是SQL语句性能比较低下引起的基本上都可以按照这个思路来诊断和解决问题,当然具体问题还得具体分析,解决问题的方法也有很多种,这里不过是抛砖引玉一下,只要能最终达到我们解决问题的目的就可以了。
作者简介:
照片
暂缺
网名coolyl
CSDN eMag Oracle电子杂志主编
现任itpub Oracle管理版版主。
擅长数据库的维护,对于数据库的安装,调整,备份方面有自己独到的经验。同时也给一些国内的大型企业做过oracle的培训,有一定的培训经验。
曾做过很多大型项目的数据库维护和支持工作,对oracle的维护有相当多的实际经验,善于现场解决问题。
曾任职于国内某大型软件企业做oracle数据库的技术支持,客户遍及全国各个行业,尤其是电信,政府行业。
现任职于某外资电信企业华北区分公司,DBA,负责华北区40多个数据库系统的维护,对大型数据库管理经验丰富。
《Oracle数据库DBA专题技术精粹》一书的主编及主要作者.
发表评论
-
ORA-01950: no privileges on tablespace "example_tbs"
2012-04-20 14:38 1365原因:用户没有此表空间分配EXTENT的权限 可以两个 ... -
Oracle 数据字典视图(V$,GV$,X$)
2010-06-10 11:11 2250常用的几个数据字典: ... -
oracle中查询被锁的表并释放session
2010-06-10 10:10 2717在开发项目中经常发现有人锁住表不放 我们可以通alter s ... -
在oracle中通过connect by prior来实现递归查询
2010-05-06 13:52 1576connect by 是结构化查询 ... -
oracle中跟用户及权限有关的系统表
2010-04-20 15:54 14451.查看所有用户: select * from dba_u ... -
oracle 物化视图
2010-04-20 09:24 2302优势 可以提 ... -
oracle 查看跟踪文件
2010-03-24 09:35 1225sql_trace 和10046 事件 首先 SQL> ... -
v$lock视图
2010-03-19 15:49 2015v$lock视图SID:Identifier for sess ... -
如何设置Oracle Events以跟踪数据库
2010-03-18 10:33 1771Events事件是Oracle的重要诊断工具及问题解决办法,很 ... -
oracle“SQL Trace”简介
2010-03-17 17:03 1947一、概述 “SQL TRACE”是Oracle提供的用于进行 ... -
Oracle数据库提高命中率及相关优化
2010-03-15 17:06 2029本文是关于Oracle数据库调试与优化方面的文章,主要介绍Or ... -
多种方法查看Oracle SQL执行计划
2010-03-15 16:38 2250一.在线查看执行计划表如果PLAN_TABLE表不存在,执行$ ... -
oracle hint提示优化SQL
2010-03-09 16:47 1630在优化调整数据库的SQL时候,经常会用到HINT提示.目前OR ... -
oracle问题 SP2-0613: 无法验证 PLAN_TABLE 格式或实体
2010-03-05 11:40 1852此错误表示还没有创建 plan_table 表 先创建 ... -
Oracle truncate table 与 delete tabel的区别
2010-03-04 13:56 2004一、 1.delete产生rollback,如果删除大数据 ... -
Oracle 索引的分类
2010-03-02 17:54 1734逻辑上: Single column 单列索引Concaten ... -
oracle 锁等待的诊断及排除
2010-03-02 16:38 2726在ORACLE中,为了保证数据的一致性,在对数据库中的数据进行 ... -
Red Hat Enterprise Linux 5 上安装RAC环境
2010-01-29 16:36 1185oracle 10 在 Red Hat Enterprise ... -
oracle9i 启用Partition功能
2009-11-25 17:44 14801、确定安装oracle9i企业版本 select * fr ... -
oracle性能调整—PCTFREE、PCTUSED
2009-10-30 10:45 5164一、定义 1、PCTFREE、PCT ...
相关推荐
在Unix环境下,`sar`是一个非常实用的工具,它可以用来监控CPU、内存、交换空间和磁盘利用率。`sar -u 2 10`命令用于每两秒收集一次数据,持续10次,这样可以获取一段时间内的系统平均负载。关注的指标中,`%wio`...
- 如果发现CPU利用率过高或内存不足等问题,可能需要调整系统配置或增加硬件资源。 ##### 6.12 查看是否有僵死进程 - **SQL命令**:`SELECT sid, serial#, username, osuser, machine, program, status, logon_...
7. **CPU利用率**:数据库服务器CPU的使用情况,过高可能表明计算资源不足或存在过度使用。 二、Oracle数据库性能指标 1. **数据库负载**:监控数据库的活动,如会话数、进程数等,反映系统压力。 2. **PGA(程序...
1. 性能监控:定期检查数据库性能指标,如CPU利用率、内存使用、I/O负载等。 2. 问题诊断:快速定位和解决SQL语句执行慢、等待事件多等问题。 3. 空间管理:合理规划和调整表空间,避免空间不足或浪费。 4. 安全管理...
在Unix环境下,可以使用`sar`工具来监控CPU、内存、交换空间和磁盘I/O的利用率。例如,通过运行`Sar -u 2 10`,可以每两秒收集一次数据,持续10次,以了解系统的整体负载情况。如果`%wio`(等待I/O完成的百分比)值...
监控内容包括CPU利用率、内存使用情况、磁盘I/O等关键性能指标。 综上所述,对一重集团生产管理信息系统Oracle数据库的性能调整是一个系统性的工作,涉及到内存分配、参数优化、索引设计以及性能监控等多个方面。...
在Oracle数据库性能调整与优化中,CPU使用率是一个重要指标。正常情况下,服务器在工作高峰期CPU使用率应超过80%,否则可能表明资源未充分利用或存在性能问题。网络I/O优化涉及减少网络负载,通过使用数据库触发器、...
例如,某运营商的网络管理数据库服务器在不同时间段的CPU和内存利用率差异很大,有的在高峰期达到近65%,而有的则在大部分时间处于低使用状态。这种不均衡的使用情况增加了运营成本,且维护效率低下,因为需要管理...
在某些情况下,如描述中的案例,客户面临的是一个性能严重下降的问题,数据库CPU利用率长时间维持在100%,且主要由系统(SYS)进程消耗。 客户系统配置为RHEL 5.2上的Oracle 10.2.0.4,拥有4颗4核Xeon处理器和32GB...
Oracle数据库效率优化主要聚焦在对SQL语句的调整和数据库设计的改进,以提升系统整体性能。根据描述,优化数据库可以带来显著的性能提升,其中SQL语句优化占据了重要地位,因为它占据了数据库资源的大部分消耗。 一...
### ORACLE数据库日常工作维护知识总结 #### 一、检查数据库基本状况 **1.1. 检查Oracle实例状态** - **命令**: 使用以下SQL命令来检查Oracle实例的状态: ```sql SELECT instance_name, host_name, startup_...
- **检查空闲期间、高峰期间以及平均的CPU利用率**:通过监控工具实时查看CPU的利用率情况,确保不会超过建议的最大阈值(如85%)。 - **增加CPU数量**:如果发现CPU利用率长期处于高位,可以通过增加CPU数量来提升...
当发现内存问题时,如`vmstat`中的`pi`非零,内存中的`free`值很小,或`glance`、`topas`显示内存利用率过高(通常超过80%),可以采取以下措施: 1. 避免分配给Oracle的内存超过系统总内存的一半,一般建议保持在40...
数据库管理员需要密切注意影响数据库系统性能的多个要素,包括CPU、RAM、存储系统、操作系统参数配置和Oracle数据库参数配置等。 在数据库优化的过程中,还需要关注响应时间、吞吐量、命中率和内存使用效率等评价...
1. **性能指标**:如CPU利用率、内存使用情况、I/O性能、SQL查询效率等。这些指标可以帮助我们识别系统瓶颈,调整资源分配,确保数据库高效运行。 2. **数据库活动**:监控会话数量、用户连接、事务处理速度以及锁...
2. **并行执行参数**:通过设置适当的并行度参数来平衡CPU利用率和I/O负载。 3. **缓存策略**:优化缓存命中率,减少物理读取次数。 #### 五、实例级优化技巧 1. **动态性能视图监控**:利用Oracle提供的动态性能...
假设某企业的Oracle9i数据库在高峰期出现明显的性能瓶颈,具体表现为响应时间延长、CPU利用率过高、磁盘I/O频繁等问题。 ##### 5.2 问题诊断 - **性能数据收集**: 使用AWR报告和其他监控工具收集相关数据。 - **...
例如,调整SGA(System Global Area)的大小,可以提高内存利用率,减少磁盘I/O。同时,根据数据库的工作负载和应用特性,合理设置并调整其他参数,如缓存大小、排序区大小等,有助于提升系统性能。 3. 物理文件...
这些技术和方法不仅适用于Oracle9i版本,很多原则和策略也适用于其他版本的Oracle数据库甚至是其他类型的关系型数据库管理系统。掌握这些知识和技术将有助于我们在实际工作中解决复杂的性能问题,提升系统的整体性能...
在示例中,CPU利用率仅为2%,说明系统压力很小。 6. **报告对比**:通过对比不同报告中的DB Time,可以发现服务器在不同时间段的负载差异。例如,Report A的CPU利用率明显高于Report B,表明在Report A的时段,...