Java性能权威指南读书笔记二 性能测试方法

前言

本章讨论了性能测试的4个原则,这些原则是后续章节的基础,也涵盖了性能工程科学的各个方面。

原则1:测试真实应用

第1条原则就是,应该在产品实际使用的环境中进行性能测试。性能测试的方法大体分为三种,每种都有其优点和不足,只有适用于实际应用的才能取得最好的效果。

1  微基准测试

第一种是微基准测试。微基准测试用来测量微小代码单元的性能,包括调用同步方法的用时与非同步方法的用时比较,创建线程的代价与使用线程池的代价。

1.1 必须使用被测的结果

如果被测试代码的结果没有被使用,那么编译器可以很放心地去除计算结果。解决的方法是将局部变量结果改为实例变量(并用关键字volatile声明)。

1.2 不要包括无关的操作

除了想要被测试的代码,不要包含其他的代码

1.3 必须输入合理的参数

用大量不常见的参数作为输入,那么性能测试的结果就不具有实际的意义。

2. 宏基准测试

宏基准测试就是整体测试,不进行整体测试,就不知道系统在实际的业务中到底会具有怎样的性能。

3. 介基准测试

类似模块测试,介于宏基准测试和微基准测试之间。是一种合理的折中途径,有必要的存在性。

原则2:理解批处理流逝时间、吞吐量和响应时间

1 批处理流逝时间

在非Java的世界中,可以直接地测试流逝时间:应用记下时间点从而测量执行时间。但在Java的世界中,由于JIT,会有问题。
因此,研究Java的性能优化要密切注意代码优化的热神期:大多数情况下应该在运行足够长时间后,已经编译优化后再测量。
另一方面,从应用开始启动到结束的这段时间也是同样重要的。

2 吞吐量测试

吞吐量测试是基于一段时间所能完成的工作量。这个指标通常被叫做每秒事务数(TPS),每秒请求数(RPS),每秒查询数(QPS)

3 响应时间测试

响应时间是从客户端发送请求至收到响应之间的流逝时间。
衡量响应时间的方法:

  1. 平均值法:请求时间到总和除以请求数。
  2. 百分位请求法:例如90百分位响应时间。如果90%的请求时间响应小于1.5秒,且10%的请求时间大于等于1.5秒,则1.5秒就是第90百分位响应时间。
    ps:平均值会受离群值影响(突然出现一个非常大的值对平均值影响很大)

原则3: 用统计方法应对性能的变化

即使是相同的测试集,也会产生不同的性能测试结果。因为会有很多因素影响到程序的性能,例如:机器上的后台进程,网络情况等等。
一种方法是多次测试比较平均值,然而这也并不能解决问题。所以

原则4:尽早频繁的测试

我理解对于性能测试应该伴随着开发的过程,如果中间有性能的衰减,应该停止提交代码,然后在性能正常后再继续开发。
以下几条原则可以提高测试性能:

自动化一切

所有的性能测试应该自动化
全部环境必须通过脚本安装和配置新代码(创建数据库连接,建立用户账户等),然后用脚本运行测试集。
脚本必须能够多次运行测试,对结果进行t校验分析,并能生成置信度报告。说明统计结果是相同还是不同,不同的话相差多少。
在测试前,通过自动化技术确保机器处于稳定状态。检查是否有不希望运行的进程,操作系统配置是否正确。
ps:只有环境系统,性能测试才是可重复的。

测试一切

收集每一点数据,以便进行后续分析。

  1. 运行过程中系统信息:CPU使用率,磁盘使用率,网络使用率,内存使用率等。
  2. 应用的日志
  3. 垃圾收集器的日志
  4. 还可以有对系统影响比较小的profiling信息或者jfr信息。
  5. 周期性线程堆栈信息,以及其他堆信息
  6. 相关系统的信息:数据库

在真实的系统上运行

如果条件允许,最好和正式运行的相同的机器上运行。
很多jvm的参数是根据硬件的条件计算出来的。另外平台和平台之间编译出来的代码也不相同。这些都会造成性能测试的结果不同。

总结

性能测试是一门艺术,同时建立在科学理论的基础上。