使用 Arthas 排查高 CPU 使用率问题

news/2025/3/14 16:15:50/文章来源:https://www.cnblogs.com/aioe/p/18772303

Arthas (阿尔萨斯) 是一个非常强大的 Java 在线诊断工具,特别适合在生产环境中排查问题。 它可以让你在不重启应用的情况下,动态地观察和修改 Java 应用程序的行为。 以下是如何使用 Arthas 来排查高 CPU 使用率问题的步骤,并说明各种命令的用途:

1. 安装和启动 Arthas:

  • 下载 Arthas:
    wget https://arthas.aliyun.com/arthas-boot.jar
    
  • 启动 Arthas:
    java -jar arthas-boot.jar
    
  • 选择要诊断的 Java 进程。 Arthas 会列出当前正在运行的 Java 进程,选择目标进程的编号。

2. 使用 dashboard 命令查看系统信息和线程状态:

  • 输入 dashboard 命令,Arthas 会显示一个实时更新的仪表盘,包含:

    • 系统信息 (CPU, Memory, Load Average)
    • JVM 信息 (GC, Thread)
    • 线程信息 (ID, Name, State, CPU%, TIME)
  • 观察线程信息,找到 CPU 使用率最高的线程 ID (NID)。 dashboard 命令会动态更新,方便你快速找到占用 CPU 最高的线程。

3. 使用 thread 命令查看线程堆栈信息:

  • 输入 thread <NID> 命令,其中 <NID> 是你在 dashboard 中找到的 CPU 使用率最高的线程的 Native ID。 例如:

    thread 21
    

    这会打印出该线程的堆栈信息。 堆栈信息显示了线程当前正在执行的代码路径。

  • 分析堆栈信息,找出导致高 CPU 使用率的代码。 常见的嫌疑对象包括:

    • 无限循环: 检查是否有任何循环没有正确的退出条件。
    • 正则表达式: 复杂的正则表达式可能会导致 CPU 使用率飙升。
    • I/O 操作: 频繁的磁盘或网络 I/O 操作也可能导致问题。
    • 计算密集型操作: 复杂的算法或计算可能会占用大量 CPU 资源。

4. 使用 trace 命令追踪方法执行耗时:

  • trace 命令可以追踪指定方法的执行耗时,帮助你找到性能瓶颈。

  • 语法:

    trace <class name> <method name>
    
  • 例如,假设你在线程堆栈中发现 com.example.MyClass.processData() 方法可能存在问题,可以使用以下命令追踪该方法的执行耗时:

    trace com.example.MyClass processData
    
  • Arthas 会打印出每次调用 processData() 方法的耗时。 如果发现某个方法的耗时特别长,则很可能是性能瓶颈所在。

5. 使用 watch 命令观察方法参数和返回值:

  • watch 命令可以观察指定方法的参数和返回值,帮助你理解方法的行为。

  • 语法:

    watch <class name> <method name> "{params,returnObj}"
    
  • 例如,继续使用上面的例子,可以使用以下命令观察 processData() 方法的参数和返回值:

    watch com.example.MyClass processData "{params,returnObj}"
    
  • Arthas 会打印出每次调用 processData() 方法的参数和返回值。 这可以帮助你了解方法的输入和输出,从而更好地理解方法的行为。

6. 使用 profiler 命令进行 CPU 火焰图分析:

  • profiler 命令可以生成 CPU 火焰图,帮助你更直观地了解 CPU 的使用情况。

  • 启动 profiler:

    profiler start
    
  • 运行一段时间后,停止 profiler:

    profiler stop
    
  • Arthas 会生成一个 HTML 文件,其中包含 CPU 火焰图。 在浏览器中打开该 HTML 文件,就可以看到 CPU 的使用情况。

  • 火焰图的每一层代表一个函数调用,火焰越宽表示该函数占用的 CPU 时间越多。 通过火焰图,可以快速找到占用 CPU 最多的函数。

7. 使用 tt 命令记录和回放方法调用:

  • tt 命令 (Time Tunnel) 可以记录指定方法的调用,并在之后回放这些调用。 这可以帮助你重现问题,并进行更深入的分析。

  • 语法:

    tt -t <class name> <method name>
    
  • 例如:

    tt -t com.example.MyClass processData
    
  • 这会记录 processData() 方法的所有调用。 记录完成后,可以使用 tt -l 命令列出所有记录的调用,并使用 tt -i <index> 命令回放指定的调用。

排查示例:

  1. 使用 dashboard 找到 CPU 使用率最高的线程 (例如,NID 为 21)。
  2. 使用 thread 21 查看该线程的堆栈信息。 发现线程正在执行 com.example.MyClass.processData() 方法。
  3. 使用 trace com.example.MyClass processData 追踪 processData() 方法的执行耗时。 发现该方法的执行耗时非常长。
  4. 使用 watch com.example.MyClass processData "{params,returnObj}" 观察 processData() 方法的参数和返回值。 发现该方法接收的参数数据量非常大,导致执行缓慢。
  5. 使用 profiler startprofiler stop 命令生成 CPU 火焰图,并在浏览器中打开火焰图。 火焰图显示 processData() 方法及其调用的子方法占用了大量的 CPU 时间。

