JAVA应用压测性能问题的分析思路框架,也是一个决策图

2022-06-13  本文已影响0人  robot_test_boy

转载阿里巴巴云原生的JAVA应用压测性能问题定位经验分享

性能问题背景

将性能问题分为两类:资源维度和频率维度。资源维度类的问题:CPU 冲高,内存使用不当,网络过载。频率维度类的问题:交易持续性缓慢,交易偶发性缓慢。

对于每一类问题都有相应的解决办法,方法或者工具使用不当,会导致不能快速而且精准地排查定位问题。

压测性能问题定位调优是一门需要多方面综合能力结合的一种技术工作,需要凭借个人的技术能力、经验、有时候还需要一些直觉和灵感,还需要一定的沟通能力,因为有时候问题并不是由定位问题的人发现的,所以需要通过不断地沟通来发现一些蛛丝马迹。涉及的技术知识面远不仅限于程序语言本身,还可能需要扎实的技术基本功,比如操作系统原理、网络、编译原理、JVM 等知识,决不只是简单的了解,而是真正的掌握,比如 TCP/IP,必须得深入掌握。JVM 得深入掌握内存组成,内存模型,深入掌握 GC 的一些算法等。这也是一些初中级技术人员在一遇到性能问题就傻眼,完全不知道如何从哪里下手。如果拥有扎实的技术基本功,再加上一些实战经验然后形成一套属于自己的打法,在遇到问题后才能心中不乱,快速拨开迷雾,最终找到问题的症结。

分析思路框架,也是一个决策图

遇到一个性能问题,首先要从各种表象和一些简单工具将问题进行定义和分类,然后再做进一步的定位分析,可以参考一下图 1 作者总结出来的一个决策图,这张图是笔者从近几个金融行业 ToB 项目中做性能定位调优过程的一个总结提练,不一定适合所有的问题,但至少覆盖到了近几个项目中遇到的性能问题的排查过程。在接下来的大篇幅中将对每一类问题进行展开,并附上一些真实的经典案例,这些案例都是真真实实发生的,有一定的代表性,且很多都是客户定位了很长时间都没发现问题根本原因的问题。其中 GC 类问题在此文不做过多分析,对于 GC 这一类问题后续有空写一篇专门的文章来进行展开。

常见场景介绍:内存溢出

内存溢出问题按照问题发生频率又可进一步分为堆内存溢出、栈内存溢出、Metaspace 内存溢出以及 Native 内存溢出,下面对每种溢出情况进行详细分析。

堆内存溢出(OutOfMemoryError)

应用申请的堆内存超过了 Xmx 参数设置的值,进而导致 JVM 基本处于一个不可用的状态。代码运行时设置堆大小为 1MB,运行后结果抛出了一个 OutOfMemoryError 的错误异常,相应的Message是Java heap space,代表溢出的部分是堆内存。

栈内存溢出(StackOverflowError)

这类问题主要是由于方法调用深度太深,或者不正确的递归方法调用,又或者是 Xss 参数设置不当。一个简单的无限递归调用引发栈内存溢出,抛一个 StackOverflowError的错误异常。Xss 参数可以设置每个线程栈内存最大大小,JDK8 的默认大小为 1MB,正常情况下一般不需要去修改该参数,如果遇到StackOverflowError的报错,那么就需要留意了,需要查证是程序的问题还是参数设置的问题,如果确实是方法调用深度很深,默认的 1MB 不够用,那么就需要调高 Xss 参数。

Native内存溢出(堆外内存,OutOfMemoryError,Message是Direct buffer memory)

这种溢出发生在 JVM 使用堆外内存时,超过一个进程所支持的最大内存上限,或者堆外内存超过MaxDirectMemorySize 参数指定的值。需要配置 MaxDirectMemorySize 参数,如果不配置这个参数估计很难模拟出这个问题,作者的机器是 64 位的,堆外内存的大小可想而知了。运行该程序抛出来的异常也是 OutOfMemoryError,这个跟堆内存异常类似,但是Message是 Direct buffer memory,这个跟堆内存溢出的 Message 是不一样的,请特别留意这条 Message,这对精准定位问题是非常重要的。

Metaspace内存溢出(OutOfMemoryError,Message是Metaspace)

Metaspace 是在 JDK8 中才出现的,之前的版本中都叫 Perm 空间,大概用途都相差不大。通过cglib不断动态创建类并加载到 JVM,这些类信息保存在 Metaspace 内存里面的,在这里为了快速模拟出问题,将 MaxMetaspaceSize 设置为 10MB。执行结果依然是抛出 OutOfMemoryError 的错误异常,但是 Message变成了Metaspace。

JVM 的内存溢出最常见的就这四种,如果能知道每一种内存溢出出现的原因,那么就能快速而精准地进行定位。

总结

问题千千万,但只要修练了足够深厚的内功,形成一套属于自己的排查问题思路和打法,再加上一套支撑问题排查的工具,凭借已有的经验还有偶发到来的那一丝丝灵感,相信所有的问题都会迎刃而解。

上一篇下一篇

猜你喜欢

热点阅读