• 1. 性能测试技术培训刘东明 2015.10
  • 2. 主要内容性能测试概述 性能测试基本概念 性能测试流程 性能测试工具 常用性能指标及分析 未来建设模式1
  • 3. 性能测试概述 –为什么要做?亚马逊CEO贝索斯:网页慢0.1秒=客户活跃度下降1% 2
  • 4. 性能测试概述—与功能测试的区别功能测试: 系统是否正确响应,没有时间的概念 性能测试: 系统是否及时的正确响应,增加时间维度的考量 3
  • 5. 性能测试概述—性能测试的目的评估系统的能力 系统调优 检查软件中的问题 验证稳定性和可靠性 容量规划4
  • 6. 性能测试概述—性能测试类型 性能测试(Performance Test) 性能测试主要包括负载测试、压力测试、容量测试、稳定性测试。 负载测试(Load Test) 负载测试是一种性能测试,预先制定性能指标,不断加压,直到达到性能指标情况。 压力测试(Stress Test) 这个是负载测试的升级版,无非是要不断加压,将系统压死为止。  容量测试(Volume Test) 主要是针对数据库而言,是在数据库中有较大数量的情况下对系统进行的测试。 稳定性测试(Stability test) 在选定的压力值下,长时间持续运行。通过这类压力测试,可以考察各项性能指标是否在指定范围内,有无内存泄漏、有无功能性故障等。 5
  • 7. 性能测试基本概念Concurrency并发 狭义的并发,即所有的用户在同一时刻做同一件事情或操作;广义的并发,即多个用户对系统发出了请求或者进行了操作,但是这些请求或操作可以是不同的,对整个系统而言,仍然有很多用户在同时进行操作。 Vuser虚拟用户 Virtual user,模拟真实业务逻辑步骤的虚拟用户,虚拟用户模拟的操作步骤都被记录在虚拟用户脚本里。 Transaction事务 事务是性能测试脚本的一个重要特性。事务用来衡量脚本中事务开始和事务结束之间所包含的一行代码或多行代码的执行所耗费的时间。 6
  • 8. 性能测试基本概念Scenario场景 场景(Scenario)是一种用来模拟大量用户操作的技术手段,通过配置和执行场景向服务器产生负载,验证系统的各项性能指标是否达到用户要求。 Think Time思考时间 思考时间是模拟正式用户在实际操作时的停顿间隔时间。 关联 获取服务器返回的动态值,用作后续请求数据发送给服务器。 参数化 设置测试数据的取值方式。 7
  • 9. 性能测试基本概念平均事务响应时间 每一秒内事务执行所用的平均时间,通过它可以分析测试场景运行期间应用系统的性能走向。 TPS(Transation Per Second)“每秒通过事务数 分析TPS主要是看曲线的性能走向。例:当压力加大时,点击率/TPS曲线如果变化缓慢或有平坦的趋势,很有可能是服务器开始出现瓶颈。 HPS(Hit Per Second)点击数 “每秒点击次数”,即使运行场景过程中虚拟用户每秒向Web服务器提交的HTTP请求数。通过它可以评估虚拟用户产生的负载量。 8
  • 10. 通用性能测试流程9测试确认:理解需求,寻找测试点、确认测试范围、测试环境等 确定通过标准 测试设计*:测试场景,测试用例*,测试数据需求 测试环境准备及确认 数据铺垫(大数据量) 测试脚本及监控工具准备 测试执行,监控 问题定位,调优,复测 性能测试报告* 注:性能测试的重点在于测试环境的建立、前期数据的设计与后期数据的分析,而不是测试工具(*:见附件)
  • 11. 性能测试工具-LoadRunner LR的组成 测试过程演示: Vuser录制,调试脚本 Controller加压 Analysis测试结果分析 10
  • 12. Virtual User Generator11
  • 13. Controller12
  • 14. Analysis13
  • 15. 性能测试工具-JmeterApache JMeter是Apache组织开发的基于Java的开源压力测试工具。它可以用于测试静态和动态资源例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库, FTP 服务器, 等等。JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能。14
  • 16. Jmeter基本使用1.使用badboy录制脚本 步骤: 在Badboy工具地址栏中输入测试网址,然后按回车键。 Badboy工具会使用内置的浏览器打开页面,在页面中完成所需的各项操作 将测试脚本导出成JMX格式,以便后续供JMeter使用 2.使用jmeter调试脚本 步骤: 使用JMeter打开通过Badboy导出生成的测试脚本 为测试脚本添加监听器,查看结果树和聚合报告 其他:参数化,后置处理器等 15
  • 17. Jmeter基本使用3.执行压力测试 16
  • 18. 测试结果分析根据性能测试工具提供的测试结果,对性能进行初步分析: 响应时间是否满足要求 TPS和HPS变化趋势是否一致 在压力一定的情况下,性能曲线是否平稳 如果存在性能拐点,获存在得拐点附近的资源使用情况,定位出系统的性能瓶颈; 不同压力下测试结果的对比。 17
  • 19. 服务器性能指标及分析主要关注的对象包括: CPU 内存 磁盘IO 网络18
  • 20. 服务器资源常用监控工具Top Iostat Vmstat Free Nmon nmon用法示例:  /app/nmon/nmon_linux_x86_64 -f -s10 -c300 -m /app/nmons  命令的含义是,-f输出文件,-s(space,间隔)收集数据的时间间隔,-c收集次数,-m输出文件位置 19
  • 21. 数据库性能指标及分析主要监控的内容: 服务器资源使用情况:CPU,内存,IO等 最占用资源的SQL 软解析率 数据库连接数 20
  • 22. JVM介绍JVM内存包括堆内存和非堆内存2部分 堆内存: 堆是运行时数据区域,所有类实例和数组的内存均从此处分配,是Java代码可用的内存,是留给开发人员使用的;堆是在 Java 虚拟机启动时创建的。 非堆内存: 在JVM中堆之外的内存称为非堆内存(Non-heap memory),非堆就是JVM留给自己用的。 21
  • 23. JVM 主要参数-Xms:设置jvm内存的初始大小 -Xmx:设置jvm内存的最大值 -Xmn:设置新域的大小 -Xss:设置每个线程的堆栈大小 -XX:NewRatio :设置新域与旧域之比 -XX:NewSize:设置新域的初始值 -XX:MaxNewSize :设置新域的最大值 -XX:PermSize:设置永久域的初始值 -XX:MaxPermSize:设置永久域的最大值 -XX:SurvivorRatio=n:设置新域中Eden区与两个Survivor区的比值。22
  • 24. JVM GC 主要参数-XX:+UseParNewGC  对年轻代采用多线程并行回收,这样收得快。 -XX:+CMSParallelRemarkEnabled  在使用 UseParNewGC 的情况下 , 尽量减少 mark 的时间 -XX:ParallelGCThreads 可用来增加并行度,建议设置为cpu的核数 -XX:+UseConcMarkSweepGC  即CMS gc,指 定在 Old Generation 使用 concurrent cmark sweep gc,gc thread 和 app thread 并行 ,app pause 时间较短 , 适合交互性强的系统 , 如 web server  -XX:CMSInitiatingOccupancyFraction=70  年老代到70%满的时候开始执行对年老代的并发垃圾回收(CMS) -XX:+DisableExplicitGC 在 程序代码中不允许有显示的调用”System.gc()” 23
  • 25. 内存泄露类型年老代堆空间被占满:java.lang.OutOfMemoryError: Java heap space 持久代被占满:java.lang.OutOfMemoryError: PermGen space 堆栈溢出:java.lang.StackOverflowError--一般就是递归没返回,或者循环调用造成 线程堆栈满:Fatal: Stack size too small--增加线程栈大小,但这个配置无法解决根本问题,还要看代码部分是否有造成泄漏的部分。 系统内存被占满:java.lang.OutOfMemoryError: unable to create new native thread—综合考虑,减少线程数量,或-Xss减小单个线程大小,或者增加内存 24
  • 26. JVM设置示例JAVA_OPTS="-server -Xms2048m -Xmx2048m -Xmn256m  -XX:PermSize=512m  -XX:MaxPermSize=512m -XX:+UseParNewGC   -XX:+CMSParallelRemarkEnabled  -XX:+UseConcMarkSweepGC -XX:ParallelGCThreads=12 -XX:CMSInitiatingOccupancyFraction=70  -XX:+DisableExplicitGC"25
  • 27. 未来建设模式整合至专有平台中,建立性能测试平台 增加页面展示和可配置项 支持测试结果保存和测试结果比对 降低性能测试执行门槛,使测试更为便捷 26