目录
性能测试攻略
微基准性能测试
宏基准性能测试
热身问题
多 JVM 情况下的影响
合理分析结果,制定调优策略
推荐阅读
性能测试攻略
性能测试是提前发现性能瓶颈,保障系统性能稳定的必要措施。下面我先给你介绍两种常用 的测试方法,帮助你从点到面地测试系统性能。
微基准性能测试
微基准性能测试可以精准定位到某个模块或者某个方法的性能问题,特别适合做一个功能模 块或者一个方法在不同实现方式下的性能对比。例如,对比一个方法使用同步实现和非同步 实现的性能。
宏基准性能测试
宏基准性能测试是一个综合测试,需要考虑到测试环境、测试场景和测试目标。
首先看测试环境,我们需要模拟线上的真实环境。
然后看测试场景。我们需要确定在测试某个接口时,是否有其他业务接口同时也在平行运 行,造成干扰。如果有,请重视,因为你一旦忽视了这种干扰,测试结果就会出现偏差。
最后看测试目标。我们的性能测试是要有目标的,这里可以通过吞吐量以及响应时间来衡量 系统是否达标。不达标,就进行优化;达标,就继续加大测试的并发数,探底接口的 TPS(最大每秒事务处理量),这样做,可以深入了解到接口的性能。除了测试接口的吞吐 量和响应时间以外,我们还需要循环测试可能导致性能问题的接口,观察各个服务器的 CPU、内存以及 I/O 使用率的变化。
以上就是两种测试方法的详解。其中值得注意的是,性能测试存在干扰因子,会使测试结果 不准确。所以,我们在做性能测试时,还要注意一些问题。
热身问题
当我们做性能测试时,我们的系统会运行得越来越快,后面的访问速度要比我们第一次访问 的速度快上几倍。这是怎么回事呢?
在 Java 编程语言和环境中,.java 文件编译成为 .class 文件后,机器还是无法直接运行 .class 文件中的字节码,需要通过解释器将字节码转换成本地机器码才能运行。为了节约内 存和执行效率,代码最初被执行时,解释器会率先解释执行这段代码。
随着代码被执行的次数增多,当虚拟机发现某个方法或代码块运行得特别频繁时,就会把这 些代码认定为热点代码(Hot Spot Code)。为了提高热点代码的执行效率,在运行时, 虚拟机将会通过即时编译器(JIT compiler,just-in-time compiler)把这些代码编译成与本地平台相关的机码,并进行各层次的优化,然后存储在内存中,之后每次运行代码时, 直接从内存中获取即可。
所以在刚开始运行的阶段,虚拟机会花费很长的时间来全面优化代码,后面就能以最高性能 执行了。
这就是热身过程,如果在进行性能测试时,热身时间过长,就会导致第一次访问速度过慢, 你就可以考虑先优化,再进行测试。
多 JVM 情况下的影响
如果我们的服务器有多个 Java 应用服务,部署在不同的 Tomcat 下,这就意味着我们的服 务器会有多个 JVM。任意一个 JVM 都拥有整个系统的资源使用权。如果一台机器上只部署 单独的一个 JVM,在做性能测试时,测试结果很好,或者你调优的效果很好,但在一台机 器多个 JVM 的情况下就不一定了。所以我们应该尽量避免线上环境中一台机器部署多个 JVM 的情况。
合理分析结果,制定调优策略
这里我将“三步走”中的分析和调优结合在一起讲。
我们在完成性能测试之后,需要输出一份性能测试报告,帮我们分析系统性能测试的情况。 其中测试结果需要包含测试接口的平均、最大和最小吞吐量,响应时间,服务器的 CPU、 内存、I/O、网络 IO 使用率,JVM 的 GC 频率等。
通过观察这些调优标准,可以发现性能瓶颈,我们再通过自下而上的方式分析查找问题。首 先从操作系统层面,查看系统的 CPU、内存、I/O、网络的使用率是否存在异常,再通过命 令查找异常日志,最后通过分析日志,找到导致瓶颈的原因;还可以从 Java 应用的 JVM 层面,查看 JVM 的垃圾回收频率以及内存分配情况是否存在异常,分析日志,找到导致瓶 颈的原因。
如果系统和 JVM 层面都没有出现异常情况,我们可以查看应用服务业务层是否存在性能瓶 颈,例如 Java 编程的问题、读写数据瓶颈等等。 分析查找问题是一个复杂而又细致的过程,某个性能问题可能是一个原因导致的,也可能是 几个原因共同导致的结果。我们分析查找问题可以采用自下而上的方式,而我们解决系统性 能问题,则可以采用自上而下的方式逐级优化。下面我来介绍下从应用层到操作系统层的几 种调优策略。
推荐阅读
业务幂等性技术架构体系
记一次线上SQL死锁事故:如何避免死锁
亿级在线百万并发认证业务分析