当前位置: 首页 > 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拦截器等)。

相关文章:

  • 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)
  • 启发式算法-蚁群算法
  • 印度扩大对巴措施:封锁巴基斯坦名人账号、热门影像平台
  • 马斯克的“星舰基地”成为新城镇,首任市长为SpaceX员工
  • 五年来首次!香港金管局斥资465.39亿港元购买美元
  • 贵州赤水丹霞大瀑布附近山体塌方车辆被埋,景区:无伤亡,道路已恢复
  • 山东一景区怕游客赶不到海撒三千斤蛤蜊:给游客提供情绪价值
  • 特朗普宣布提名迈克·沃尔兹为下一任美国驻联合国大使