三高人群
作为一名开发者,咱们最长听到的就是编程界的三高:
高性能、高并发、高可用。
听起来十分高大上,然而性能到底如何呢?又该如何评定呢?
这次咱们谈一谈性能测试,看一看到底什么样才叫做高性能。
本文次要从以下几个方面进行探讨。
(1)性能测试是什么?
(2)为什么须要性能测试?
(3)性能测试如何做?
(4)有哪些性能测试的工具
性能测试是什么?
老马已经说过,你想了解一件事物,首先必须先定义它。
这里间接援用一下百科中的定义:
性能测试是通过自动化的测试工具模仿多种失常、峰值以及异样负载条件来对系统的各项性能指标进行测试。
性能测试的定义也不难理解,往往定义自身论述了性能测试的作用。
为什么须要性能测试?
如果你是一名开发、测试,平时接手过不少需要,可能性能测试接触的也不多。
每一个需要,都有对应的功能性需要和肺功能性需要。
功能性需要是产品需要文档中最间接的,须要实现的性能指标。简称,能用就行。
非功能性需要则要宽泛的多,架构设计是否正当?是否便于前期拓展?是否便于监控?代码实现是否优雅?文档正文是否残缺?
就像你写了一只鸟,鸟头做螺旋桨非能飞起来,然而在架构设计上可能是不合理的。
一个查问性能,用户点击查问,10S 种才返回数据,性能上是满足的,然而性能上是不能承受的。
线上的交易性能平时各方面都很棒,节假日高峰期间接零碎就瘫痪了。
那如何防止这些问题呈现在生产上呢?
这就须要上线之前,首先做好对应的性能测试,防止再生产上呈现问题,带来重大的生产事变。
性能要高,性能要硬,性能测试,又高又硬!
如何做好性能测试
做一件事件之前,咱们首先要确定好本人的指标。
性能测试,到底要测试什么?
有些相似于开发过程中的需要剖析,常见的测试指标如下。
测试指标
响应工夫
响应工夫是指某个申请或操作从收回到接管到反馈所耗费的工夫,包含应用服务器(客户端)解决工夫、网络传输工夫以及数据库服务器解决工夫。
作为用户而言,在页面点击查问,期待了多久能力获取后果,这个就是响应工夫。
用户不关怀你后端通过了多少个服务,慢就是原罪。
对于微服务零碎,链路监控就显得比拟重要。能够帮忙咱们疾速定位到底慢在哪里。
TPS/QPS
TPS(Transaction Per Second)是指单位工夫(每秒)零碎解决的事务量。
我看网上还有很多相似的概念:点击量 / 点击率、吞吐量 / 吞吐率、PV/UV,这里不做赘述。
集体看来实质上 TPS/QPS 就是去压测你利用的极限,当访问量较大的时候,程序是否活下来?
这里次要波及到两个概念:高性能和高可用。
咱们前面会简略探讨下这两点。
测试筹备
明确了测试指标之后,就须要进行测试的筹备。
环境筹备:比方你想压测数据库,那就须要筹备对应配置的数据库资源。
脚本的筹备:数据初始化脚本,调用脚本等。
这个能够类比开发过程中的代码开发。
ps: 性能压测个别不是很罕用,所以环境筹备流程会比拟长,这一点须要留神。
测试报告
当进行测试之后,测试的后果肯定要给出一份报告进去。
是否通过压测要求?
最高的 QPS 是多少?
这样开发能够依据这份报告进行相应的优化。
如何晋升程序性能
晋升性能的内容写一本书也不为过,这里简略列举一些最罕用的几点:
(1)慢 SQL
个别程序如果响应工夫较长,能够首先看一下慢 SQL。
看下是否须要减少索引,或者进行 SQL 优化。
(2)缓存
针对查问,性能晋升最显著的就是引入缓存。
当然,引入缓存会使架构变得复杂,这一点要联合本人的理论业务。
(3)硬件降级
如果程序优化的空间比拟小,能够思考降级一下硬件资源。
比方服务器配置翻倍,数据库配置翻倍。
什么?你说公司没钱降级?
没钱降级做什么压测?
这个时候测试报告的作用就露出了,间接用数据谈话。
间接说 QPS 达不到生产要求,程序优化的空间很小,举荐硬件降级配置,降级到多少。
做人,要以德服人。
做测试,要用数据谈话。
罕用的性能测试工具
测试最罕用的工具当属 jmeter。
除此之外,还有一些其余的工具:
LoadRunner、QALoad、SilkPerformer 和 Rational Performance Tester。
上面对几个工具做下简略介绍
jmeter
Apache JMeter 能够用于测试动态和动静资源 (Web 动静应用程序) 的性能。
它能够用于模仿服务器、服务器组、网络或对象上的负载,以测试其强度或剖析不同负载类型下的总体性能。
LoadRunner
将负载测试集成到开发工具中:IDE、jUnit、nUnit、Jenkins、Selenium 和 Microsoft Visual Studio。
从 12.55 版本开始,您能够运行您的 JMeter 脚本,并在任何性能测试中集成 JMeter 和附加的脚本类型。
ps: 这个设计理念就十分好,能够和成熟的工具进行整合。站在伟人的肩膀上。
QALoad
QALoad 是客户 / 服务器零碎、企业资源配置(ERP)和电子商务利用的自动化负载测试工具。
QALoad 能够模仿成千盈百的用户并发执行要害业务而实现对应用程序的测试,并针对所发现问题对系统性能进行优化,确保利用的胜利部署。
ps: 这个工具自己没有接触过。
SilkPerformer
SilkPerformerV 能够让你在应用前,就可能预测企业电子商务环境的行为—不受电子商务利用规模和复杂性影响。
可视化的用户化、负载条件下可视化的内容校验、实时的性能监督和弱小的治理报告能够帮忙您迅速将问题隔离,这样,通过最小化测试周期、优化性能以及确保可伸缩性,放慢了投入市场的工夫,并保障了零碎的可靠性。
Rational Performance Tester
作为 DevOps 办法的一部分,IBM Rational Performance Tester 帮忙软件测试团队更早、更频繁地进行测试。
它验证 Web 和服务器应用程序的可扩展性,确定零碎性能瓶颈的存在和起因,并缩小负载测试。
您的软件测试团队能够疾速执行性能测试,剖析负载对应用程序的影响。
ps: 这一款工具有 IBM 提供,品质值得信赖。
为开发量身定做的性能测试工具
这么多工具可供使用,置信读到这里的小伙伴曾经找到了本人心仪的测试工具。
别急,上面专门为做 java 开发的小伙伴们举荐一款性能测试工具。
男人有男人的浪漫,开发者当然也要有开发者的浪漫。
【男人的浪.jpg】
junitperf
作为一名开发者,老马平时单元测试应用 junit 最多。
所以始终心愿找到一款基于 junit 的性能压测工具,起初也的确找到了。
https://github.com/houbb/junitperf 是一款为 java 开发者设计的性能测试框架。
为什么应用?
- 能够和 Junit5 完满符合。
- 应用简略,便于我的项目开发过程中的测试实用。
- 提供拓展,用户可进行自定义开发。
个性
- 反对 I18N
- 反对多种报告生成形式,反对自定义
- Junt5 完满反对,便于 Java 开发者应用
应用入门
maven 引入
<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>junitperf</artifactId>
<version>2.0.7</version>
</dependency>
入门例子
@JunitPerfConfig(duration = 1000)
public void helloTest() throws InterruptedException {Thread.sleep(100);
System.out.println("Hello Junit5");
}
注解阐明
@JunitPerfConfig
指定测试时的属性配置。(必填项)
属性 | 阐明 | 类型 | 默认值 | 备注 |
---|---|---|---|---|
threads | 执行时应用多少线程执行 | int | 1 | |
warmUp | 筹备工夫 | long | 0 | 单位:毫秒 |
duration | 执行工夫 | long | 60_000(1 分钟) | 单位:毫秒 |
latencyStatistics | 统计实现 | StatisticsCalculator | DefaultStatisticsCalculator | |
reporter | 报告实现 | Reporter | ConsoleReporter |
应用如下:
/**
* 2 个线程运行。* 筹备工夫:1000ms
* 运行工夫: 2000ms
* @throws InterruptedException if any
*/
@JunitPerfConfig(threads = 2, warmUp = 1000, duration = 2000)
public void junitPerfConfigTest() throws InterruptedException {System.out.println("junitPerfConfigTest");
Thread.sleep(200);
}
@JunitPerfRequire
指定测试时须要达到的要求。(选填项)
属性 | 阐明 | 类型 | 默认值 | 备注 |
---|---|---|---|---|
min | 最佳的运行耗时 | float | -1 | 最快的运行耗时如果高于这个值,则视为失败。单位:毫秒 |
max | 均匀的运行耗时 | float | -1 | 最坏的运行耗时如果高于这个值,则视为失败。单位:毫秒 |
average | 均匀的运行耗时 | float | -1 | 均匀的运行耗时如果高于这个值,则视为失败。单位:毫秒 |
timesPerSecond | 每秒的最小执行次数 | int | 0 | 如果低于这个最小执行次数,则视为失败。 |
percentiles | 对于执行耗时的限定 | String[] | {} | percentiles={“20:220”, “30:250”}。20% 的数据执行耗时不得超过 220ms;30% 的数据执行耗时不得超过 250ms; |
应用如下:
/**
* 配置:2 个线程运行。筹备工夫:1000ms。运行工夫: 2000ms。* 要求:最快不可低于 210ms, 最慢不得低于 250ms, 均匀不得低于 225ms, 每秒运行次数不得低于 4 次。* 20% 的数据不低于 220ms, 50% 的数据不得低于 230ms;
*
* @throws InterruptedException if any
*/
@JunitPerfConfig(threads = 2, warmUp = 1000, duration = 2000)
@JunitPerfRequire(min = 210, max = 250, average = 225, timesPerSecond = 4, percentiles = {"20:220", "50:230"})
public void junitPerfConfigTest() throws InterruptedException {System.out.println("junitPerfConfigTest");
Thread.sleep(200);
}
测试报告
对应的测试报告生成形式也是多样的,也容许用户自定义。
基于控台日志:
[INFO] [2020-06-16 20:05:53.618] [c.g.h.j.e.HelloWorldTest.helloTest] - Started at: 2020-06-16 20:05:52.512
[INFO] [2020-06-16 20:05:53.619] [c.g.h.j.e.HelloWorldTest.helloTest] - Invocations: 9
[INFO] [2020-06-16 20:05:53.620] [c.g.h.j.e.HelloWorldTest.helloTest] - Success: 9
[INFO] [2020-06-16 20:05:53.620] [c.g.h.j.e.HelloWorldTest.helloTest] - Errors: 0
[INFO] [2020-06-16 20:05:53.621] [c.g.h.j.e.HelloWorldTest.helloTest] - Thread Count: 1
[INFO] [2020-06-16 20:05:53.623] [c.g.h.j.e.HelloWorldTest.helloTest] - Warm up: 0ms
[INFO] [2020-06-16 20:05:53.623] [c.g.h.j.e.HelloWorldTest.helloTest] - Execution time: 1000ms
[INFO] [2020-06-16 20:05:53.624] [c.g.h.j.e.HelloWorldTest.helloTest] - Throughput: 9/s (Required: -1/s) - PASSED
[INFO] [2020-06-16 20:05:53.625] [c.g.h.j.e.HelloWorldTest.helloTest] - Memory cost: 16byte
[INFO] [2020-06-16 20:05:53.635] [c.g.h.j.e.HelloWorldTest.helloTest] - Min latency: 100.191414ms (Required: -1.0ms) - PASSED
[INFO] [2020-06-16 20:05:53.635] [c.g.h.j.e.HelloWorldTest.helloTest] - Max latency: 105.2382ms (Required: -1.0ms) - PASSED
[INFO] [2020-06-16 20:05:53.636] [c.g.h.j.e.HelloWorldTest.helloTest] - Avg latency: 101.43268ms (Required: -1.0ms) - PASSED
或者基于 HTML:
小结
本文对性能测试做了最根本的介绍,让小伙伴们对性能压测有一个最根本的了解。
测试和开发一样,都是一件费时费力,而且须要认真做能力做好的事件,其中的学识不是一篇就能说清的。
性能测试工具也比拟多,本文重点介绍了专门为 java 开发者打造的 junitperf 工具。
下一节咱们将从源码角度,解说一下 junitperf 的实现原理。
我是老马,期待与你的下次重逢。
开源地址:https://github.com/houbb/junitperf