zoukankan      html  css  js  c++  java
  • 半桶水谈性能测试

    首先在我的职业生涯中,做性能测试的机会不多,发现性能瓶颈的次数更少,确切的说只有2次。随着大型分布式系统,特别是Web App和云计算的推广,性能测试的需求会更加迫切。今天我这个半桶水就来谈谈性能测试的话题,欢迎大家一起来讨论。

    什么是性能测试?
    性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。
    负载测试和压力测试都属于性能测试,两者可以结合进行。
    通过负载测试,确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统各项性能指标的变化情况。
    压力测试是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大服务级别的测试。

    中国软件评测中心将性能测试概括为三个方面:应用在客户端性能的测试、应用在网络上性能的测试和应用在服务器端性能的测试。
    通常情况下,三方面有效、合理的结合,可以达到对系统性能全面的分析和瓶颈的预测。
    注意这里提到了三个方面,但平常我们往往注意力集中在服务端的性能而忽略了客户端和网络的性能。

    下面是我这个半桶水来谈谈一些体会:
    一、目的/需求
    为什么需要做性能测试或此次做性能测试的目的是什么?
    1. 新项目/产品,首次发布,需要做基准测试
    2. 使用中的产品,重构了某个模块/某个模块使用了新的技术,需要一个评估
    3. 使用中的产品,用户量爆发了,用户量从百万级增加到千万级
    4. 增加了一个或多个页面,需要对页面的Latency进行一次测试
    在测试开始前,需要有准备工作,对此次性能测试的目的做详细了解,确定需要收集哪些数据,关注哪些性能指标。

    二、环境部署
    性能测试需要一个干净的环境,这个环境包括硬件、网络、操作系统、被测试的系统,数据库。
    那在开始前,需要把这个环境部署准备好,最好是能模拟线上的系统,同时这也是一个排除干扰的过程,画出一张架构图。
    1. 硬件,使用怎样的服务器,理想情况是和生产环境一样的服务器,需要配置负载均衡么
    2. 网络, 是否需要模拟各种网络,是否需要双网卡,内部网络是否会影响到其他员工正常使用
    3. 操作系统,windows/linux,是采用默认设置还是已经有参考的设置,哪些操作系统的服务需要关闭,linux中的ulimit如何设置
    4. 被测试系统,邀请架构师的参与,系统使用怎么样的架构,是否使用了Web Server——IIS/Apache/Tomat,他们的最优配置是怎么样的
    5. 数据库,站内搜索数据库是否和订单数据库分开,数据库是否有缓存,数据库是否使用主从式

    三、场景和负载模式
    此次性能测试需要模拟怎样的场景:

    1. 购物网站秒杀活动,使用恒负载模式,设定集合点,用户并发

    2. 系统正常的使用,从每天的监控系统中分析,例如看到购物高峰是中午,使用单步负载模式(Ram-up/down),每间隔时间内用户增加多少,到购物高峰时间是恒负载,过了高峰后用户开始减少

    3. 系统改版,使用基于目标的负载模式,根据历史数据设定目标,或例如设定CPU/Memory最大到85%

    确定好了场景和负载模式,才能正确的生成用例/脚本。

    四、性能指标
    此次性能测试需要收集哪些性能指标和数据:
    1. CPU使用率
    2. Memory使用率
    3. QPS
    4. 响应时间
    5. 网络IO
    6. 文件IO
    7. 数据库IO
    8. 最大支持用户数
    以上指标并不是都要收集,要根据具体的场景来决定。

    五、性能测试工具
    提到性能测试,很多测试人的第一概念就是工具,比如商业流行的Loadrunner,开源流行的Jmeter,但是很少人注重上面提到的四点,所谓“磨刀不误砍材工”,没有上面的设计分析,仅仅使用工具跑出结果是无法分析出性能的瓶颈,不可靠的数据结果会大大增加排查工作,这些数据往往会受到很多质疑。
    工具的使用:
    alt text
    参数化
    Loadrunner选择哪个协议
    Loadrunner的关联
    Loadrunner的Controller/Agent
    Jmeter的Remote testing
    工具的使用技能仅仅是性能测试里的一小部分,切不可只关注工具使用。

    是否每次的性能测试都需要用上大型的工具呢,某个页面的响应时间是否可以使用其他轻量的工具,例如一些浏览器插件HttpwatchYahoo YSlowGoogle speed tracer
    是否可以自己写些有针对性的小工具,根据实际情况定义出真实的Page load time,而不仅仅是服务器的响应时间。
    alt text

    六、数据收集与分析
    性能测试的最终目的是通过数据收集分析出系统是否存在瓶颈,所以数据收集和分析是一个很重要的过程。
    分析的过程需要团队成员的参与,例如架构师、DBA、开发人员,是一个长期的过程,通过调整测试脚本,生成不同的数据对比。

    七、我所发现的2次问题
    1. 双网卡问题,一个新改版的项目,上线后在峰值的时候总有机器崩溃或性能大幅下降,最后发现是服务器只使用了单网卡,这个明显就是上面提到的排除干扰没做好(配置没有检查),这次性能测试是失败的。
    2. 子进程崩溃,64位系统基准测试,通过与团队成员的不断沟通,排除各种设置干扰、确定硬件和软件配置、加入profile工具,与32位系统的对比。

    八、后续优化
    性能测试仅仅是个开始,性能测试最终目的是发现和解决系统的瓶颈,这就涉及到优化,而优化的过程往往在系统设计阶段就需要考虑。
    1. 异步获取数据
    2. 建立缓存
    3. 分布式
    4. 文件分解 

    九、推荐

    1. 基于用户体验的性能测试,User Experience, Not Metrics
      更贴近用户使用场景的性能测试,里面使用的工具主要是IBM的Rational TestStudio
      http://www.cnblogs.com/mayingbao/archive/2008/04/11/1148510.html

    2. 软件性能测试过程详解与案例剖析(第二版)

    3. 要做好性能测试,该掌握些什么?
      http://www.cnblogs.com/jackei/archive/2008/06/27/1231307.html
      http://www.cnblogs.com/jackei/category/32808.html

    OscarXie.net

    关注质量与体验——电子商务与自动化测试
    http://www.cnblogs.com/oscarxie/

  • 相关阅读:
    EF 配置(SqlServer,Mysql)
    mysql sql优化
    非root用户安装、配置mysql
    使用spring jdbc遇到的一个性能问题
    mac 修改 vim 配色
    logstash 监控日志文件时应对日志文件名改变的原理
    java Atomic compareAndSet部分原理分析
    实现进程单例的一些想法
    java String、String.concat和StringBuilder性能对比
    Elasticsearch 动态修改replica配置、增删replica
  • 原文地址:https://www.cnblogs.com/oscarxie/p/2675073.html
Copyright © 2011-2022 走看看