在日常工作中,应用出现性能问题是不可避免的,绝大部分公司都没有专门的性能团队,出现问题还是需要我们自己去排查处理,所以掌握基本的性能知识和技能就显得很有必要,也是开发工程师进阶的必要条件,能否快准狠的定位解决问题,也是对知识、技能和能力的检验。
今天我们来讨论的问题是,服务出现明显的变慢,该如何诊断处理?
首先我们要确定服务是突然变慢还运行一段时间后观察到变慢?类似的变慢是经常出现还是偶发的?还有对慢的定义是什么?是否可以理解为系统对其他方面的请求的延时变长?
在理清楚问题的症状后,更有利于分析问题的具体原因,大概有以下思路:
接下来我们来了解一下业内广泛的性能分析方法论。方法论总结为两类:
我们重点看第一种,自上而下。各个阶段的思路以及使用的工具等。
分析系统的性能,我们常从CPU、内存和IO等入手,这几点是重点关注项。对于CPU,如果是Linux环境,可以先用top命令查看负载情况:
可以看到,平均负载的三个值并不高,也没有升高的迹象,可以先不特别关注,接下来分析最耗费CPU的Java线程,步骤如下:
-H
代表thread模式,也可以配合grep命令更精确定位。top -H
printf "%x" your_pid
vmstat -1 -20
如果上下文切换非常高,并且系统中高很多,就表明可能存在不合理的线程调度导致的,可以用pidstat进一步分析定位。
除了CPU,内存和IO也有很多注意事项: