前言
随着软件系统的规模越来越庞大,对性能的需求越来越高,性能测试的要求也越来越高。但是仅仅做性能测试,已经很难满足当前软件系统对于性能的各种需求,所以需要做更多性能相关的工作。而对于这一系列性能相关的工作,我们称之为性能工程。
性能工程是发现和解决软件系统性能问题最主要的方法体系和技术手段,它一般包含以下几个部分:性能测试,性能轮廓,性能分析,性能优化和性能规划[1]。
- 性能测试:通过不同类型的测试,获取系统在不同情况下的性能情况,包括各种外部性能指标,是否满足实际的性能需求等。
- 性能轮廓:通过特定的工具获取被测系统的各种内部性能指标,从而辅助性能分析工作。
- 性能分析:通过分析性能测试和性能轮廓获得的各种数据等,发现性能瓶颈以及其原因,从而辅助性能优化的工作。
- 性能优化:通过各种技术和业务手段,尽可能消除性能瓶颈,从而提升系统的性能。
- 性能规划:通过在不同配置下,进行不同规模的性能测试,获取系统的性能变化规律。并针对不同的性能需求,利用这个规律对服务器资源和容量进行规划,从而满足不同的性能需求。
在性能工程中,技术层面上最难的部分是性能分析和性能优化,而整体上最为繁琐和复杂的则是性能规划,因为其包括了性能测试,基础设施,性能建模和资源协调等相关的工作,甚至需要做系统架构调整才能满足相应的规划工作。
性能规划
对于用户量不大的中小型系统,因为单机或者少量的多机就可以满足所有的业务性能需求,所以一般不需要做性能规划。但是随着业务性能需求的增大,产品环境的资源需求随之增加。但是为了避免增加过多资源,尽可能地减少资源的浪费,所以需要找到满足业务性能需求的最小资源量。
通过性能规划,可以找到这个最小的资源量。其次,有些项目的产品环境和测试环境的资源是不一样的,甚至有巨大的区别。使用性能规划的一系列实践,可以通过测试环境的性能指标,推测或者计算出产品环境中大概的性能情况。从而判断当前的产品环境是不是满足业务性能需求。
传统
现代弹性云平台出现之前,如果要部署一个服务器系统,必须购买固定配置和数量的物理机,应用服务器多机扩展也相对很困难,成本也很高。传统的数据库系统则更难以进行扩展,虽然以NewSQL为代表TiDB等数据库已经支持了水平横向扩展的能力,但是和应用服务器一样,硬件水平横向扩张也相对很困难,成本也很高。所以在传统的基础设施上做性能规划的痛点比较多,难度也比较大。
现代
现代弹性云平台出现之后,在其上的服务实例的硬件配置和数量可以非常容易地变更,数据库的硬件能力也可以进行变更。所以在这种基础设施下,可以更为容易地进行性能规划的工作。
实践
在进行性能规划之前,一定要熟悉整个系统的架构,并针对三个关键点进行隔离分析:网关,应用服务器和数据库。
以现在的技术,很难对已有的网关系统本身进行水平横向扩展,只能对其进行单机扩展,包括升级CPU,内存等。对于应用服务器,单机配置最好要和产品环境的实例保持一致,只是改变服务器数量来进行性能规划测试。对于无法进行水平横向扩展的应用系统来说,一般不需要做性能规划。最后对于数据库,如果无法水平扩展的数据库系统,可以使用云平台自带的数据库系统,因为现在大部分云数据库系统都支持扩展数据库的单机能力,比如Amazon RDS和 Azure SQL Database等。如果使用的是分布式数据库,则可以像应用服务系统一样在云平台上进行水平横向扩展。
只有根据业务性能需求,对关键三点都尽可能分别做性能规划,才能做到真正的全方位的性能规划。
步骤
做性能规划,一般有以下6个基本步骤:
- 准备测试环境
- 选取测试指标
- 建立测试模型
- 变化测试指标并进行性能测试
- 分析测试报告、拟合测试数据
- 找到性能变化规律,并规划产品环境性能
首先准备测试环境,最好选用云平台作为测试环境,如果无法使用云平台则需要准备足够量的物理机,以便得到足够的拟合数据。选取性能指标和建立测试模型是最关键和重要的两步,它们的正确和有效性直接影响到性能规划的工作量和结果的有效性。对于业务需求和系统架构的不同,重点关注的指标也有所不同,比如数据密集型的系统,一般会选取Response Time和TPS等作为关键指标;而数据存储型的系统,则选择吞吐量和IO作为关键指标。对于测试模型则可以考虑基于独立功能或者是基于场景,是需要有Think Time还是不需要,下图就是一个简单的测试模型的示例:
变化测试指标并进行性能测试则是最繁琐的步骤,因为需要改变各种配置和指标来进行测试,并收集各种测试结果数据。最后两步则是通过分析和数学拟合,并根据业务性能需求产出性能规划结果。
最后为了验证性能规划的有效性,需要在产品环境中通过各种监控手段,比如应用系统埋点采集或者日志采集,服务器探针等获取应用系统和服务器的各种性能数据,从而验证性能规划的有效性。
拟合
在性能规划的步骤里面有一步是拟合测试数据,它是通过数学的拟合方法,通过测试数据打点之后,得到一个曲线和与之相应的数学函数,然后通过这个数学函数可以估计性能的变化规律,从而对于硬件资源和系统配置进行规划的工作。
下表是一个以实例数量作为变化指标,在特定时间内完成的请求数作为观察指标的测试结果数据:
然后通过这些数据生成散列图(以下演示图使用的是MS Excel生成的,可以使用任何其他的数学工具或者库来生成以下的演示图,比如SageMath,Mathematica等)
拟合有很多种方式,比如指数拟合,线性拟合和多项式拟合等。一般情况下,多项式拟合可以获得比较准确的结果,下面三张图是通过Excel生成的多项式拟合(包括方程)。其中R=1则表示多项式完全符合所有的坐标点,且斜率为正。但是测试结果数据本身就存在一些不确定性,所以一般会找尽可能R接近1并且曲线尽可能平滑的拟合结果来进行推算。比如下图中我就会选择第一张图中的拟合函数来进行推算。
拟合图1:
拟合图2:
拟合图3:
一般情况下,做性能规划测试时,还可以选取下图中的指标来进行测试,并得到相应的数据来做二维拟合:
除了二维拟合,还可以做三维拟合,下图是常规情况下做三维拟合需要关注和变化的指标:
总结
性能规划在大型应用服务系统中的地位越来越高,因为它可以发现系统在常规性能测试的情况下很难发现的一些性能瓶颈问题,找到性能规律,从而根据不同的业务性能需求来规划产品环境的资源和配置,从而可以有效地防止服务器过载或者节约产品环境的资源和成本,一举多得。
[1] 性能规划:容量规划
文/Thoughtworks刘冉
原文链接:https://insights.thoughtworks.cn/performance-testing-planning/
更多精彩洞见,请关注微信公众号Thoughtworks洞见。
网友评论