问题背景:
Tps约50左右,10线程与50线程压测tps一致,只响应时间不断增加,数据库服务器资源占用较低,而应用服务器cpu维持在一定值之后随着并发数增加,cpu不再增高,凭经验判断,应该跟代码实现有关;
所以直接找引发问题的代码;
快速手段如下:
使用top命令查看当前进程的资源占用情况,通过下图我们看到PID为4501的进程为java的主要活动进程
使用top –Hp 4501来查看-H 显示线程 -p 指定pid 如果执行上述命令之后,发现还是只有一行,那么按下 shift+h, 即可显示线程占用资源情况,此处占用CPU最高的线程的PPID是15894
扑捉到线程后,需jstack跟踪,此时线程号转化为16进制,
使用命令 jstack 4501 |grep -i 3e16 来查询进程详细信息
此时与开发沟通,在代码实现中,在合并账户加锁,在并发中,导致大量线程等待,后来通过锁账户改成锁收据单,锁粒度降低,改完后,重新测试,tps达到300,随着并发数增加,cpu资源升高,根据硬件消耗与tps对比,达到正常;
在举一例
定时任务,执行时间过长;
经过监控,内存瞬间达到极致,回收缓慢,程序卡顿严重,通过jmap(上述类似方法,也可以jvisual)追踪代码,某方法再一次执行中提交大量数据,后经与开发讨论修改数据量,并反复压测验证,达到最优配置,从原来的20min执行时间缩短为2min,且内存回收正常(如下图);