根据以上信息,可以判断 processData() 方法是性能瓶颈所在。 接下来,可以优化该方法的代码,例如减少数据量、使用更高效的算法等。

总结:

Arthas 提供了丰富的命令,可以帮助你从多个角度分析 Java 应用程序的性能问题。 熟练掌握这些命令,可以让你在生产环境中快速定位和解决问题。 记住,Arthas 是一个强大的工具,但也要谨慎使用,避免对生产环境造成不必要的影响。 在进行任何操作之前,请务必了解该操作的含义和潜在风险。 推荐优先在测试环境中进行验证。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/898714.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我的博客开启啦

由于微信访问限制,请长按识别下方二维码跳转下载

FastAPI复杂查询终极指南:告别if-else的现代化过滤架构

title: FastAPI复杂查询终极指南:告别if-else的现代化过滤架构 date: 2025/3/14 updated: 2025/3/14 author: cmdragon excerpt: 本文系统讲解FastAPI中复杂查询条件的构建方法,涵盖参数验证、动态过滤、安全防护等18个核心技术点。通过引入策略模式、声明式编程等技术,彻…

基于Ollama本地部署DeepSeek-r1:7b大语言模型

1、概述随着人工智能技术的飞速发展,越来越多的开发者和企业开始关注大语言模型(LLM)。这些模型以其强大的自然语言处理能力,在文本生成、问答、翻译、分类等多种任务中表现出色。然而,在实际使用中,许多人会遇到如何快速且高效地部署这些模型的问题。本文将介绍如何通过…

web116笔记(misc+lfi)

访问题目是一个视频,源码也没有什么有用信息 提示:misc+lfi 下载视频,使用 010editor 打开,发现存在 png 图片的数据,搜索另存为 过滤了蛮多的,不过没有过滤flag ,也没有过滤 filter 尝试构造语句?file=php://filter/resource=flag.php (直接读取) 如果没有设置 fil…

具身智能

Topic I: 3D VIsion Topic II: Robotics Topic IV: Reinforcement learning Linear Algebra Vector Space 向量空间Linear Combination 线性组合\(w=a_1v_1+a_2v_2+...+a_nv_n=\sum_i a_iv_i\)Span of Vectors\(v_i \in V_m\), \(w \in V_m\)Infinite-Ddimensional Vector Spac…

python的jieba

jieba 是一个广泛使用的 Python 中文分词库,主要用于将中文文本切分成独立的词语。 https://github.com/fxsjy/jieba 安装pip install jieba使用 (1)分词import jieba # 分词 text = "我爱自然语言处理" words = jieba.cut(text, cut_all=False) # 精确模式 prin…

3. 创建一个菜单组件-DeepSeek辅助编程

在deepseek中输入: 创建一个vue组件 组件实现菜单的功能 需要让调用该组件是可以自定义一些属性:mode:horizontal横向显示/vertical纵向显示,background-color,text-color,active-text-color,model:通过该model绑定菜单/model为MenuItem的数组 MenuItem由这些参数构成:inde…

微信支付相关配置

公众号相关配置 地址:https://mp.weixin.qq.com/一、获取用户openid相关配置 二、获取开发者ID(AppID)/开发者密码(AppSecret) 微信支付相关配置 地址:https://pay.weixin.qq.com/需要先申请开通支付产品微信支付相关参数获取: 一:获取商户号(商户号mach_id)三、获取证书…

华为开发者空间:基于DeepSeek+Cherry Studio构建模拟面试助手

通过实际操作,让开发者熟悉如何通过云主机部署DeepSeek,以及如何将DeepSeek与Cherry Studio结合起来帮助我们解决一些实际的问题。本文分享自华为云社区《华为开发者空间:基于DeepSeek+Cherry Studio构建模拟面试助手》,作者:开发者空间小蜜蜂。 1 案例介绍 CherryStudio …

​信创环境元宇宙应用:3种虚拟团队管理工具前瞻测评

随着信息技术的不断发展,信创环境下的元宇宙应用正逐渐成为各行业关注的焦点。在这个虚拟的世界中,虚拟团队的管理变得至关重要。本文将对三种虚拟团队管理工具进行前瞻测评,探讨它们在信创环境元宇宙应用中的优势和潜在挑战。 信创国产化项目管理解决方案 禅道是一款国产的…

VSCode+Linux+GCC编译运行数据结构的C语言程序集

背景 学习数据结构,写了很多C语言程序,这些C语言程序都保存在一个Git仓库中,以章节、实验内容为目录存放,形如:之前一直是通过gcc命令手动编译、运行,但随着程序逐渐复杂,希望简化构建过程,做到一键编译运行,同时支持断点调试。 环境VSCode,安装了C/C++扩展 Linux GC…