ORACLE CPU过高的一次调整过程
发现CPU占用率一般都维持在90%以上,由于大量使用FOR UPDATE,造成大量LATCH等等待现象,其中某些多线程SQL又运行非常频繁。很久以前就发现这些问题,给出相对意见,建议不采用FOR UPDATE或在FOR UPDATE上加NOWAIT(见http://spaces.msn.com/sunmoonking/blog/cns!E3BD9CBED01777CA!318.entry “ELECT FOR UPDATE 相关的知识”一章 ),由于项目进程问题一直没进行程序修改,决定在这次解决掉,以解后顾之忧。
在STATSPACK和我的whoit.sh都指定是这个SQL的问题
调整前要知道如下问题
1,CPU是多少MHZ
2,SERVER 端的CPU是否有负荷较重
3,CLIENT 端的CPU是否有负荷较重
4,空闲时间(如半夜)CPU使用率是否超过15%,如果超过则需要特别注意了
5,CPU的PEAK LOAD
6,CPU的IDLE STATE
1,CPU是多少MHZ
2,SERVER 端的CPU是否有负荷较重
3,CLIENT 端的CPU是否有负荷较重
4,空闲时间(如半夜)CPU使用率是否超过15%,如果超过则需要特别注意了
5,CPU的PEAK LOAD
6,CPU的IDLE STATE
影响CPU的因素
1,高的无必要的解析会代价昂贵。
发现那些SQL运行了大量的PARSE
select sql_text, parse_calls, executions from v$sqlarea order by parse_calls desc;
SYS的总的PARSE情况
select name, value from v$sysstat where name = ’parse count%’;
只有硬解析才能减少,可以绑定变量,或增加每一个SESSION的CACHED CURSORS。
2,导致大量I/O的SQL也会明显占用CPU,如没有INDEX。BUFFER GETS一般会同CPU一块增长。可以通过v$sqlarea发现buffer_gets
3,其他等待时间,可以通过v$sesstat,v$sysstat查看
发现那些SQL运行了大量的PARSE
select sql_text, parse_calls, executions from v$sqlarea order by parse_calls desc;
SYS的总的PARSE情况
select name, value from v$sysstat where name = ’parse count%’;
只有硬解析才能减少,可以绑定变量,或增加每一个SESSION的CACHED CURSORS。
2,导致大量I/O的SQL也会明显占用CPU,如没有INDEX。BUFFER GETS一般会同CPU一块增长。可以通过v$sqlarea发现buffer_gets
3,其他等待时间,可以通过v$sesstat,v$sysstat查看
#VMSTAT 5 5 的CPU部分
us user用掉的
sy system用掉的
id 空闲
us user用掉的
sy system用掉的
id 空闲
调整前
TOPAS
Name PID CPU% PgSp Owner
oracle 688416 25.2 4.6 orasbp
oracle 569658 24.9 4.5 orasbp
topas 676210 0.1 2.9 root
syncd 77964 0.0 0.5 root
hatsd 159792 0.0 8.3 root
TOPAS
Name PID CPU% PgSp Owner
oracle 688416 25.2 4.6 orasbp
oracle 569658 24.9 4.5 orasbp
topas 676210 0.1 2.9 root
syncd 77964 0.0 0.5 root
hatsd 159792 0.0 8.3 root
或者ps aux|head
检查CPU数量
/usr/sbin/bindprocessor -q
The available processors are: 0 1 2 3
/usr/sbin/bindprocessor -q
The available processors are: 0 1 2 3
STATSPACK的信息
Total Wait wait Waits
Event Waits Timeouts Time (s) (ms) /txn
---------------------------- ------------ ---------- ---------- ------ --------
enqueue 5,465 121 1,793 328 0.6
latch free 2,986 2,669 21 7 0.3
Event Waits Timeouts Time (s) (ms) /txn
---------------------------- ------------ ---------- ---------- ------ --------
enqueue 5,465 121 1,793 328 0.6
latch free 2,986 2,669 21 7 0.3
根据消耗最多CPU的进程PID来得到SID详细信息
select s.sid from v$process p, v$session s
where s.paddr=p.addr and p.spid = &your_spid;
根据SID查SQL
SELECT SQL_TEXT from V$SQLTEXT_WITH_NEWLINES where HASH_VALUE
= (select sql_hash_value from v$session
where SID = <problem_SID_you_got_from_last_step>) ;
还有
select n.name,s.value
from v$statname n,V$sesstat s
where n.statistic# = s.statistic#
and value > 0
and s.sid = (select a.sid from v$process p,v$session a
where p.addr =a.paddr
and a.terminal = userenv(’terminal’))
order by n.class,n.name
用以上SQL完成SHELL(shell信息在后面whoit.sh),运行
sh whoit.sh 688416 来根据PID得到用户信息和SQL语句
select s.sid from v$process p, v$session s
where s.paddr=p.addr and p.spid = &your_spid;
根据SID查SQL
SELECT SQL_TEXT from V$SQLTEXT_WITH_NEWLINES where HASH_VALUE
= (select sql_hash_value from v$session
where SID = <problem_SID_you_got_from_last_step>) ;
还有
select n.name,s.value
from v$statname n,V$sesstat s
where n.statistic# = s.statistic#
and value > 0
and s.sid = (select a.sid from v$process p,v$session a
where p.addr =a.paddr
and a.terminal = userenv(’terminal’))
order by n.class,n.name
用以上SQL完成SHELL(shell信息在后面whoit.sh),运行
sh whoit.sh 688416 来根据PID得到用户信息和SQL语句
在STATSPACK和我的whoit.sh都指定是这个SQL的问题
SELECT demessageid, fromid, apptype, demessage,appversion,vovers
ion ,toid,tag FROM de_receivelog WHERE (status = :1 and rownum<
=1 and (dealtime is null or dealtime<sysdate) and delock=0) or (
delock=1 and Update_Date<sysdate-2/24) order by RECEIVETIME for
update
ion ,toid,tag FROM de_receivelog WHERE (status = :1 and rownum<
=1 and (dealtime is null or dealtime<sysdate) and delock=0) or (
delock=1 and Update_Date<sysdate-2/24) order by RECEIVETIME for
update
再看等待事件
select sid||' '||event||' '|| total_waits||' '||average_wait from v$session_event where sid=25
SQL> /
select sid||' '||event||' '|| total_waits||' '||average_wait from v$session_event where sid=25
SQL> /
SID||''||EVENT||''||TOTAL_WAITS||''||AVERAGE_WAIT
--------------------------------------------------------------------------------
25 latch free 46180 1
25 control file sequential read 4 0
25 log file sync 1 0
25 db file sequential read 202 0
25 db file scattered read 445 1
25 SQL*Net message to client 22 0
25 SQL*Net message from client 22 0
--------------------------------------------------------------------------------
25 latch free 46180 1
25 control file sequential read 4 0
25 log file sync 1 0
25 db file sequential read 202 0
25 db file scattered read 445 1
25 SQL*Net message to client 22 0
25 SQL*Net message from client 22 0
只有一个DEFAULT 池
NAME HIT_RATIO
---------------------------------------- ----------
DEFAULT .88042806
NAME HIT_RATIO
---------------------------------------- ----------
DEFAULT .88042806
最新评论共有 0 位网友发表了评论
查看所有评论
发表评论
热点关注
- ubuntu安装oracle 10g
- Oracle exp/imp导出导入工
- linux AS4上安装oracle 9i
- Oracle 10g RAC 关机重启
- oracle-merge用法详解
- oracle中的 exists 和 in
- ORACLE数据库表分区
- DSG(HP-UX)HA-RAC的oracle
- oracle 问题精解
- Oracle 10.1.0.5归档日志
- Oracle索引原理
- oracle exp/imp命令详解
- 使用Appfuse2.0.1开始开发
- Oracle查询用户权限
- 10g的OEM DBCONSOLE和ISQL
- Oracle建立DBLINK的详细步
- Oracle HA 在Unix上双机环
- Oracle HA 在Unix上双机环
- oracle 环境变量学习小结
- Oracle技术的位操作
