如何进行性能测试与分析.doc_第1页
如何进行性能测试与分析.doc_第2页
如何进行性能测试与分析.doc_第3页
如何进行性能测试与分析.doc_第4页
如何进行性能测试与分析.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第 1 页 共 13 页 如何进行性能测试与分析如何进行性能测试与分析 目录目录 第 2 页 共 13 页 1 试调优背景试调优背景 3 2 测试十点多程回顾测试十点多程回顾 3 3 SQL ACE 4 4 应用级调都是优分析应用级调都是优分析 5 5 DB 调优但是分析调优但是分析 9 6 性能山地车的其他方面性能山地车的其他方面 12 Q 154621844 龙哥 电话是个骗子 大家小心 第 3 页 共 13 页 1 1 性能测试调优背景性能测试调优背景 阿迪松岛枫企业 java 应用的越来越复杂的情况下 性能调优的难度也越来越大 但万 变不离其宗 不管是复杂的架构还是通常所讲的三层架构 我们可以遵循一个原则 由外而内 由表及里 一般我们分析问题都可以发第三帝国从网络 服务器层面来分 析 服务器层面又可以细发大是大非分为操作系统 磁盘 数据库 中间件等 本次 培训不能面面俱到 很多地方都可以单独做一个专题来讲 我就以之前做的性能测试 的过程中的一些经验来说 希望给大家起一个抛砖引玉的作用 通过这次培训 能够 让大家能够对性能调优有一个清晰的思路 也就达到目的了 如无特殊说明 以下提 到的数据库类型为 oracle qq 154621844 龙哥 电话是个骗子 大家小心 第 4 页 共 13 页 2 2 测试过程回顾测试过程回顾 以 XXX 性能测试为例 软件部署架构如下 以 XXX 为测试场景 我们我打 拿到了这个部署图以后 就可以分析 哪些是可能 对交易场景产生影响的地方 我们上出租车排除性能问题也是从这些地方着手 这里 并没有一个特别规范的排查顺序 一般会凭借经验或者是从客户端开始逐步排查到最 后的组件 前期准备工作完成以后 在执行压力阿迪三分测试场景前 我们一般会进行单用 户多次交易的基准测试 目的是验证单用户的访问效率 这里通过 XXX 框架可以捕获 到所有业务操作的 sql 以一条 sql 语句为例 这里省略了 sql 语句 说明执行该条 sql 花费时间 113ms 注注 如果不是用 XXX 框架的 我们还可以通过 v sql 视图来查询执行 sql 的时间 我们用管理员用户登录 找到奥德赛这条执行的 sql 语句 找到字段 ELAPSED TIME 以及字段 CPU TIME ELAPSED TIME 爱党 1000 1000 就是 sql 执行的时间 CPU TIME 1000 1000 就是消耗 CPU 的时间 需要注意的是 如果执行了多次 需要 把最后一次的数值减去前一次的数值才能得到最后一次执行该 sql 的时间 如果单用户多次交易的时候 某条爱党 sql 语句的时间比较长 并且被测系统是属于 一种 OLTP 在线事务处理系统 系统 那么该条 sql 语句可以初步判断存在性能问题 因为这种系统并发数都比较多 侧重于要求数据库的快速响应 sql 执行效率缓慢必然 影响响应时间 最终导致用户体验的变化 初步确认了 sql 以后 我们需要对该条 sql 语句进行分析 Q 154621844 龙哥 电话是个骗子 大家小心 第 5 页 共 13 页 这里主要介绍 SQL TRACE 的用法 3 3 SQL TRACESQL TRACE 每次遇到 sql 性能非常差的时候大城小爱 都恨不得进数据库看看究竟是什么原因 好在 oracle 提供了 SQL TRACE 来跟踪 sql 的执行情况 注注 分析 sql 的方式比较多 还有根据优化器 sql 执行计划来分析 SQL TRACE 能够将 sql 传销自残执行的过程输出到一个 trace 文件里面 首先设置自己定义的 trace 文件的标识方便查找 alter session set tracefile identifier mytest 然后对当前会话启动 SQL TRACE 最好不要一直打开该开关 代价比较大 alter session set sql trace true 然后我们执行一条 sql 语句 最后关闭该开关的状态 alter session set sql trace false 我们可以从目录 ORACLE BASE diag rdbms orcl orcl trace 11g 版本的路径 如 果是 10g 的应该不一样 中找到自己定义的 trace 文件 原始的 trace 文件的可读性不高 我们一般使用 oracle 自带的工具 tkprof 来处 理这个 trace 文件 我们可以查看 tkprof 的帮助 tkprof orcl ora 3820 mytest trc out txt 我们来看刚才生成的 trace 文件 头部信息描述了 tkprof 的版本以及报告中一些 列的含义 对于任何一条 s 但是 ql 语句 都应该包含 Parse sql 分析阶段 Execute sql 执行阶段 Fetch 数据提取阶段 横向的列如图所示 包含消耗 cpu 时 间 0 00 秒 操作总耗时 0 04 秒 物理读取了 0 个数据块 没有发生 current 方式的读 取 一般在 update 会发生 一共提取记录 1 条 Misses in library cache during parse 0 表示这是一次软分析 关于硬分析和软 分析下面会接着谈到 Optimizer mode ALL ROWS 表示 oracle 的优化器模式为 ALL ROWS 这也就是前面 第 6 页 共 13 页 提到的另外的分析方式优化器 下面是 sql 执行的具体计划 可以看到执行计划选择的是全表扫描 经过处理以后的 trace 文件的确比较容易看明白 它有助于我们分析 sql 的性能问 题 下面我通过一个 trace 实例来解释一下 为什么 OLTP 系统中需要变量绑定机制 当用户和数据库建立连接 并发送一条奥德赛 sql 语句以后 oracle 会对该 sql 进 行 hash 函数运算 hash 算法提供了一种快速存取数据的方法 它用一种算法建立键值与 真实值之间的对应关系 每一个真实值只能有一个键值 但是一个键值可以对应多个真 实值 以方便存取 得到一个 hash 值 然后奥德赛到共享池中寻找是否有匹配的 hash 值的 sql 存在 如果有 就直接使用该 sq 阿迪深 vl 的执行计划去执行 sql 如果没有 oracle 就会认为这是一条新的 sql 语句 然后按照语法分析 语义分析 生成执行计划 执行 sql 这些步骤来执行最终把结果返回给用户 这些步骤也被成为硬分析 可以想象 如果减少硬分析 能够大大降低数据库花费在 sql 解析上的资源开销 我们先执行一条 sql 1000 次 比较绑定变量和不绑定变量的差异 得到结果以后 要计算实际的消耗 我们需要把 OVERALL TOTALS FOR ALL NON RECURSIVE STATEMENTS 以及 OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS 的时间累计起来 前者表示数据 字典表的相关的信息 包含权限控制等 后者表示 sql 所衍生出的递归 sql 语句的信息 可以看到绑定变量的 整条语句执行时间为 0 22 0 02 0 24 秒 CPU 时间 0 18 0 03 0 21 秒 分析次数 3 次 执行次数 1003 次 而不绑定变量的时候 整条语 句执行时间为 0 28 1 29 1 57 秒 CPU 时间 0 31 1 26 1 57 秒 分析次数 1002 次 执 行次数 1003 次 可见绑定变量的确能够带来更低的开销 如何设计数据库中使用绑定 变量也是和系统息息相关的 很多数据库问题都是在设计以后就已经存在的 4 4 应用级调优分析应用级调优分析 就通常所说的三层架构来说 中间件这一层能够起到一个缓冲池的作用 如果并发 用户数到 3000 这个数量级的时候 中间件能够控制不是所有的用户都能直接连接到数 据库 当然这里的程序会快速响应用户请求爱党 保证缓冲池的队列等待不会很久 对应用这一级别的调优 主要集中在 app 程序 中间件的监控 集群配置等方面 第 7 页 共 13 页 如果是发现应用级别的问题 首先要分析是配置问题 还是程序本身的问题 如果并发 用户数很大 中间件的线程池最大值配置过小 会导致在请求队列堆积 表现就是线程 监控视图中 请求的队列堆积比较多 一般奥德赛可以调整线程池线程池最大值来解决 我们 来看看 weblogic 的监控视图 考虑到如果为每一个请求都创建一个新线程来处理的话 那么我们难以在系统中实 现足够数量的线程 不受限制的创建线程可能耗尽系统资源 因此引入了线程池 线程 池的思想是在进程开始时创建一定数量的线程并将它们置入一个池 pool 中 线程在 这个池中等待工作 当服务器接收到一个请求时 它就从池中唤醒一个线程 如果有可 用的线程 由它来处理请求 一旦线程服务完毕 它就返回线程池等待后面的工作 线程池利用已存在的线程服务请求要比等待创建一个线程要快 并且线程池限制了 线程的数量 如果怀疑是程序的问题 我们一般可以通过 java 自带的工具来帮助分析 工具很 多 这里我主要提到一个 jdk1 6 以后附带的 jvisualvm 我们打开 jdk1 6 找到并运行 jvisualvm exe 我们发现应用程序分为本地 远程两部分 本地包含本地运行的 java 进程 远程 能够通过配置连接到远程服务器上的 java 进程 我们先启动一个 tomcat 可以看到本 地应用程序已经打开了一个带有 tomcat 以及进程标识 id 的菜单 双击打开 这里我们 一般关心 2 个视图 监视 线程 阿迪的味道 其中监视视图比较关心垃圾回收活动垃圾回收活动 顾名思义 回收那些在程序里面不再使用到 的内存空间 堆内存变化 如果在压力测试过程中 堆内存变化是一个逐渐上涨的趋 势 并且经过多次手动 gc 回收 还是保持这个趋势 说明内存泄漏的可能性很大 如 果猜测有内存泄漏 可以通过分析 java 的 heap dump JVM java 虚拟机 记录下问题 发生时系统的运行状态并将其存储在转储 dump 文件中 Heap dump 就是这样一种文件 形式 线程视图比较关心线程的当前执行状态 这里可以生成另一种转储文件 Java dump Java dump 也叫做 Thread dump 是 JVM 故障诊断中最重要的转储文件之一 JVM 的许多问题都可以使用这个文件进行诊断 其中比较典型的包括线程阻塞 CPU 使 用率过高 JVM Crash 堆内存不足 和类装载等问题 其中线程阻塞更加常见 线程阻塞线程阻塞是我们在 java 多线程编程中经常遇到的问题 由于对后端有限资源的争 第 8 页 共 13 页 用以及过度同步等问题 经常会发现 Java dump 中某个资源 锁对象 下有太多的线 程处于等待状态 这时候我们通常需要从以下三个方面去诊断这个问题 这个锁存在的目的是什么 有没有可能去掉这个锁或者缩小这个锁保护的范围 从 而减少线程等待问题发生的几率 有哪些线程需要用到这个锁 有没有可能改用其它更好的替代方案 当前哪个线程正在持有这个锁 持有的时间是多长 有没有可能缩短持有的时间 下面通过实际测试中的 dump 文件来谈谈如何读懂一个 dump 文件 可以看到一共有 4 种线程的状态 WAITING RUNNABLE TIMED WAITING sleeping BLOCKED 线程阻塞就是 BLOCKED 搜索文件中 BLOCKED 的部分 我们可以看到其中一个 ACTIVE ExecuteThread 91 for queue weblogic kernel Default self tuning daemon prio 10 tid 0 x00002aaae8181000 nid 0 x4849 waiting for monitor entry 0 x0000000047d4d000 java lang Thread State BLOCKED on object monitor 线程名称 线程类型 daemon 优先级 10 默认是 5 jvm 线程 id jvm 内部线程的唯一标识 0 x00002aaae8181000 对应系统线程 id 和 top 命令查看的 pid 对应 不过一个是 10 进制 一个是 16 进制 0 x4849 线程状态 BLOCKED 起始栈地址 可以看到很多线程状态都是 BLOCKED 表示当前线程 A 正要进入一个同步块 但是 被另外一个线程 B 持有该锁 于是需要等待 B 释放锁才有机会重新获取 用一种轻松的方式来思考锁 其实挺简单的 数据库中也存在这样的锁 为什么会 有锁 打个比喻 一个 java 对象就像一个大房子 大门永远打开 房子里有很多房间 方法 这些房间有上锁的和不上锁之分 房门口只放着一把钥匙 这把钥匙可以打开 所有上锁的房间 把所有想调用该对象方法的线程比喻成想进入这房子某个房间的人 试想如果只有一个人 肯定是不存在等待别人使用完钥匙归还的时候 如果要是很多人 第 9 页 共 13 页 势必会需要等这把钥匙归还 等钥匙还回来以后 就会有一个人优先优先得到钥匙 由此可以看到 锁是不可避免的 要想正确获取对象的状态 或者修改对象的状态 必须存在这样一种 lock 也就意味着 锁的持有时间越久 对性能的影响也就越大 直 接结果是大并发情况下 响应时间的延长 回到以前的 thread dump 如果通过工具我 们发现 线程阻塞比较频繁 并且持续时间很久 不妨多次收集这种转储文件 可以有 效的帮助我们分析问题 我们刚才看到的转储文件就是 XXX 测试中捕获到的 通过这些地方 我们发现了一 些性能方面的问题 除了线程阻塞 阿是顶顶顶顶我们分析 dump 文件还可以找到消耗 CPU 最多的地方 如果不是 windows 操作系统 可以通过 top top H 或者 topas 命令 来查看应用程序的线程信息及占用 CPU 的情况 找到排序第一位的 pid 值 按照我们前 面解释的 换算成 16 进制 然后在 thread dump 日志中搜索该数值nid就能找到耗费 CPU 的源代码的具体位置 可以精确到行号 另外还可以分析是否有很多 thread struck 在了 I O 例如 New I O server worker 1 1 prio 10 tid 0 x00000000423e0800 nid 0 x5bfd runnable 0 x00007f7d0a2f4000 java lang Thread State RUNNABLE at sun nio ch EPollArrayWrapper epollWait Native Method at sun nio ch EPollArrayWrapper poll EPollArrayWrapper java 215 或者是 thread struck 在数据库 例如 ACTIVE ExecuteThread 99 for queue weblogic kernel Default self tuning daemon prio 10 tid 0 x00002aaae8190800 nid 0 x4857 runnable 0 x0000000048554000 java lang Thread State RUNNABLE at SocketInputStream socketRead0 Native Method at SocketInputStream read SocketInputStream java 129 at ns Packet receive Packet java 293 at ns DataPacket receive DataPacket java 92 等地方 便于我们定位瓶颈原因 第 10 页 共 13 页 5 5 DBDB 调优分析调优分析 和前面提到的 SQL TRACE 不同 当我们遇到了数据库性能整体下降的时候 又没有 特定的对象可以分析时 做一个 Statspack 报告是合适的 通过全面的检查 我们可以 分析出系统瓶颈在哪儿 如果瓶颈出在 sql 上面 我们就能获取相应的 sql 通过 SQL TRACE 来分析 啊第三场 oracle Statspack 从 Oracle8 1 6 被引入 马上成为 DBA 和 Oracle 专家用来诊断 数据库性能的强有力工具 通过 Statspack 我们可以很容易的确定 Oracle 数据库的瓶 颈所在 记录数据库性能状态 也可以使远程技术人员迅速了解的的数据库运行状况 所以 了解和使用 Statspack 对于 DBA 来说至关重要 它的原理是 1 运行 oracle 自带脚本 生成一系列的统计表 2 生成快照 采样 运行 statspack snap 可生成快照 一般通过自动任务生成快 照 3 根据快照生成报告 除了 statspack oracle10g 以后都提供一个 AWR 报告 它是 oracle 自动采集的 采集周期为 1 小时 不需要人工干预 收集的信息和 statspack 非常像 很多时候选择 哪种方式都可以 AWR 可以通过 10g 以后的 oracle DBconsole 去生成 如何安装 statspack 这里简单的介绍一下 有兴趣的同事可以通过查阅资料更深 入的了解和实践 首先检查 oracle 系统参数 job queue process 为了能够建立自动任务 执行数 据收集 此参数必须大于 0 timed statistics 设置为 true 使收集的时间信息存储 在 V sessstats 和 V sysstats 等动态性能视图中 如果是 9i 以后版本可以以 oradba 的身份登录 sqlplus as sysdba 首先创建 表空间 create tablespace perfstat datafile D oradata orcl perstat ora size 100m extent management local 空间视实际 情况而定 如果只是学习使用 不需要那么大 实际生产环境下 可以设置大一些 毕 第 11 页 共 13 页 竟 Statspack 的报表数据还是相当占空间的 然后运行脚本 oracle home rdbms admin spcreate sql 安装 statspack 根据提示输入密码 表空 间 临时表空间 安装完成 查看 lis 后缀的日志文件确认是否有错误 select dt table name from dba tables dt where dt owner PERFSTAT 可以查 看采样数据存储的表格 下一步我们测试 statspack 刚才如果 create 的时但是 候 默认修改了当前的连 接用户为 perfstat 运行 statspack snap 可以产生系统快照 运行两次 产生两次快 照 execute statspack snap 然后执行脚本 oracle home rdbms admin spreport sql 就 可以生成基于两个时间点的报告 如果一切正常 可以在运行批处理的目录下查看生成 的报告文件 生成了 statspack 报告 我们就可以开始分析了 需要提醒的是 真正看懂这样一 份报告 并不需要知道所有指标的含义 最好能够了解 oracle 内部的运行机制 理解 的越深 判断数据库性能也就越准确 这里只能谈谈我的一些理解和思路 供大家思考 我们来看一份报告例子 对于我们现在已有的系统来说 绝大多数都是属于 OLTP 系统 在线事务处理系统 sql 执行非常密集 我们不妨关注以下 2 个指标 Library Hit Buffer Hit 前面一个体 现了共享池命中率 如果很多 SQL 不能重用 需要重复解析的话 会大大降低系统的性 能 后面一个体现了 sql 需要的数据块是否能够保留在内存中 这样执行效率要比从磁 盘读取数据要高很多 我们来看报告第一部分 主要是数据库和实例的信息 然后是采集周期里面系统的 信息 这里有一个数值 DB time 表示用户操作花费时间 判断一下 在收集周期里 面 用户时间占用的比率 然后结合 top5 来分析 Load Profile 描述了数据库资源负 载的明细列表 可以通过字面含义来理解它们 这里我们可以关注下 物理读写 逻辑 读写 硬分析次数等指标 Redo size 是日志的生成量 分为每秒和每事务所产生的 通常在很繁忙的系统中日志生成量可能达到上百 k 甚至几百 k 逻辑读一般发生在内存 中 和物理读是区别对待的 硬分析次数前面已经提到了 Instance Efficiency Indicators 表示内存效率的统计信息 对于 OLTP 来说 尽 第 12 页 共 13 页 可能都接近 100 原因前面已经说过了 如果哪项数值过低 就要做相应的分析研究 Top 5 Timed Events 一般是我每次重点关注的地方 也是我认为最主要的地方 如 果这一部分显示前五位的等待事件 并没有占用很长时间 说明系统状态看起来很好 那么我们可能需要多采集一些时间段的数据来分析了 那么结合我们的 top 5 的等待事件 我们可以来衡量不同等级的 top sql 1 消耗最多 CPU 的 逻辑 IO 比较多的 2 导致过多物理 I O 的 物理 IO 比较多 的 3 执行次数较频繁的 Execution 次数比较多的 4 执行时间较长的 Elapse time 比 较长的 先看看我的机器上采集的结果 control file sequential read control file single write 控制文件连续读 控制文件单个写对单个控制文件 I O 存在问题时 这两个事件会出现 如果等待比较明显 检查单个控制文件 看存放 位置是否存在 I O 瓶颈 control file parallel write 当 server 进程更新所有阿城市控制文件时 这个 事件可能出现 如果等待很短 可以不用考虑 如果等待时间较长 检查存放控制文件 的物理磁盘 I O 是否存在瓶颈 以 XXX 测试为例 我当时采集的是 AWR 报告中的一部分 和 statspack 基本一致 可以看到排名第一位的是顶级 SQL 语句 不得不说 oracle 的分析报告非常智能 非常 明细 能够帮助我们迅速找到问题 配合 DBA 来调优 前面这些内容是报告中最重要的部分 虽然不同的系统生成的报告都会不一样 但 是解决问题的思路是一样的 根据前面的一手信息 我们能够了解到等待时间很长的事 件 再去其他的部分查找原因 下面简单说说后面报告的含义 Statistic 表示各种操作占用数据库的时间比例 接下来是等待事件的明细 主要用来配合前面的 top5 事件来分析 等待事件 Wait Events 是 Oracle 中比较复杂难懂的概念 Oracle 的等待事件是衡量 Oracle 运行状 况的重要依据及指标 等待事件很多这里不一一赘述 常见的等待事件 一般都有对应 的分析手段 大家可以参考 oracle 的资料学习 这里我们根据 XXX 测试中的实例来分 析 可以看到排名第二位的事件是等待 日志文件同步 事件消耗了大量数据库时间 英文翻译就是 log file sync 日志文件同步

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论