Oracle CPU 性能数据收集

热度 2已有 1712 次阅读2012-8-13 11:17 |个人分类:Linux 系统管理| 操作系统, linux, Oracle

在linux/Unix系统中,操作系统提供了调度机制来共享使用CPU。这个调度机制在三种状态下转化。准备队列,暂停(睡眠),运行中。
running - 运行中,进程在使用CPU执行指令。直到被操作系统打断,或者进程自动放弃CPU。打断的原因:另一个进程具有更高优先级需要
CPU;另一个进程具有相似优先级,且调度程序按round-bin或FIFO共享算法分配CPU。
suspend - 暂停,当一个进程必须等待资源比如IO(需要很长时间)或者网络套接字信息,然后进程进入暂停(睡眠)状态。当等待的操作
完成或者预订的睡眠时间完成,进程被唤醒并被放到ready-to-run状态。
ready-to-run - 准备运行,进程进入运行队列。运行队列是有序的结构,一个进程只能使用一个CPU。每个CPU有自己的运行队列。ready
-to-run进程需要CPU资源。当多个进程竞争CPU时间时,队列长度就增长。与此相对应,如果很多进程竞争IO,并从CPU运行状态转化到暂停
状态。当很多进程暂停时,准备运行队列长度很小,CPU资源就变得很富裕。当IO激增时,结果导致CPU使用率下降。
OS cpu 数据收集
vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 3 18 262136   9460    516  15304    3    8  2918  1839  572  393  2 27 27 44  0
 0 25 262136   8088    564  15852    0    0  8252     0 3455 1743  1 57  0 41  1
 3 21 262136   8152    328  13180    0    0  6576     0 3891 1581  0 77  0 22  1
 9 21 262136   8876    248   9888    0    0  4076     0 4024 1163  0 89  0  5  6
15 18 262136   8204    212   8504    0    0  4084     4 4081 1175  0 93  0  7  0
proces
r 进程的个数,这些进程处于等待状态和基本不做任何事,但是在等待运行。
b 进程的个数,这些进程在睡眠状态,并从上次更新后被中断允许。
w 进程的个数,这些进程被mm和vm子系统交换出去,还没有运行
MEMORY
swap 空闲的swap空间
PAGE
pi 交换分页进来的大小(k)
po 交换分页出去的大小(k)
DISK
Bi 每秒读的块数
Bo 每秒写的块数
CPU
Us 用于用户进程的CPU使用百分比
Sy 用于系统进程的CPU使用百分比
Id CPU空闲百分比
Wa CPU 空闲时间,在此期间系统有未完成的磁盘/NFS I/O 请求。请参阅上面的详细描述。
procs - r 过大,阀值是每个cpu四个进程
procs - 如果b的值比r大,那么可能是磁盘有问题。
page - pi/po如果持续增加,表示内存短缺
cpu - sy 在OLTP系统中,CPU中sy利用率不超过10%;在数据仓库系统中,需要更多的IO调用,那么CPU中sys有高利用率是正常的。CPU中
sy利用率高请检查内存短缺,过度的IO,频繁的数据库连接,或者其他(使用truss收集更多进程信息或者检查数据库的度量logons
cumulative)
cpu - us 如果us利用率很高,那就是应用进程在使用CPU。可以使用top和glance来查看哪些进程使用CPU。
top
top - 14:36:37 up 4:26, 3 users, load average: 0.05, 0.11, 0.28
Tasks: 124 total, 1 running, 123 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.2% us, 0.1% sy, 0.0% ni, 66.6% id, 33.1% wa, 0.0% hi, 0.0% si
Mem: 12299332k total, 2569836k used, 9729496k free, 61288k buffers
Swap: 20972816k total, 0k used, 20972816k free, 2274852k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6345 oracle 16 0 37132 1752 1172 S 0.0 0.0 0:00.08 sshd
6346 oracle 16 0 54004 1536 1208 S 0.0 0.0 0:00.02 bash
6423 oracle 16 0 45376 10m 6228 S 0.0 0.1 0:00.25 tnslsnr
6471 oracle 16 0 740m 17m 13m S 0.0 0.1 0:00.02 oracle
6473 oracle 16 0 739m 15m 12m S 0.0 0.1 0:00.01 oracle
6475 oracle 16 0 739m 32m 29m S 0.0 0.3 0:00.07 oracle
6477 oracle 16 0 742m 50m 44m S 0.0 0.4 0:00.27 oracle
6479 oracle 16 0 754m 23m 19m S 0.0 0.2 0:00.43 oracle
6481 oracle 16 0 739m 24m 20m S 0.0 0.2 0:00.61 oracle
6483 oracle 16 0 740m 88m 83m S 0.0 0.7 0:00.71 oracle
6485 oracle 16 0 739m 22m 19m S 0.0 0.2 0:00.01 oracle
6487 oracle 16 0 740m 30m 25m S 0.0 0.3 0:00.15 oracle
6489 oracle 16 0 741m 55m 48m S 0.0 0.5 0:00.29 oracle
6491 oracle 16 0 739m 24m 20m S 0.0 0.2 0:00.01 oracle
6493 oracle 16 0 739m 15m 11m S 0.0 0.1 0:00.01 oracle
6495 oracle 16 0 739m 14m 11m S 0.0 0.1 0:00.00 oracle
load average: 1, 5, 15分钟中内系统负载。表示有多少个进程等待进入CPU运行队列
从top中可以看到排名靠前消耗CPU的进程。可以用ps aux来查看每个进程的累计运行时间和进程程序。
查看CPU个数的语句
IBM AIX和HP
lsdev -C | grep Process | wc -l
Solaris
psrinfo -v | grep "Status of processor" | wc -l
Linux
cat /proc/cpuinfo | grep processor | wc -l

