实现一个自动保存高CPU占用现场的简易工具

news2025/1/10 15:58:02

CPU 使用率在系统监控中是一个非常重要的指标。对于大多数 Web 应用来说,它们往往是 IO 密集型的,因此只会在某些时刻可能会出现 CPU 突然飙升的情况,随后很快就恢复正常。然而,当收到报警并想要排查问题时,CPU 飙升的情况可能已经过去,无法直接查看当时 Java 进程内的线程堆栈信息。

为了解决这个问题,本文实现了一个小工具,它在 CPU 飙升时自动保存堆栈信息,方便后续问题的追踪。

该工具实现了两个主要功能:

  1. 当 CPU 使用率达到预设的阈值时,自动保存当前 Java 进程的线程堆栈信息;
  2. 输出占用 CPU 使用率最高的线程 ID。

本文选择在 Linux 系统上实现这个工具,因为大多数应用都是部署在 Linux 环境中(本来想实现一个 MacOS 版本的脚本,但捣鼓了半天,由于格式以及函数存在差异,所以就没继续纠结了)

脚本如下:

#!/bin/bash
if [ $# -ne 1 ]; then
  echo "Usage: $0 <j_pid>"
  exit 1
fi

j_pid=$1
threshold=90

while true; do
    cpu_info=$(ps -p "$j_pid" -o %cpu=)
    cpu_usage=$(sed 's/%//g' <<< "$cpu_info")
    current_time=$(date +'%Y-%m-%d %H:%M:%S')
    echo "[-----$current_time] Current CPU Usage: $cpu_usage%"
    if [ $(echo "$cpu_usage > $threshold" | bc -q) -eq 1 ]; then
      thread_id=$(top -b -n 1 -H -p $j_pid | grep -E "^\s*[0-9]+" | sort -k9 -r | head -n 1 | awk '{print $1}')
      echo "[-----$current_time] Detected! PID: $j_pid ; Thread ID: $thread_id"
      jstack_output=$(jstack -l $j_pid)
      jstack_filename="jstack_$(date +'%Y%m%d%H%M%S').txt"
      echo "$jstack_output" > "$jstack_filename"
      echo "[$current_time] jstack_filename: $jstack_filename"
    fi
  sleep 10
done

可以看看效果,这是模拟的消耗 CPU 的 Java 代码:

/**
 * @author dongguabai
 * @date 2023-07-21 13:11
 */
public class Test {

    public static void doSth() {
        while (true) {
            double x = Math.random() * Math.random();
        }
    }

    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                doSth();
            }
        }, "highcpu_thread").start();
    }
}

执行 Java 代码:

[root@MiWiFi-R4CM-srv javaTest]# javac Test.java
[root@MiWiFi-R4CM-srv javaTest]# java Test

执行脚本:

[root@MiWiFi-R4CM-srv javaTest]# sh monitor.sh 9581
[-----2023-07-21 01:37:12] Current CPU Usage: 99.3%
[-----2023-07-21 01:37:12] Detected! PID: 9581 ; Thread ID: 9590
[2023-07-21 01:37:12] jstack_filename: jstack_20230721013713.txt

查看线程 ID:
在这里插入图片描述

查看线程堆栈:

"Attach Listener" #9 daemon prio=9 os_prio=0 tid=0xb768fc00 nid=0x25a0 waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

"DestroyJavaVM" #8 prio=5 os_prio=0 tid=0xb7607400 nid=0x256e waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

"highcpu_thread" #7 prio=5 os_prio=0 tid=0xb768ec00 nid=0x2576 runnable [0xa4bb8000]
   java.lang.Thread.State: RUNNABLE
	at Test.doSth(Test.java:13)
	at Test$1.run(Test.java:20)
	at java.lang.Thread.run(Thread.java:748)

可以看到,效果还是可以的。

注意事项

