笔者专注性能测试的时间大概有 5 年时间,其间也经历了性能测试主流工具从 LR 到 Jmeter 转变,监控工具从最早的 Linux 原生命令到界面花里胡哨的 Glances、Zabbix 等等。技术架构从单一的节点到多集群,业务对性能的要求越来越高,对于性能测试,有一点小的体会,后续会分多篇来聊聊。今天先说说我对性能测试的一些感观。

01 性能测试的目标

看到这个小标题,大家一定都有很多自己的认知和看法,我会从两个方面进行简单的归纳:技术目标和业务目标。

对于技术目标,大概有 4 点需要我们去追求和改进的:

评估性能,定性分析:这个也是我们做性能的测试的初衷,当我们想要了解某个业务系统的性能状况时,我们会从各类已知的指标入手,常见的有 TPS(每秒处理业务数)、ART(响应时间)、系统资源使用率等等。通过技术手段的优化,提升这类指标,给产品以信心,能够应对可能到来的流量洪峰。

明确参数配置:我们现在会大量地使用各类中间件、技术组件来解耦我们的系统,其中会涉及大量的参数配置信息。以前一直会有人问 “Tomcat 的最佳配置参数是多少,XXX 参数应该怎么配置才合理呢” 这类的问题。本质上,这类问题是没有定值的,需要我们结合业务一起去调整。最典型的,就是线程数的配置,各类中间件大多都有线程数配置,并不是配置越多越好,配置多了,浪费内存,配置少了,增加时间消耗,这个值需要有全局视角,结合业务架构进行统一的配置,否则单节点配置得再高,也不会达到预期值,因为有可能上游就不会有那么多线程流到你的这个节点上来。

获取扩展参数,做好预警:做一次好的、完整的性能测试,一定不是简单的给出一个 TPS 那么简单,对于高阶性能测试,我们都会要求测试出性能拐点在哪里,达到拐点时,瓶颈点是什么。为什么要关注这个呢?因为从高层的角度看,他们更关注的是什么情况下,需要我做扩容,先扩什么东西,以便系统能够撑过流量的高峰,这样对业务才会更有意义。

提升各种利用率:这个其实是最后的价值。在以前服务器本成比较昂贵的时候,我们会想办法尽可能的提升服务器的利用率,节约成本。但是现在,伴随着各种云,服务器成本在直线下降,我们面对的是更多业务的不确定性,所以前面三点就变得更加重要,提升利用率反倒显得没那么重要了。不过,如果真的做好前面三点,那利用率自然而然的也会上去,不用特意去纠结。

对于业务目标,主要有两点目标:

业务稳定性:这个是我们做性能测试的基本盘,本质上我们做各类测试都是为了维护业务的稳定性,通过性能测试,系统在面对流量洪峰时,能够平稳过渡,是性能测试的最大目标。

更好的用户体验:1 秒的等待时间和 5 秒的等待时间,对用户的体验是完全不同的,因此,我们需要提升系统性能,来给用户更好的使用体验,让用户操作更丝滑、更顺畅,提升产品的友好度。

02 技术层面的支撑

性能测试是一个对技术的全面性要求非常高的测试能力,需要从业者具备较广泛的知识体系,能够通过各类监控指标,准确定位到系统瓶颈。所以需要扎实的技术功底,主要有以下三类:

计算机原理:这是很多人都忽略的一件事,现在想要从事性能测试人员,大多数更关注于技术侧的提升,而忽略了最底层计算机原理,实际上这个才是根本,代码的运行,最终还是离不开 CPU 和内存。建议大家读读《性能之巅》、《深入理解计算系统》。嗯,这两本书都很容易劝退你,加油。

常见用技术组件:这类组件就非常多了,需要大家结合自己公司的技术架构选型去做针对性的学习,后续有机会展开来讲一些常用的。主要关注的内容是他们的实现原理是什么,如何构建通信通道,常见的错误使用有哪些,如何避免等等,这些网上的资料非常多,需要自己去尝试和验证是否正确。

常见的数据存储组件:以前我们经常会说,性能问题 80% 出现数据层,对于数据库,我们会非常关注 SQL 的执行效率。现在的数据存储组件越来越多,Nosql、ES 等等,需要大家根据实际需要去做针对性的学习。

03 非技术层面的支撑

除了技术层面的支撑外,为了更好地开展性能测试,我们还需要一些非技术的软技能来支撑日常的工作。主要有两个方面:

1. 分析方法论:面对各种各样的监控指标,我们如何快速地找到对自己有用的信息?一般的性能测试分析方法有分段、分层及二分法。分段和分层比较好理解,在很多地方我们也会用到,比如很多技术框架都提倡分层,每个层专注做自己的事。性能分析也一样,我们可以对被监控系统做好分层,然后逐步定位,缩小范围。

二分法主要用于快速定位并发数,例如当你发现产生 1000 的并发时,系统已经处理不过来了,这时候你就需要变成 500(取 1000 的一半,看是处到上半部分还是后半部分),然后 750(如果在上半部分,就再取一半,以此类推,是不是和排序很像?)。

2. 经济学基础:很多人会好奇做性能测试和经济学有什么关系。举个例子,性能优化,最终还是会回归到是用空间换时间(比如用内存处理数据),还是用时间换空间的问题(上传附件、分页查询)上来,这里面需要做一些动态的平衡,如何做取取舍,是调优时,需要我们去考虑的。

还有一个,就是边际递减问题,大家应该会发现,随着性能测试优化的不断深入,优化越来越难,结果也越来越不明显。前期你可能加个索引,性能就提升了几十倍,但到了后期,你改的代码越多,性能的提升反而不明显。理论上性能测试可以一直进行下去,但实际上后续的优化成本可能会非常高,需要我们在适当的时机停止优化。

04 小结

性能测试是一个庞大而复杂的工程,我们需要以终为始,明确每次性能优化的目标是什么,控制好成本问题,同时需要在平时注意积累各类技术体系,更应当关注技术的底层原理是什么。结合一些常用的分析方法论,快速定位问题。

原文链接:https://mp.weixin.qq.com/s/b_BzNMyd4aVB8872z87GQA


↙↙↙阅读原文可查看相关链接,并与作者交流