简介
在系统性能监控方法上,Skywalking 提出了代码级性能剖析这种在线诊断方法。这种方法基于一个高级语言编程模型共性,即使再复杂的系统,再复杂的业务逻辑,都是基于线程去进行执行的,而且多数逻辑是在单个线程状态下执行的。
代码级性能剖析就是利用方法栈快照,并对方法执行情况进行分析和汇总。并结合有限的分布式追踪 span 上下文,对代码执行速度进行估算。
优势
- 精确的问题定位,直接到代码方法和代码行
- 无需反复的增删埋点,大大减少了人力开发成本
- 不用承担过多埋点对目标系统和监控系统的压力和性能风险
- 按需使用,平时对系统无消耗,使用时的消耗稳定可能
执行流程:
agent端每隔20秒向服务端发起请求,来向服务端询问本agent是否有分析任务,如果接受到这个任务之后,就会在当前时间或者将来的某个时间开始监控操作。在服务端如果已经感知到agent端已经知道这个任务的时候,在profile页面的任务详情中,点开任务详情的页面,在弹出框的下方会展示一条日志:包括:实例信息、操作类型、操作时间等。
使用步骤
使用工程
Live-Demo 工程中 projectB 项目
修改 DatabaseOperateDao#selectUser 方法,设置一个4s的睡眠
在skywalking中新建任务
监控 /projectB/1234 端点,持续5分钟
需要注意的点
- 一个服务在监控持续时间内只能设置一个端点监控任务
源码逻辑入口
org.apache.skywalking.oap.server.core.profile.ProfileTaskMutationService``#checkDataSuccess
- 剖析端点的响应时间必须大于监控间隔时间
由于性能栈快照有一定的性能消耗,所以采集周期不宜过密,SkyWalking 目前不支持小于 10ms 的采集间隔。所以如果问题方法执行时间小于 10ms,此方法并不适用。同时剖析端点的响应速度如果小于监控时间间隔,也无法进行监控采集。
发送请求
curl http://localhost:8764/projectB/1234
查看剖析结果
上图所示的就是链路追踪时的真实执行情况,表格中从左到右分别展示了方法名、开始时间、执行时长、执行时间占比、API类型、服务名和跨度信息。其中可以看到前面设置了4s睡眠的 selectUser 方法执行速度最慢。再点击分析按钮,可以查看对应方法的调用栈。
从左右到右分别展示了栈帧名称、该栈帧总计耗时(包含其下面所有自栈帧)、当前栈帧自身耗时和监控次数
继续向下查找可以发现 selectUser 的栈桢信息,从这里可以看到方法是真正卡在了线程睡眠逻辑中
参考:https://blog.csdn.net/wb4927598/article/details/119192538