在生产环境中使用此工具时,需要注意以下几点:

  1. jstack 命令可能对系统性能产生一定影响,需要谨慎使用并避免频繁执行
    • 如果 Java 进程非常大,有很多线程,那么收集线程堆栈信息的操作可能会耗费较多的系统资源
    • 触发脚本时 Java 进程本身已经处于高负载状态,运行jstack命令可能会导致 Java 进程的响应时间增加
    • 最好设置一个触发阈值,频繁地运行 jstack 命令收集线程堆栈信息,可能会在一定程度上增加系统负担
  2. 脚本最好保存在一个不容易被意外杀掉的地方,以确保在 CPU 飙升时能正常执行。
  3. 在应用刚启动的时候,可能由于初始化等操作导致短暂的 CPU 飙升,因此脚本可设置延迟执行,避免误报。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows10上VS2022单步调试FFmpeg 4.2源码

之前在 https://blog.csdn.net/fengbingchun/article/details/103735560 介绍过通过VS2017单步调试FFmpeg源码的方法&#xff0c;这里在Windows10上通过VS2022单步调试FFmpeg 4.2的方法&#xff1a;基于GitHub上ShiftMediaProject/FFmpeg项目&#xff0c;下面对编译过程进行说明…

VS2022远程Linux使用cmake开发c++工程配置方法

文章目录 远程连接CMakePresets.json的配置Task.vs.json配置launch.vs.json配置最近使用别人在VS2015上使用visualgdb搭建的linux开发环境,各种不顺手,一会代码不能调转了,一会行号没了,调试的时候断不到正确的位置,取消的断点仍然会进。因此重新摸索了一套使用vs的远程开…

合并多个文本文件

使用 wxPython 模块合并多个文本文件的博客。以下是一篇示例博客&#xff1a; C:\pythoncode\blog\txtmerge.py 在 Python 编程中&#xff0c;我们经常需要处理文本文件。有时候&#xff0c;我们可能需要将多个文本文件合并成一个文件&#xff0c;以便进行进一步的处理或分析。…

MySQL的配置文件my.cnf与my.ini

一、my.cnf与my.ini win系统&#xff0c;MySQL配置文件为my.ini 其他系统&#xff08;Ubuntu、CentOS、macOS)MySQL配置文件为my.cnf 二、my.cnf与my.ini的路径 2.1 默认路径 MySQL 的配置文件 my.cnf 可能位于多个位置&#xff0c;具体取决于安装方式和操作系统。以下是一…

《HeadFirst设计模式(第二版)》第十章代码——状态模式

如下图所示&#xff0c;这是一个糖果机的状态机图&#xff0c;要求使用代码实现&#xff1a; 初始版本&#xff1a; package Chapter10_StatePattern.Origin;/*** Author 竹心* Date 2023/8/19**/public class GumballMachine {final static int SOLD_OUT 0;final static int…

【编织时空四:探究顺序表与链表的数据之旅】

本章重点 链表的分类 带头双向循环链表接口实现 顺序表和链表的区别 缓存利用率参考存储体系结构 以及 局部原理性。 一、链表的分类 实际中链表的结构非常多样&#xff0c;以下情况组合起来就有8种链表结构&#xff1a; 1. 单向或者双向 2. 带头或者不带头 3. 循环或者非…

【论文解读】Observation-Centric SORT:Rethinking SORT for Robust Multi-Object Tracking

一.介绍 1.1 之前卡尔曼方法存在的问题&#xff1a; 1.长时间的运动的线性估计可能是非常不准确的。2.当没有可用于更新卡尔曼滤波器参数的测量时&#xff0c;标准惯例是信任先验状态估计进行后验更新&#xff0c;这导致了在一段时间内错误的积累。 1.2 基于假设 假设跟踪目…

ARM体系结构学习笔记:位操作和灵活的2nd操作数

位操作 移位运算 数据传输指令 灵活的2nd操作数 Set a bit a | (1 << 5)Clear a bit a & ~(1 << 5)Toggling a bt a ^ 1<<5

IDEA开发项目时一直出现http404错误的解决方法

系列文章目录 安装cv2库时出现错误的一般解决方法_cv2库安装失败 SQL&#xff1e; conn sys/root as sysdbaERROR:ORA-12560: TNS: 协议适配器错误的解决方案 虚拟机启动时出现“已启用侧通道缓解”的解决方法 Hypervisor launch failed&#xff1b; Processor does not pr…

数据的绘画工场:Python绘图库Pyecharts,打造引人入胜的可视化效果

