(原创)性能测试中,Oracle服务器定位CPU使用率高的瓶颈(SQL)

本篇博客记录一次性能测试过程中,定位对CPU使用率高的瓶颈问题,主要定位SQL为准

一、用SQL命令定位
1.首先用TOP命令监控系统资源,如果是AIX系统,就用topas,进入TOP命令的滚动刷新数据时,发现userCPU高达98%!!

保持top的状态下,按shift+p,可以将所有进程按CPU使用率高低排序,这样可以了解消耗CPU最多的进程是哪些

可以看到,当前userCPU使用率高达98%,且此时TPS不再随并发数上升了,可以认为已经达到性能瓶颈了,且是由CPU瓶颈造成的

2.排序完后,将上图排在第一位的CPU使用率最高的PID记录下来(此处是172928),

①然后进入dba权限的用户,su oracle  (也可以用pl_sql进入)

②然后进去sql命令行和dba权限

sqlplus / as sysdba

③现在v$process 视图中找到pid对应的地址addr,将进程号pid和oracle的session联系起来

SQL:select addr from v$process where spid=172928;

简介:v$process视图包含当前系统oracle运行的所有进程信息。常被用于将oracle或服务进程的操作系统进程ID与数据库session之间建立联系。也就是可以通过进程PID来寻找数据库的session)

④再通过刚才的addr,在v$session表找到对应的sql_id

SQL:select sql_id from v$session where paddr=‘00000003CEA444C8‘;

⑤再通过sql_id可以找到对应的SQL是哪条

SQL:select * from v$sql where sql_id = ‘00000003CEA444C8‘;

实际上,上面是三个SQL可以联表,

SQL如下:

select t3.SQL_TEXT

from v$process t1

inner join v$session t2

on t1.ADDR = t2.PADDR

inner join v$sql t3

on t2.SQL_ID = t3.SQL_ID

where t1.SPID = 172928(这个pid就是进程id);

用命令行得到的结果如下:

用PL_sql得到如下结果:

到这里既已经定位出占用CPU高的SQL之一的,在可以结合业务场景和SQL的效率,以及和开发人员/DBA等沟通是否优化或如何优化

(顺便此处提示,数据库中不同的数据量会对性能差距影响很大,本次测试中,10W的数据量和20W的数据量,TPS相差达到一倍!!)

二、用AWR报告定位CPU高的SQL

AWR报告如何导出,可以见本人此篇博客内容

http://www.cnblogs.com/life-for-test/p/6825127.html

导出AWR报告之后,

①在main report的SQL statistics中,点击开,结果如下:

②进入SQL的统计中,看到下面这个结果

③点击SQL ordered by CPU Time

在total这行可以看到累计消耗CPU最高的SQL,

④点击SQL的id,即可看到完整的SQL结果,如下述:

5.点开以后,可以看到的SQL如下所示,这个两个就是占用CPU高的SQL原因,再结合着业务场景以及沟通,看看是否优化吧~~~~

时间: 2024-10-13 01:36:33

(原创)性能测试中,Oracle服务器定位CPU使用率高的瓶颈(SQL)的相关文章

oracle造成系统CPU过高的检查sql

1. 根据占用CPU高的进程号来查询这个进程执行的SQL语句: CPU过高的进程号: #首先找到CPU过高的进程号 # top -bn1 是静态找到占用最高的进程 [[email protected] ~]# top -bn1 | awk '{print $1}' | grep -A2 PID SQL语句: SELECT sql_text FROM V$sqltext a WHERE (a.hash_value, a.address) IN (SELECT DECODE(sql_hash_val

性能测试 | 服务器CPU使用率高分析实例

前面我们讨论系统调用的时候结论是耗时200ns-15us不等.不过我今天说的我的这个遭遇可能会让你进一步认识系统调用的真正开销.在本节里你会看到一个耗时2.5ms的connect系统调用,注意是毫秒,相当于2500us! 问题描述 当时是我的一个线上云控接口,是nginx+lua写的.正常情况下,单虚机8核8G可以抗每秒2000左右的QPS,负载还比较健康.但是该服务近期开始出现一些500状态的请求了,监控时不时会出现报警.通过sar -u查看峰值时cpu余量只剩下了20-30%. 图3.jpg

