性能方程的隐藏部分

摘要:做性能测试时,为了覆盖完全,你可能会尝试写“性能方程”,以便你能检查每一个性能因素。但各部分不总是能相等于整体,部分性能影响组件很容易被忽视。做测试更侧重于去发现系统行为,而不是验证一些简单样例的期望行为。

许多团队决定把服务器和网络基础设施整合在一起构建“试验台”,开发一些脚本模拟用户的请求,对应用程序运行所有事物,看它们是否满足业务需求。并且为了确保具有富余的能力,会运行双倍数量的事务。

这方法仅仅在有些时候起作用,这意味着其它一些时候是行不通的。去解释为什么起作用或行不通相当困难。

让我们仔细看看构成“性能方程”的部分:

性能测试方程

注:

Env 代表测试环境 (包括网络,交换器,负载均衡器,服务器,数据库,以及平台软件);

WL 代表模拟用户活动的负载脚本;

Code 代表应用代码,包括内部组件和第三方库;

X是一组性能指标,如响应时间,吞吐量等。

环境

测试环境的软硬件多方面影响于应用的性能。复制生产环境从经济角度来看非常具有挑战性,可能的做法是尽可能接近生产环境的测试环境用于性能测试。通常可能是用户验收测试放在预发布环境。典型的“challenge fork”是:使用一个比实际生产环境差的测试环境可能引出许多不切实际的错误,或者使用一个比实际生产环境强大的测试环境可能会掩盖真正的性能问题。

使用显著不同的硬件,测试风险是显而易见的,而其它的差异可能不会那么明显。服务器设置,内存分配,以及进程优先级需要首先考虑。

应用设置可能也会导致性能差异。例如,调试和日志级别可能显著改变文件操作的频率和数量。数据库结构和内容的复杂性都可能对性能造成显著的影响,如搜索和报告等。为了解决这种风险,你可以使用生产数据库的副本。

这可能需要花费几轮测试来发现和修复环境部分的隐藏因素。

负载

工作负载经常基于服务水平协议和业务需求。一些常见的实例包括交易数,并发用户数,以及响应时间。典型的需求可能像是:

  • 允许2500个账户的总用户群的10%并发工作;
  • 支持性能,每小时处理2500笔交易;
  • 页面加载时间应不超过5到10秒;
  • 系统应持续运行8小时;

这样的需求看起来非常简单,所以它们可能作为工作负载。例如,基于上面给出的需求,你可能需要模拟250个并发用户每小时进行10笔交易,并持续运行8小时。这样做,也衡量了网页的加载时间。是的,为了测试(系统的)富余能力,让其每小时处理20笔交易,即每三分钟处理一笔交易。

我们缺少这种直线式的东西吗?

为了更好说明,从另一个角度来看,这里使用道路交通来代替应用流量。一段长一百码的公路,可以被10辆同时占用。当这里正好有一些车时,注意他们速度的差异,特别当它们前后紧挨着的时候。同时注意,在同一时刻任何指定的部分,车道车辆的数量变化。数量根据车道变化,一些车辆稀少的部分伴随超车,会极大的影响交通的速度。

你可能明白这是怎么回事。通过均匀的在一段时间分发交易数量,并发但不能保证交易同时进行。就像我们认为250个用户同时按下“提交”按钮是不可能的。那么10人有可能吗?甚至3人?这些就是我们最有可能遇到瓶颈的地方。

并发用户的总数呢?大部分负载测试工具和服务,基于虚拟用户数量有一个定价模式,许多公司没有支持250个虚拟用户的许可证。一个典型的解决方法是以一倍或两倍脚本的速度弥补了交易数量。虽然这样在数学上看是正确,但这种方法没有考虑用户会话数量存在软件系统的非线性效应。每个会话需要分配资源(到应用的内存,服务器和数据库),资源管理会有性能负担。因此,以三倍速度运行脚本不会真的弥补相当数量的用户。

代码

在我们的性能方程中,假定代码部分是唯一的变量,则任何性能变化都意味着最新的代码与它有点有关。

一些代码的修改确实可能对性能有着戏剧性的影响。但往往,在这里和那里细微的变化积累一段时间后,性能问题会变得非常明显。除非你为每个组件建立一个性能基准趋势图,否则,任何延缓下降可能很难被注意到。即使测试可以揭示性能的下降,不存在单一根源的情况下,解决问题仍然非常具有挑战性。

固定的工作负载旨在建立一个跟踪基线。执行相同的脚本使用相同的负载方式。但也意味着使用相同的方式操作相同的应用。随着预定的交易,可能是搜索,编辑,数据移除,以及运行报告。所有的这些功能可以在负载之外生成,如果并行使用可能会对性能产生真正的影响。

相同的功能也可能发布新的特性,例如账号查询,编辑购物车,等等。如果脚本以相同的方式进行交易,没有解决很多代码更改。

X求解

所有测试是一个综合性的活动:学习,建模,实验和调查。做测试更侧重于去发现系统行为,而不是验证一些简单样本的期望行为。负载和性能测试也不例外。只有通过反复的实验和试错,我们才能了解更多系统和开发有用的工作负载模型。

在你的性能方程中寻找隐藏部分,特别当看起来非常容易解决的时候。

本文译自Albert Gareen的《Hidden Parts of the Performance Equation》一文。



留言