欢迎阅读本篇文章&#xff0c;本文将带您从零开始&#xff0c;逐步掌握使用Pyecharts库进行数据可视化的技能。Pyecharts是一个基于Echarts的Python可视化库&#xff0c;能够轻松创建各种交互式图表和地图&#xff0c;无论您是数据分析新手还是有经验的开发者&#xff0c;本文都…

【计算机视觉】相机基本知识(还在更新)

1.面阵工业相机与线阵工业相机 1.1 基本概念区别 面阵相机则主要采用的连续的、面状扫描光线来实现产品的检测&#xff1b; 线阵相机即利用单束扫描光来进行物体扫描的工作的。 1.2 优缺点 &#xff08;1&#xff09;面阵CCD工业相机&#xff1a; 优点&#xff1a;应用面…

ZooKeeper集群服务器启动

在本文中&#xff0c;我们将对集群版ZooKeeper服务器的启动过程做详细讲解。集群和单机ZooKeeper服务器的启动过程在很多地方都是一致的&#xff0c;因此本节只会对有差异的地方展开进行讲解。下图所示是集群版ZooKeeper服务器的启动流程图。 预启动 预启动的步骤如下。 (1)统…

财报解读:上半年业绩实现增长,药师帮业务飞轮已经开始旋转?

今年6月底登陆港股的药师帮&#xff0c;近日发布了上市后的首份财务报告。 财报显示&#xff0c;2023年上半年&#xff0c;药师帮实现营收增长、经调整后净利润转正的成果&#xff0c;再次验证了二级市场对于其发展潜力的看好——6月底上市以来&#xff0c;药师帮股价涨幅接近…

Mybatis的学习笔记(IDEA快捷键,参数占位符,转义符)

一、IDEA快捷键&#xff1a; IDEA多行注释&#xff1a;ctrlShift/ 单行注释&#xff1a;ctrl/ 导入包&#xff0c;自动修正代码&#xff1a;altenter 自动生成代码&#xff1a;altinsert 二、Mybatis重要知识点&#xff1a; 2.1 参数占位符 一共分为2种&#xff1a;#{}和…

idea2023 springboot+mybatis+jsp 初学单表增删改查

创建项目 因为2.7.14使用量较少&#xff0c;特更改spring-boot为2.7.5版本 配置端口号 打开Sm01Application类&#xff0c;右键运行启动项目&#xff0c;或者按照如下箭头启动 启动后&#xff0c;控制台提示如下信息表示成功 此刻在浏览器中输入&#xff1a;http://lo…

盘点市面上的ipad协议对比

友情链接 geweapi.com 点击即可访问! Web网页端&#xff1a;2017年后不再支持新号登录&#xff0c;仅支持老号&#xff0c;并且掉线严重&#xff0c;功能缺失严重。 Xposed技术&#xff1a;在2019年6月份&#xff0c;微信官方在行业重点打击Xposed&#xff0c;自此行业内一片…

企望制造ERP系统 RCE漏洞[2023-HW]

企望制造ERP系统 RCE漏洞 一、 产品简介二、 漏洞概述三、 复现环境四、 漏洞复现小龙POC检测 五、 修复建议 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;…

IO day 4

1、使用两个进程完成两个文件的拷贝&#xff0c;父进程拷贝前一半内容&#xff0c;子进程拷贝后一半内容&#xff0c;并且父进程要阻塞回收子进程资源 #include <myhead.h>int main(int argc, const char *argv[]) {char a[1] {0};pid_t pid;pid fork();//创建一个子进…

马哈鱼数据血缘工具背后的项目: gsp_demo_java 项目简单介绍与使用

0.背景 马哈鱼数据血缘工具(https://www.sqlflow.cn/)是SQLflow工具的中文译名,实际就是sqlflow. 对于SQL flow来说,底层调用的是General SQL Parser(GSP https://sqlparser.com) 的库. 这个gsp有开源的java demo项目:https://github.com/sqlparser/gsp_demo_java 1.快速使用…

Focus-DETR利用双重注意力机制重建编码器,打造最强目标检测模型

前期的文章我们介绍了DETR模型,我们知道DETR模型首先使用CNN卷积神经网络搜集图片的核心特征点,然后把这些特征点整合起来,通过embedding方法,把特征图片转换到特征向量空间。然后根据标准Transformer模型的编码器与解码器进行注意力机制的计算,最后把计算后的数据进行图片…