性能定位的一些方法

问题背景:

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,且内存回收正常(如下图);

posted @ 2018-04-23 14:40  澄心  阅读(240)  评论(0编辑  收藏  举报