什么是代码热点
代码热点是一种监控诊断工具,通过持续剖析技术定时采集请求线程堆栈快照。
如何采集线程堆栈快照
Arthas 是一款开源的线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
profiler 是 Arthas 的其中一个命令,使用profiler能采集线程堆栈快照,通过不断的采样,最后收集到的结果生成应用热点的火焰图。
profiler 命令支持一下几种分析场景:
-
cpu
-
alloc
-
lock
-
wall
我们利用的是wall的分析能力
-
wall time:进程起止所耗墙上时钟时间,也叫real time
进程从开始执行到完成,所经历的墙上时钟时间(实际时间),包括其他进程使用的时间片(time slice)和本进程耗费在阻塞(如等待I/O操作完成)上的时间。
如何触发代码热点功能
1、需要先开启代码热点功能开关
2、设置慢请求阈值。
为了降低系统开销,对于低耗时的请求(未达到慢请求阈值),不会触发代码热点数据统计。javaagent会针对上一周期的采集结果,针对慢请求的接口会自动执行热点代码数据统计。具体命令如样例如下:
profiler -e wall -d 30 -f ./wall_output/user.controller.html --include '*user.controller*'
最终会在指定目录生成一份火焰图的html文件
javaagent定时读取wall_output下面的文件,把火焰图的数据提取出来最终存到byconity,存储表字段如下:
-
serviceName
-
timestamp(分钟级别)
-
javaMethod
-
data (火焰图数据)
如何关联调用链
在触发热点代码统计的时间段内,所有span都带上wall-clock这个属性,属性值设置为1。前端能根据服务名、javaMethod、触发时间匹配到对应的火焰图数据。
其中有个关键点:火焰图里面只有具体的java方法,没有接口。因此只能用方法名去匹配。