#Apache#在线代码级性能剖析,补全分布式追踪的最后一块“短板”( 二 )
本文插图
【#Apache#在线代码级性能剖析,补全分布式追踪的最后一块“短板”】
在上图中 , d0-d10 代表 10 次连续的内存栈快照 , 实际方法执行时间在 d3-d4 区间 , 结束时间在 d8-d9 之间 。 性能剖析无法告诉你方法的准确执行时间 , 但是他会估算出方法执行时间为 d4-d8 的 4 个快照采集间隔时间之和 , 这已经是非常的精确的时间估算了 。
而这个过程因为不涉及代码埋点 , 所以自然性能消耗是稳定和可控的 , 也无需担心是否被埋点 , 是否是 JDK 方法等问题 。 同时 , 由于上层已经在分布式追踪之下 , 性能剖析方法可以明确地确定分析开始和结束时间 , 减少不必要的性能开销 。
性能剖析可以很好的对线程的堆栈信息进行监控 , 主要有以下几点优势:
- 精确的问题定位 , 直接到代码方法和代码行;
- 无需反复的增删埋点 , 大大减少了人力开发成本;
- 不用承担过多埋点对目标系统和监控系统的压力和性能风险;
- 按需使用 , 平时对系统无消耗 , 使用时的消耗稳定可能 。
final CountDownLatchcountDownLatch= new CountDownLatch(2);
threadPool.submit(new Task1(countDownLatch));
threadPool.submit(new Task2(countDownLatch));
try {
countDownLatch.await(500, TimeUnit.MILLISECONDS);
} catch (InterruptedExceptione) {
}
这是我们故意加入的问题代码 , 我们使用 CountDownLanth 设置了两个任务完成后方法执行结束 , Task1 和 Task2 是两个执行时间不稳定的任务 , 所以主任务也会执行速度不稳定 。 但对于运维和监控团队来说 , 很难定位到这个方法片段 。
针对于这种情况 , 我们看看性能剖析会怎样直接定位此问题 。
本文插图
上图所示的就是我们在进行链路追踪时所看到的真实执行情况 , 其中我们可以看到在 service/processWithThreadPool 执行速度缓慢 , 这正是我们植入问题代码的方法 。 此时在这个调用中没有后续链路了 , 所以并没有更细致的原因 , 我们也不打算去 review 代码 , 从而增加新埋点 。 这时 , 我们可以对 HelloService 进行性能剖析 , 并执行只剖析响应速度大于 500 毫秒的请求 。
注意 , 指定特定响应时间的剖析是保证剖析有效性的重要特性 , 如果方法在平均响应时间上已经出现问题 , 往往通过分布式链路可以快速定位 , 因为此时链路总时间长 , 新埋点带来的性能影响相对可控 。 但是方法性能抖动是不容易用新增埋点来解决的 , 而且往往只发生在生产环境 。
本文插图
上图就是我们进行性能剖析后的真实结果图 。 从左到右分别表示:栈帧名称、该栈帧总计耗时(包含其下面所有自栈帧)、当前栈帧自身耗时和监控次数 。 我们可以在最后一行看到 , 线程卡在了 sun.misc.Unsafe.park 中了 。 如果你熟悉 Java 就可以知道此时进行了锁等待 , 我们继续按照树的结构向上推 , 便可以看到线程真正是卡在了 CountDownLatch.await 方法中 。
方法局限性 当然任何的方法都不是万能的 , 性能剖析也有一些局限性 。
第一 ,对于高频反复执行的方法 , 如循环调用 , 可能会误报为缓慢方法 。 但这并不是大问题 , 因为如果反复执行的耗时较长 , 必然是系统需要关注的性能瓶颈 。
推荐阅读
- 『兄弟』兄弟DCP-T710W喷墨一体机评测:微信打作业 在线学习更简单
- 小度在线搞事情:帮别家回收旧产品还送小度智能屏!
- 和鲸携手在线公益AI项目,助力学习实训一体化
- 『zol中关村在线』什么是手持稳定器,有何分类?
- 【新华网】K12在线英语:走过风口,学着长大
- 【中金在线】有人退6000多,你呢?,史上首次!个税开始多退少补
- 『中关村在线』苹果官宣 美国Apple Store零售店关闭至5月
- 「福建闽南网」在哪设置在线时间和状态介绍,怎么关闭在线时间
- 游戏在线激情▲星耀玩后羿,王者呢?这个射手才是必备!带节奏完全没问题,钻石段位玩阿离
- 「睿报财经」资金净流入7.02亿元,紫光国微(股票代码:002049)强势涨停