Oracle Database数据收集
统计信息CPU used by this session表示所有的会话使用CPU的总和。
统计信息parse time cpu表示解析使用CPU的总和。
统计信息recursive cpu usage表示oracle用于递归调用的语句消耗的CPU。用于解析数据词典的查询(包括hard parse,soft parse),
plsql的运行都会计算到这部分CPU时间中,过度地logon和logout。可以考虑减少hard pase(使用绑定变量),soft parse(设置
session_cache_cursors),plsql(row_cache_cursors)。logon/logout(检查logons cumulative)
查看整个数据库使用了多少CPU时间。
select *
  from v$sysstat
  where name in ('CPU used by this session'
                 ,'parse time cpu'
                 ,'recursive cpu usage'
                );
可以取一段时间内的统计信息的值来确定数据库消耗了多少cpu。
我们也可以从statspack/AWR报告中获取这些信息:
Statistic                    Total      per Second    per Trans
----------------------------------------------------------------
CPU used by this session     979,246        270.01         2.83
parse time cpu                48,908         13.49         0.14
recursive cpu usage           23,520          6.49         0.07
Response Time = Service Time + Wait Time
Service Time = parse time cpu + recursive cpu usage + other CPU
parse time cpu: 请检查soft parse,hard parse。
recursive cpu usage:表示oracle用于递归调用的语句消耗的CPU。用于解析数据词典的查询(包括hard parse,soft parse),plsql
的运行都会计算到这部分CPU时间中,过度地logon和logout。可以考虑减少hard pase(使用绑定变量),soft parse(设置
session_cache_cursors),plsql(row_cache_cursors)。logon/logout(检查logons cumulative)
other CPU:请检查SQL Ordered By Gets部分。找出那些buffer gets最多的queries。
如果找出某个sql,可以使用@?/rdbms/admin/sprepsql.sql来分析具体信息。
查看某个进程使用了多少CPU时间。
select st.value
from v$session ss, v$sesstat st, v$statname sn, v$process p
where ss.sid = st.sid
and s.paddr = p.addr
and st.statistics# = sn.statistics#
and sn.NAME = 'CPU used by this session'
and p.spid = &ospid
order by st.value desc;
查看某个sql使用了多少CPU时间
select st.value, sql.executions, sql.cpu_time
from v$session ss, v$sesstat st, v$statname sn, v$process p, v$sql sql
where ss.sid = st.sid
and s.paddr = p.addr
and st.statistics# = sn.statistics#
and sn.NAME = 'CPU used by this session'
and p.spid = &ospid
and ss.sql_hash_value = sql.value
order by st.value desc;

路过

鸡蛋

鲜花

握手

雷人

发表评论 评论 (2 个评论)

回复 fishcat 2013-1-25 22:55
good
回复 wzz217 2013-9-14 09:56
打基础

facelist

您需要登录后才可以评论 登录 | 加入社区

意见
反馈