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

CPU飙升 怎么定位问题

传统的方法

【top】

查看所有进程占系统CPU的排序,定位是哪个进程搞的鬼。PID那一列就是进程号。

【top -Hp pid】

定位进程中使用 CPU 最高的线程tid

【printf ‘0x%x’ tid】

线程 tid 转化 16 进制,例如printf ‘0x%x’ 11882    得到16进制的   0x2e6a

【jstack pid | grep tid 】找到线程堆栈,例如jstack  11763 | grep 0x2e6a -A 30

查问题时,会要多次上面的操作以分析确定问题,这个过程太繁琐太慢了
期望整合上面的过程成一个脚本,这样一行命令就可以自动化地搞定。

脚本方法

【wget --no-check-certificate https://gitee.com/fightx/useful-scripts/raw/dev-2.x/bin/show-busy-java-threads】

这条命令使用wget工具从gitee下载一个名为show-busy-java-threads的脚本文件。--no-check-certificate选项表示不检查SSL证书的有效性,这在某些情况下可能是必要的,但通常不推荐使用,因为它可能会导致安全风险。

【head -n 10 show-busy-java-threads】

检查下载下来的内容是否是脚本

【chmod +x show-busy-java-threads】

这条命令使用chmod工具赋予刚刚下载的show-busy-java-threads脚本可执行权限,使得它可以在命令行中直接运行。

【./show-busy-java-threads】

这条命令执行刚刚下载并赋予可执行权限的show-busy-java-threads脚本。这个脚本的作用是查找并显示系统中正在运行的Java进程中占用CPU资源最多的前5个线程。

分析步骤

  1. 识别高CPU消耗线程

    • 查看输出中每个线程的CPU占用百分比(例如,Busy(98.2%))。

    • 高CPU消耗的线程通常是性能瓶颈的潜在来源。

  2. 查看线程ID和名称

    • 每个线程都有一个线程ID(例如,29385)和名称(例如,"main")。

    • 这些信息有助于你识别具体的线程。

  3. 分析线程状态

    • 查看线程状态(例如,RUNNABLETIMED_WAITING)。

    • RUNNABLE状态表示线程正在运行或准备运行,而TIMED_WAITING状态表示线程在等待某个条件。

  4. 检查线程堆栈

    • 查看线程堆栈跟踪(例如,at com.example.MyClass.busyMethod(MyClass.java:42))。

    • 堆栈跟踪显示了线程当前执行的方法和代码行,有助于定位问题代码。

  5. 定位问题代码

    • 根据堆栈跟踪信息,找到具体的Java类和方法。

    • 检查这些方法的实现,看看是否有优化的空间或潜在的性能问题。

  6. 更多用法参照:docs/java.md · fightx/useful-scripts - Gitee.com

阿里开源方法

【curl -O https://arthas.aliyun.com/arthas-boot.jar】

 下载jar包

【java -jar arthas-boot.jar】

启用

在启动Arthas时,它会列出当前系统中正在运行的Java进程,并要求你选择一个进程进行监控。你需要输入进程的序列号(例如,输入1选择第一个进程),然后按回车键。

【thread -n 5】

进一步分析【thread id】

如果你发现某些线程的CPU使用率异常高,可以进一步分析这些线程的堆栈跟踪,以确定具体的性能瓶颈。例如,你可以使用以下命令来查看特定线程的堆栈跟踪:

其他命令参考官网:arthas: Arthas(阿尔萨斯)是阿里巴巴开源的 Java 诊断工具

点赞收藏加关注

下一期创作内容:通过上述步骤,找出有问题的代码之后,观察到线程栈之后。怎么根据具体问题来具体分析

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • nginx代理转发如何配置
  • MySQL(SQL函数)
  • 适配器模式, 修饰器模式 与 代理模式
  • 三层switch转一层switch的处理方法
  • 大数据基础
  • C++第八章:多态性
  • 完美解决html2canvas + jsPDF导出pdf分页内容截断问题
  • 【产品经理】定价策略
  • DotPlot 的宽高自动设置 | 线性拟合
  • 英语写作中“传统的”traditional conventional 的用法
  • 游戏引擎phaser.js3的使用之玩家和静态物理组碰撞
  • AT_zone2021_d 宇宙人からのメッセージ 题解
  • C语言——构造(结构体)
  • JavaScript 基础(四)
  • CentOS 7 上配置 NFS
  • 07.Android之多媒体问题
  • interface和setter,getter
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Spark学习笔记之相关记录
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 反思总结然后整装待发
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 前端知识点整理(待续)
  • 前嗅ForeSpider中数据浏览界面介绍
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 原生Ajax
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 移动端高清、多屏适配方案
  • 整理一些计算机基础知识!
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • (145)光线追踪距离场柔和阴影
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (十三)Flink SQL
  • (四)进入MySQL 【事务】
  • (转载)虚函数剖析
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .net Application的目录
  • .net 调用海康SDK以及常见的坑解释
  • .net 连接达梦数据库开发环境部署
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .net6+aspose.words导出word并转pdf
  • .netcore 获取appsettings
  • .NET文档生成工具ADB使用图文教程
  • .net专家(高海东的专栏)
  • .考试倒计时43天!来提分啦!
  • @Async注解的坑,小心
  • @RequestParam,@RequestBody和@PathVariable 区别
  • @selector(..)警告提示
  • [2015][note]基于薄向列液晶层的可调谐THz fishnet超材料快速开关——
  • [240621] Anthropic 发布了 Claude 3.5 Sonnet AI 助手 | Socket.IO 拒绝服务漏洞
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [Android 数据通信] android cmwap接入点
  • [Assignment] C++1
  • [BZOJ] 2006: [NOI2010]超级钢琴