Arthas性能测试调优实践

Posted 非功能测试小助手

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Arthas性能测试调优实践相关的知识,希望对你有一定的参考价值。

近期,在对某Java类应用系统性能测试时,发现应用服务器CPU利用率接近100%,并且系统长时间运行还存在内存泄露的情况,我们利用Arthas工具进行了问题代码定位分析,达到了较好的优化效果,过程如下:

性能问题一

问题描述:在混合压力测试场景中,发现应用服务器CPU使用率接近100%。

问题分析:通过TOP查看进程CPU利用率,发现java进程占CPU较高。经分析,Java应用程序中某代码模块存在性能问题。

问题挖掘过程:

1、 查看Java进程id,记录PID为6193

2、 启动arthas,对6193进程进行跟踪,执行dashboard命令查看占用CPU高的线程。

​Arthas性能测试调优实践

3、 执行Thread -n 3命令将占用资源最高的前三个线程的堆栈信息打印出来,通过这三个线程的堆栈信息得到,代码中某类的diedCycle()方法占用CPU资源较高

​Arthas性能测试调优实践

4、 执行jad命令对某类进行反编译,得到出现问题的源代码,通过代码分析,发现这段代码死循环一直占用系统资源,在使用过程中并没有释放这些资源,最终导致服务器CPU利用率100%。

​Arthas性能测试调优实践

​Arthas性能测试调优实践

解决方法:删除diedCycle()方法,经验证,问题解决。

 

性能问题二

问题描述:在稳定性测试过程中,通过查看应用日志发现OutOfMemoryError”报错信息。如下图

​Arthas性能测试调优实践

问题分析:经分析,jvm内存不足,程序代码HashMap或ArrayList对象某代码出现书写缺陷。

问题挖掘过程:

1、启动arthas,执行dashboard查看堆内存和GC使用情况。发现程序持续产生多次FULL GC,且每次FULL GC后并没有清理出垃圾对象,导致老年代的堆内存持续增高。

​Arthas性能测试调优实践

​Arthas性能测试调优实践

2、执行heapdump生成堆存储文件

​Arthas性能测试调优实践

3、对dump文件进行分析,发现main()异常线程 

4、执行Jad命令查看源代码,程序不断的生成字节数组,并将字节数组存储到list容器中死循环导致list容器占用的堆内存持续增长,最终导致无堆内存可用报错OutOfMemoryError 

​Arthas性能测试调优实践

解决办法:对main()函数进行优化。经验证,问题解决。

本次性能调优采用阿里开源的Arthas工具进行监控的,它是一款开源在线Java诊断工具,采用命令行交互模式,支持Linux /Windows,同时提供丰富的Tab自动补全功能方便进行问题的定位和诊断

​Arthas性能测试调优实践

 

Arthas是一个java程序通过命令java -jar arthas-boot.jar启动。

​Arthas性能测试调优实践

举例:

输入dashboard指令进入系统性能全局监控,显示当前系统的实时数据面板(线程、内存、GC、运行信息

以上是关于Arthas性能测试调优实践的主要内容,如果未能解决你的问题,请参考以下文章

系统性能测试的结论

Go语言使用gorm对MySQL进行性能测试

研究实践 | 数据库防火墙系统性能测试参考

使用LoadRunner怎么进行性能测试

为什么要做性能测试?这些步骤内容你必须知道!

性能测试分析优化的方法论 | 运维进阶