当前位置: 首页 > news >正文

【Arthas】火焰图优化应用CPU(问题原因:获取调用栈)

优化场景总结归纳

1. 问题背景
  • 现象:在公共搜索功能中,火焰图分析发现 获取Java调用栈(StackTrace 占用了约 6%的CPU(日常流量下),系统高负载时占比更高。
  • 原因
    • 每次外部API调用时,代码会 主动获取当前调用栈(如 Thread.currentThread().getStackTrace()),目的是记录调用来源,便于日志排查。
    • 获取调用栈的操作本身比HSF调用更耗时,成为性能瓶颈。
2. 优化方案
  • 根本原因获取调用栈是同步阻塞操作,涉及JVM遍历线程栈帧,性能开销大(尤其在频繁调用的场景)。
  • 优化措施
    1. 移除冗余的调用栈获取逻辑
      • 原代码在日志中记录调用来源,但实际可通过其他方式实现(如HSF Filter)。
    2. 改用HSF Filter机制
      • HSF本身支持 Filter链,可在调用前后注入逻辑,无需手动获取调用栈。
      • 通过Filter记录调用信息(如来源服务、方法名等),避免性能损耗。
3. 优化收益
  • CPU占用下降:消除6%的额外开销,高流量时收益更显著。
  • HSF调用耗时降低:减少不必要的同步阻塞操作,提升整体吞吐量。
  • 代码可维护性提升
    • 调用栈逻辑与业务解耦,通过Filter统一管理。
    • 日志排查仍可通过HSF上下文(如RPC Context)获取关键信息,无需侵入式代码。
4. 适用场景

此类优化适用于以下情况:

  • 高频调用链路的性能敏感代码(如RPC框架、中间件核心逻辑)。
  • 依赖调用栈分析的场景(如日志、监控、链路追踪),但需权衡性能与可观测性。
  • 存在更高效的替代方案(如框架原生支持上下文传递,避免手动获取栈信息)。
5. 经验总结
  • 避免在关键路径调用 getStackTrace
    • 此操作在Java中属于 重操作,尤其在深调用栈或高并发场景下。
  • 优先使用框架提供的上下文机制
    • 如HSF Filter、RPC Context、ThreadLocal等,避免重复计算。
  • 火焰图(Flame Graph)是性能分析的利器
    • 能直观定位CPU热点,帮助发现隐藏的性能问题(如本案例中的调用栈开销)。
6. 后续建议
  • 监控优化效果:对比优化前后的CPU占用、HSF调用耗时等指标。
  • 推广类似优化模式:检查其他场景是否也存在冗余的调用栈获取逻辑(如日志组件、AOP拦截器等)。
http://www.dtcms.com/a/170184.html

相关文章:

  • sonar-scanner在扫描JAVA项目时为什么需要感知.class文件
  • FPGA DDR4多通道管理控制器设计
  • 影楼精修-露齿笑算法解析
  • Python Cookbook-6.18 用__init__参数自动初始化实例变量
  • Pillow 玩图术:轻松获取图片尺寸和颜色模式
  • python进阶(1)字符串
  • Vue中的过滤器知道多少?从是什么、怎么用、应用场景、原理分析、示例解释
  • luaopen系列标准库使用解析
  • 生成式 AI 与 AI 的区别
  • 第12章:精神力的禁忌边界
  • 办公文档全能处理工具功能解析
  • C语言奇幻指南:宏、头文件与变量的秘密世界
  • Java 中如何实现自定义类加载器,应用场景是什么?
  • python中的异常处理
  • 【关于LM311实现过零比较器输出波形】2022-9-27
  • C++【内存管理】
  • 二、机器学习中Python变量基础
  • OpenharmonyOS+RK3568,【编译烧录】
  • 动态规划-1137.第N个泰波那契数-力扣(LeetCode)
  • 启发式算法-蚁群算法
  • <property name=“userDao“ ref=“userDaoBean“/> 这两个的作用和语法
  • 第15章 对API的身份验证和授权
  • MySQL 空值处理函数对比:IFNULL、COALESCE 和 NULLIF
  • 基于Vue2 + Element 实现任务列表管理功能的详细教程
  • 用Maven定位和解决依赖冲突
  • Dart和Go语言特征对比
  • KeyPresser 一款自动化按键工具
  • 用Suno V4.5试了一下1850字的歌词进行创作出来了6分钟的歌曲
  • 计算机视觉与深度学习 | 视觉里程计算法综述(传统+深度)
  • 计算机视觉与深度学习 | 什么是图像金字塔?