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

  什么是性能测试?

  性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。

  负载测试和压力测试都属于性能测试,两者可以结合进行。

  通过负载测试,确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统各项性能指标的变化情况。

  压力测试是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的大服务级别的测试。

  中国软件评测中心将性能测试概括为三个方面:应用在客户端性能的测试、应用在网络上性能的测试和应用在服务器端性能的测试。

  通常情况下,三方面有效、合理的结合,可以达到对系统性能全面的分析和瓶颈的预测。

  注意这里提到了三个方面,但平常我们往往注意力集中在服务端的性能而忽略了客户端和网络的性能。

  下面是我这个半桶水来谈谈一些体会:

  一、目的/需求

  为什么需要做性能测试或此次做性能测试的目的是什么?

  1. 新项目/产品,首次发布,需要做基准测试

  2. 使用中的产品,重构了某个模块/某个模块使用了新的技术,需要一个评估

  3. 使用中的产品,用户量爆发了,用户量从百万级增加到千万级

  4. 增加了一个或多个页面,需要对页面的Latency进行一次测试

  在测试开始前,需要有准备工作,对此次性能测试的目的做详细了解,确定需要收集哪些数据,关注哪些性能指标。

  二、环境部署

  性能测试需要一个干净的环境,这个环境包括硬件、网络、操作系统、被测试的系统,数据库。

  那在开始前,需要把这个环境部署准备好,好是能模拟线上的系统,同时这也是一个排除干扰的过程,画出一张架构图。

  1. 硬件,使用怎样的服务器,理想情况是和生产环境一样的服务器,需要配置负载均衡么

  2. 网络, 是否需要模拟各种网络,是否需要双网卡,内部网络是否会影响到其他员工正常使用

  3. 操作系统,windows/linux,是采用默认设置还是已经有参考的设置,哪些操作系统的服务需要关闭,linux中的ulimit如何设置

  4. 被测试系统,邀请架构师的参与,系统使用怎么样的架构,是否使用了Web Server——IIS/Apache/Tomat,他们的优配置是怎么样的

  5. 数据库,站内搜索数据库是否和订单数据库分开,数据库是否有缓存,数据库是否使用主从式

  三、场景和负载模式

  此次性能测试需要模拟怎样的场景:

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

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

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

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

  四、性能指标

  此次性能测试需要收集哪些性能指标和数据:

  1. CPU使用率

  2. Memory使用率

  3. QPS

  4. 响应时间

  5. 网络IO

  6. 文件IO

  7. 数据库IO

  8. 大支持用户数

  以上指标并不是都要收集,要根据具体的场景来决定。

  五、性能测试工具

  提到性能测试,很多测试人的第一概念是工具,比如商业流行的Loadrunner,开源流行的Jmeter,但是很少人注重上面提到的四点,所谓“磨刀不误砍材工”,没有上面的设计分析,仅仅使用工具跑出结果是无法分析出性能的瓶颈,不可靠的数据结果会大大增加排查工作,这些数据往往会受到很多质疑。

  工具的使用: