`
somebody_hjh
  • 浏览: 181053 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

一次性能测试的总结

    博客分类:
  • Java
阅读更多
有机会做了一次性能测试工作,主要是预研性质的工作。开发人员有必要再提交给测试做性能测试之前,做一次比较粗糙的性能测试工作。
1)走通性能测试流程,从造数据到测试,可以走通,方可交由测试同学。毕竟开发(相对性能测试人员而非功能测试)对业务逻辑更了解一些。
2)测试一些显而易见的bug;
3)建立性能方面的信心;
4)可在测试的同学做完测试以后做一个对比,不至于偏离太过离谱。

参照测试部门的意见,我把这次的性能测试总结了如下几个步骤:
1、测试目标和范围:根据需要满足的非功能需求,确定上线功能点哪些需要测试。测试性能、稳定性、最大压力。
2、测试方案准备:包括施压方式,环境配置,环境依赖,资源监控,整理方案文档。
3、环境准备:准备压力测试环境,一般是压力测试机配置,压力测试数据库配置。
4、数据准备:根据线上预估数据,对数据库数据进行准备和模拟。
5、测试准备:包括需要编写的程序,如其他系统间依赖可写mock程序。另外编写jmeter的测试计划等。尝试测试,并确保一个请求或处理过程能顺利通过。
6、进行测试:通过客户端施压服务器,监控器各方面资源利用。
7、进行测试分析总结,写测试报告。TPS,吞吐量,CPU占比等。对异常现象记录,如内存溢出等。
8、根据测试报告对程序进行优化或重构。


做技术还是有做技术的天性,我们开发最关心的也就是5-8的步骤。我们的应用主要以hessian接口的形式向外面暴露,另外的就是任务在后台处理接口推送过来的数据。所以,我们的测试主要集中在接口测试和任务测试。比一般网页的性能测试更简单一些。

我们选用的施压客户端是开源的jmeter,文档较为丰富,且操作极为方便,扩展性好。服务器端性能监控工具,均采用linux的shell命令和jvm自带的工具或命令。jvm的工具已经够强大了,测试团队也是利用linux的命令采集服务器端资源,然后把消息发送到自己编写的一些资源监控工具上,其实都是利用了原生的shell命令和jvm命令来周期性采集并绘图的。

JMeter没有现成的sampler施压hessian的接口,所以我们需要利用它极具扩展性的java请求 sampler来施压hessian接口。我们查看jmeter安装目录下的lib>ext下可以发现其他多种类型的sampler。其他的种类都可以由java sampler来实现。我们只需要继承org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient该类,在runTest方法中调用hessian接口,并封装返回值即可。然后把工程打成jar包,放到jmeter安装目录下的lib>ext下。启动jemter,在利用java sampler就可以定为到我们编写的扩展测试程序了。

在压力测试过程中,包括两部分的资源检测,jvm的资源占用。一般利用jdk自带工具集
1、jps

    常用的几个参数:
    -l  输出java应用程序的main class的完整包
    -q  仅显示pid,不显示其它任何相关信息
    -m  输出传递给main方法的参数
    -v  输出传递给JVM的参数。在诊断JVM相关问题的时候,这个参数可以查看JVM相关参数的设置
2、jstat - Java Virtual Machine Statistics Monitoring Tool

    jstat [Options] vmid [interval] [count]
    Options -- 选项,我们一般使用 -gcutil 查看gc情况   还有其他选项如:
                  -class  -compiler -gc -gccapacity -gccause -gcnew -gcnewcapacity -gcold -gcoldcapacity -gcpermcapacity -gcutil -printcompilation
    vmid    -- VM的进程号,即当前运行的java进程号
    interval-- 间隔时间,单位为毫秒
    count   -- 打印次数,如果缺省则打印无数次
    -----------------------------------------------jstat -gcutil [pid] 输出解释

    S0  -- Heap上的 Survivor space 0 区已使用空间的百分比
    S1  -- Heap上的 Survivor space 1 区已使用空间的百分比
    E   -- Heap上的 Eden space 区已使用空间的百分比
    O   -- Heap上的 Old space 区已使用空间的百分比
    P   -- Perm space 区已使用空间的百分比
    YGC -- 从应用程序启动到采样时发生 Young GC 的次数
    YGCT-- 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
    FGC -- 从应用程序启动到采样时发生 Full GC 的次数
    FGCT-- 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
    GCT -- 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)
   


3、jhat - Java Heap Analysis Tool 用于内存快照文件的分析,当然还有很多类似工具
4、jstatd - Virtual Machine jstat Daemon
5、jinfo - Configuration Info
6、jvisualvm - Java Virtual Machine Monitoring, Troubleshooting, and Profiling Tool
7、jconsole - Java Monitoring and Management Console

8、jmap - Memory Map jvm内存分析工具,得到最普遍的使用。
        jmap -histo <pid> b.log  输出内存类占用,对比各时段的内存类,可方便知道回收情况和占用情况。
        jmap -dump:format=b,file=heap.dump <pid>  输出内存快照,可用许多开源工具分析内存快照。
        jprofile 太耗内存,如果静态分析能得出结论的可避免使用

9、jstack - Stack Trace 打印线程的堆栈跟踪信息

10、btrace -sun提供的检测工具,很好很强大,用于检测函数耗时等,微浸入。

而服务器端的资源监控多用Linux的shell命令如:top,free,vmstat,iostat,uptime等,详细用法不累述。



本次测试过程中遇到的几个误区和犯的错误:
1、jmeter关于线程组的线程数和ramp-up值的设置,如果设置ramp-up为1秒,线程数为10,我错误的理解为这就是一秒内的请求量。其实是jmeter一秒内启动了10个线程,这10个线程分别发送请求,知道服务器端返回后,再次发送。

这个错误的理解直接导致我们的一个异步接口(接口把数据保存在一个无上限queue中,另外起线程来消费)在压力测试过程中,被压垮,以为是内存泄露问题,其实只是我们的服务器没能力处理这样一个数据量。

2、在一个日志处理模块中的生产和消费者模型中,产生的线程过多。后经过配置修改了消费者和生产者的比例。但是在定位问题时,产生很多困难,因为不知道是什么线程出现这么多。程序中所有的线程必须命名才方便工具的观察,需要开发中规范和定义好。

3、对于任务类型的性能测试没有返回值,我们怎么观察任务处理一条记录的时间,或单位时间内处理记录的条数呢?开发人员习惯在源代码中去修改,并做trace,更好的方法是采用btrace工具来跟踪方法的进出。它在监控方法的耗时,查看某些方法的参数值,监控内存使用情况等一系列场合中使用。

4、开发错误的理解 org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor 类的corePoolSize和maxPoolSize和queueCapacity三者的关系。原以为corePoolSize是启动时变初始化的核心线程数,如果还有任务需要执行,那么就会新建线程到线程池中,直到达到最大maxPoolSize的大小。然后放不下的任务才浸入queueCapacity中存储。而实际情况确是:任务到达corePoolSize之后,就放入queueCapacity的queue中了。造成我们的配置错误,引起串行的任务执行。


的确在开发功能测试中没有发现的问题,通过性能测试暴露了出来。除了这些bug之外,我们还确认了我们接口的性能,任务的性能和稳定性。


  • 大小: 48.5 KB
分享到:
评论

相关推荐

    第一次性能测试后的经验总结

    1、性能测试流程方面 2、技术经验总结 个人的小小总结。

    多线程性能测试总结文档

    1、单线程加锁读写全局数据,每秒读多少次?建议使用读XXX万次,用多少时间来计算。 2、多线程加锁读写全局...3、每个线程每秒只读500次并且读后不要立即释放锁的情况下(执行一段for循环代码),执行2与2.1两个步骤

    性能测试从零开始:LoadRunner入门与提升

    第2章 第一次亲密接触LoadRunner 35 2.1 从性能测试到LoadRunner的映射 35 2.2 LoadRunner工作原理 38 2.3 安装LoadRunner 41 2.4 揭开License的神秘面纱 42 第3章 走近LoadRunner 44 3.1 LoadRunner的运行原理 45 ...

    XX项目测试总结报告模板

    在测试过程中,由于按照不同的开发模型,可能会有多次迭代或版本的测试,或是不同类型的测试,如功能测试、性能测试、安全测试等,那么每一次迭代或每一个版本的测试或每种类型的测试咱们都得记录其测试情况,以便...

    我的一次性能测试的心得

    我的一次性能测试的心得 软件测试 总结一下此次测试的不足之处: 1、测试计划中,对真实用户场景模拟不全面。 这次测试目的是调优,使上班登记功能满足客户的需求。我在设计场景时,只考虑到使用集合点,通过...

    性能测试报告(实例)

    测试报告是一次完整性能测试的体现,所以,这里我给出一个完整的性能测试报告,相信通过这个报告,我们会整性能测试有个整体的了解,知道我们在以后做性能测试时需要做哪些工作。注明:1)性能测试报告模板很多,这...

    在软件测试中和大家谈一下有关项目性能测试体验及实例

    体验实例在软件测试中和大家谈一下有关项目性能测试体验及实例感想一进入性能测试虚拟小组后,有幸跟着悟石元壮参与了一次项目的实践,感觉做下来收获蛮多的,把它总结下来。一、创建文件夹1.在执行性能测试的服务器...

    项目性能测试体验

    项目性能测试体验软件测试感想一进入性能测试虚拟小组后,有幸跟着悟石元壮参与了一次项目的实践,感觉做下来收获蛮多的,把它总结下来。一、创建文件夹1.在执行性能测试的服务器上创建项目的名称,如D:\项目名称,...

    自动化测试面试题总结.docx

    3,如何做性能测试 四、接口测试 1,如何设计接口测试用例 2,为什么要做接口测试 3,接口测试的关注点 4,request处理cookie的三种方式 五、自动化测试 1,自动化核心框架 2,自动化测试的好处 3,自动化的前提 4,...

    软件测试入门(必看)

    14.2 一个性能测试实例 74 14.2.1 被测系统 74 14.2.2 对被测系统进行性能测试 75 14.5 总结 80 十五 软件GUI测试中的关注点 80 15.1 不能不说的二个问题 81 15.1.1 软件测试中的“二八”原则 81 15.1.2 ...

    软件测试经典面试题 (超实用)

    73、请以您以往的实际工作为例,详细的描述一次测试用例设计的完整的过程。 23 74、您以往是否曾经从事过性能测试工作?如果有,请尽可能的详细描述您以往的性能测试工作的完整过程。 23 75、你对测试最大的兴趣在...

    软件测试必看 入门级的教程

    14.2 一个性能测试实例 74 14.2.1 被测系统 74 14.2.2 对被测系统进行性能测试 75 14.5 总结 80 十五 软件GUI测试中的关注点 80 15.1 不能不说的二个问题 81 15.1.1 软件测试中的“二八”原则 81 15.1.2 ...

    JMeter实验报告.doc

    " " "3、查询MySql数据库 " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "三、实验总结 " "JMeter主要用于性能测试。通过使用JMeter提供的功能,可以可视化地制定测试计划,包" "括使用什么样...

    性能参数调优

    总结一次大型企业(中国移动)的一次性能调优测试,以实际的测试调优实例,说明调优的方法,涉及JDBC调优,WAS server调优,IHS调优,linux系统调优,日志调优,并发测试脚本调优

    SQL查询安全性及性能优化

    完善代码审核、测试机制,软件开发是艺术! 检测SQL查询的效率 语法【对IO和Time对SQL执行进行统计】: SET STATISTICS IO ON SET STATISTICS TIME ON ------------SQL代码--------- SET STATISTICS IO OFF ...

    c#中list.FindAll与for循环的性能对比总结

    我在上文代码基础上增加了多次测试的代码: 得到了如下结果: .Net2.0, visual studio 执行1,1,10, 100,1000次: .Net4.1, visual studio 执行1,1,10, 100,1000次: Unity 先预处理再执行1000次: ...

    front-end-learning-evolution:一次总结也是一次深入的研究,研磨自己前端技术上的深度和广度

    前端研磨把基础的和更深入的前端知识都整理一次,会有原创和觉得不错的文章转载。前端知识图谱来源于公众号前端Q进阶学习图谱来源于公众号前端Q系列目录持续更新 ├─ 代码质量 │ ├─ E2E测试 │ ├─ 单元测试 │...

    总结一次C++ 程序优化历程

    使用不同的数据测试,发现了一个明显的缺点:大数据量下,预处理过程耗时很长。中科院的某计算集群,普通队列中的程序运行时间不能超过6个小时。而手上这套程序,大数据量下预处理就花了不止六个小时,结果当然是还...

    锂离子电池专利锂电池化成相关资料(103个).zip

    一种动力锂离子电池一次化成的密封夹紧系统及方法_1800001558967111.pdf 一种动力锂离子电池串联一次二化成放电工艺方法_1800001557728111.pdf 一种双路负压化成针床.pdf 一种圆柱型锂离子二次电池化成的方法_...

Global site tag (gtag.js) - Google Analytics