资深测试老鸟,性能测试-线程死锁分析定位+Jprofiler分析CPU(详细)
目录:导读
前言
1、线程死锁问题分析和定位
死锁的根本原因:
存在嵌套加锁;
多个线程之间加锁(锁定对象资源)的顺序不一致;
1)死锁的概念:有2个线程、一个线程锁住了资源A、又想去锁定资源B、另外一个线程锁定了资源B、又想去锁定资源A、2个线程都想去得到对方的资源、而又不愿释放自己的的资源、从而造成了一种互相等待3、无法执行的情况
2)这个时候可以用jvisualvm或者jstack命令对线程进行dump
3)jstack 进程号 > a.log 然后在本地打开a.log 在日志的最底部发现有2个http开头的线程
4)找到 Found one Java-level deadlock: 就是找到了一个Java级别的死锁、可以看到一个线程想要锁定某个对象但是被另外一个线程锁定了
而另外一个线程想要锁定的对象被第一个线程锁定了、并且都相互没有释放
5)线程死锁之后现象:TPS几乎为0、压力测试工具无法得到服务器的响应、服务器硬件的资源CPU和内存 IO等等都是非常空闲的、通过jvisualvm查看线程发现至少有2个线程一直处于红色的阻塞状态、死锁一般都是表现为程序停顿。
6)在查看报错的时候发现是CaseController这个类报错了、然后去看一下Java代码、发现代码里面一个锁synchronized里面又嵌套了另外一个锁
然后分析里面的代码发现、是通过random方法获取0-5之间的随机数、当随机数为0的时候拿到的对象为1和2、当随机数为3的时候、拿到的对象为1和1

7)解决的办法:
避免嵌套的加锁;
减少锁粒度 ==》就是不加Thread.sleep() 或者减少代码的量也能减少死锁 ==》一般都是概率性的问题;
2、Jprofiler分析CPU消耗过高问题
1)压测的时候发现、应用服务器的CPU使用率比较高、通常大于80%
2)分2种情况:
第一种:接口性能好、比如响应时间小于10毫秒、此时CPU使用率高是正常的不需要优化
第二种:接口性能不好、比如响应时间大于200毫秒、tps也很低、此时需要优化
3)CPU如果消耗过高可能导致的原因有:
使用了比较复杂的算法、比如加密和解密的算法
压缩和解压还有序列化的一些操作
代码bug比如一些死循环之类的
4)在Linux启动压测jmeter -n -t test.jmx选择启用调度器、选择30并发、压测300秒钟 然后通过dstat - tcmnd --disk-util命令进行监控
5)tps达到7000/sec的时候、32核的CPU居然使用了30%
6)所以把jprofiler.rpm文件上传到服务器、进行安装、然后在Tomcat/bin/catalina.out配置jvm的参数添加-agentpath:/opt/jprofiler11/bin/linux-x86/ilbjprofilerti.so=port=8849,nowait
7)客户端把jprofiler的EXE文件安装一下 ==》在注册机用license码
8)客户端连接服务器==》start center==》new session==》new remote intergration新建远程集成==》on a remote computer ==》Linux X86
==》oracle 1.8=》64位默认选择=》然后输入IP地址
9)Switch sampling==》性能消耗低一些
10)jprofiler可以对jvm、CPU、memory、堆heap Walker和栈、threads线程、锁、数据库都可以进行监控
11)CPU views ==》call tree能显示调用关系看出最底层是哪个方法消耗CPU最高 ==》hot Spots热点方法可以直接显示哪个方法消耗CPU最高
12)谷歌的gson里面进行序列化、对象转换为JSON的时候性能不太好 ==》可以替换为fastJSON性能会好很多
13)阿里巴巴的fastJSON在进行JSON转换的时候是性能最好的
14)代码实践:
当前端调用接口传入value值为1的时候调用Gjson.json进行转换
单前端调用接口传入value值为2的时候调用JSON.toJsonString转换
15)所以在前端调用接口传入为2然后看看CPU的消耗会是怎样? ==》更换之后tps达到了1.6万/sec整整提升了大概9000/sec 、然而CPU的占用只有20%、CPU的消耗降低了但是tps却反而提升了
16)所以一个小小的JSON转换在性能方面却有不同的表现
完整版!企业级性能测试实战,速通Jmeter性能测试到分布式集群压测教程
| 下面是我整理的2026年最全的软件测试工程师学习知识架构体系图 |
一、Python编程入门到精通

二、接口自动化项目实战

三、Web自动化项目实战

四、App自动化项目实战

五、一线大厂简历

六、测试开发DevOps体系

七、常用自动化测试工具

八、JMeter性能测试

九、总结(尾部小惊喜)
人生最精彩的不是实现梦想的瞬间,而是追梦路上那个永不言弃的自己。那些看似遥不可及的目标,终会在你日复一日的坚持中触手可及。别怕慢,怕的是停下;别怕难,怕的是放弃!
你比自己想象的更强大!每个挫折都是成长的契机,每次坚持都在改写命运的轨迹。当别人选择放弃时,你的执着就是胜利的开始。向前奔跑吧,整个世界都会为追光者让路!
更多推荐
所有评论(0)