后台服务器CPU使用率高 问题分析方法

一.找出cpu使用率高的进程和线程: a.将 cpu 占用率高的线程找出来: ps H -eo user,pid,ppid,tid,time,%cpu,cmd--sort=%cpu b.对于多线程的服务,通过top命令得到cpu使用率高的进程后,可以使用如下命令查看该进程下各线程cpu使用率 ps -eLo pid,lwp,pcpu | grep PID c.直接使用 ps Hh -eopid,tid,pcpu | sort -nk3 |tail 获取对于的进程号和线程号 二.gdb调试cpu使

一个查询交易导致数据库CPU使用率高的问题

这一阵子在做一个查询交易的压力测试,使用的AIX+informix数据库.应用和数据库分别部署在两台机器上.使用loadrunner进行并发测试.相关表的历史数据是20W级别的.使用20个并发进行测试. 测试过程中,应用服务器负载正常,数据库服务器磁盘.网络使用率正常,但是CPU使用率却是98%左右.觉得很奇怪,因为这台机器是测试环境中性能最好的,表现不应该如此.于是先猜测会不会是informix的参数配置不对,于是搜了些informix参数中影响CPU使用率的参数调了一遍,但是现象依旧.对里面

如何排查用户态CPU使用率高

查看CPU使用在 Linux 系统下,使用 top 命令查看 CPU 使用情况. %Cpu(s): 0.3 us, 0.1 sy, 0.0 ni, 99.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st us(user):表示 CPU 在用户态运行的时间百分比,通常用户态 CPU 高表示有应用程序比较繁忙.典型的用户态程序有:数据库.Web 服务器等.sy(sys):表示 CPU 在内核态运行的时间百分比(不包括中断),通常内核态 CPU 越低越好,否则表示系统存在某些瓶

.NET定位CPU使用率过高问题

摘要: 当一个.net应用在生产环境CPU突然居高不下,如何快速准确的定位问题所在,并且对实时业务影响最小化?如何不抓Dump也不用live debug就可以知道你的应用在做什么?如何确认你的应用是由于哪个线程的执行造成的CPU升高,该线程正在执行什么代码? 分析:CPU升高的原因有很多, 1.有时候应用的负载大了,CPU自然会受业务请求的增加和增高: 2.有时候因为GC回收使用了过高的CPU资源: 3.有时候是某个线程执行的代码在某种情况下陷入了死循环: 4.有时候是因为锁争用太激烈,某资源上

Java进程CPU使用率高排查

近期java应用,CPU使用率一直很高,经常达到100%,通过以下步骤完美解决,分享一下. 1.jps 获取Java进程的PID. 2.jstack pid >> java.txt 导出CPU占用高进程的线程栈. 3.top -H -p PID 查看对应进程的哪个线程占用CPU过高. 4.echo "obase=16; PID" | bc 将线程的PID转换为16进制. 5.在第二步导出的Java.txt中查找转换成为16进制的线程PID.找到对应的线程栈. 6.分析负载高

找出程序cpu使用率高的原因

确定是CPU过高 使用top观察是否存在CPU使用率过高现象 找出线程 对CPU使用率过高的进程的所有线程进行排序 ps H -e -o pid,tid,pcpu,cmd --sort=pcpu |grep xxx得到如下结果,其中线程2909使用了7.8%的CPU. 2907 2913 0.0 ./xxx 2907 2909 7.8 ./xxx也可以通过查看/proc中的信息来确定高CPU线程. 打印了4列,线程ID,线程名,用户时间和内核时间(排名未分先后) awk '{print $1,$

[原创]CACTI中自定义华为交换机CPU利用率 (图)

http://bbs.chinaunix.net/thread-2201413-1-1.html