113 如何排查 cpu 过高的业务进程

news2024/11/26 22:39:46

前言

又是一个面试问题, 呵呵 之前碰到的

一个 java 进程 cpu 占用率过高, 应该如何排查? 

对于这种问题, 第一反应就是 jstack, pstack, 然后仔细观察多次堆栈信息结果的 重复率较高的代码

因此 我给出的思路是, 写脚本 多次 jstack 目标进程, 然后 再统计分析一下 出现频率最高的 topN 的方法调用附近的东西 

呵呵 这里来整理一下  这个流程

测试用例

这里主要是一个 不断计算的一个测试用例

主要是确保 程序一直在不断的执行, 计算的相关操作, 这里不要加入 io 的相关操作 

-Xint 是防止, jvm 的编译优化, 将 funcA, funcB, funcC, funcD 的相关处理削除掉了 

/**
 * Test17CpuTooHigh
 *
 * @author Jerry.X.He
 * @version 1.0
 * @date 2023/9/20 17:38
 */
public class Test17CpuTooHigh {

    // Test17CpuTooHigh
    // -Xint
    public static void main(String[] args) {

        while (true) {
            funcA();
        }

    }

    public static void funcA() {
        for (int i = 0; i < 10000; i++) {
            funcB();
        }
    }

    public static void funcB() {
        for (int i = 0; i < 10000; i++) {
            funcC();
        }
    }

    public static void funcC() {
        for (int i = 0; i < 10000; i++) {
            funcD();
        }
    }

    public static void funcD() {
        for (int i = 0; i < 10000; i++) {
            int x = 2, y = 3;
            int z = x + y;
        }
    }

}

多次统计 jstack 的脚本

呵呵 简单的输出, 不多解释 

public class Test18OutputJstackScripts {

    // Test18OutputJstackScripts
    public static void main(String[] args) {

        String pid = "14232";
        for (int i = 0; i < 100; i++) {
            System.out.println(String.format("jstack %s >> %s.txt", pid, i));
        }

    }

}

统计方法调用频率最高的 topN

呵呵 这里仅仅考虑 相对比较 common 的场景, 简单处理 

特殊的场景, 需要特殊考虑 

/**
 * Test19CollectMostCommonCode
 *
 * @author Jerry.X.He
 * @version 1.0
 * @date 2023/9/20 17:46
 */
public class Test19CollectMostCommonCode {

    // Test19CollectMostCommonCode
    public static void main(String[] args) throws Exception {

        String path = "D:\\Tmp\\30_multi_jstack";
        Map<String, Integer> func2Count = new LinkedHashMap<>();
        FileUtils.traverse(path, file -> {
            return !file.getName().contains("run");
        }, file -> {
            try {
                List<String> lines = Tools.getContentWithList(file);
                for (String line : lines) {
                    if (!line.contains("at ")) {
                        continue;
                    }
                    String func = Tools.getStrInRangeWithStart(line, "at ");
                    Integer oldCount = func2Count.computeIfAbsent(func, k -> 0);
                    func2Count.put(func, oldCount + 1);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        });

        List<String> keywords = Arrays.asList("spring", "hx", "test");
        List<Pair<String, Integer>> list = new ArrayList<>();
        for (Map.Entry<String, Integer> entry : func2Count.entrySet()) {
            String func = entry.getKey();
            List<String> targetKeywords = keywords.stream().filter(k -> func.contains(k)).collect(Collectors.toList());
            if (CollectionUtils.isEmpty(targetKeywords)) {
                continue;
            }
            list.add(new Pair<>(entry.getKey(), entry.getValue()));
        }
        Collections.sort(list, (o1, o2) -> {
            return -(o1.getSecond() - o2.getSecond());
        });

        int x = 0;

    }

}

最终执行结果如下

就可以根据这些方法调用的相关信息, 来定位导致 cpu 过高的原因 

一般来说是 无限循环 或者 非常大的循环 或者 无限递归

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

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

相关文章

请勿假设你的用户都有管理员权限

有些人觉得自己很聪明&#xff0c;他们在程序中做了这样一项”优化”。 在程序的安装阶段&#xff0c;他们不会安装某些程序功能&#xff0c;而是等到用户第一次使用的时候才执行&#xff0c;也即所谓的 “按需加载”。 问题在于&#xff0c;第一次使用的时候&#xff0c;用户…

设计模式之模板方法模式详解(上)

模板方法模式 1&#xff09;概述 1.定义 定义一个操作中算法的框架&#xff0c;而将一些步骤延迟到子类中&#xff0c;模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 2.方案 背景&#xff1a;某个方法的实现需要多个步骤&#xff08;类似…

民族运动饮料之父『健力宝』×企企通正式启动SRM项目,打造饮料行业采购数字化应用标杆

近日&#xff0c;为推进采购阳光化、数字化和智能化&#xff0c;提升管理效率与质量&#xff0c;企企通与中国电解质饮料的领军品牌广东健力宝股份有限公司&#xff08;以下简称“健力宝”&#xff09;成功签约并召开项目启动会。健力宝行政副总裁赵总、CIO李总、采购本部总监杨…

时序分解 | Matlab实现TVF-EMD时变滤波器的经验模态分解信号分量可视化

时序分解 | Matlab实现TVF-EMD时变滤波器的经验模态分解信号分量可视化 目录 时序分解 | Matlab实现TVF-EMD时变滤波器的经验模态分解信号分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现TVF-EMD(时变滤波器的经验模态分解)可直接替换 Matlab语言 1.…

还原matlab编辑器窗口和主窗口分开的问题

问题 matlab不知道早点的&#xff0c;点击运行后会弹出新的窗口&#xff0c;咋整都恢复不了 解决方案 首先&#xff0c;在编辑器窗口下&#xff0c;按ctrlshiftD&#xff0c;此时编辑器窗口和主窗口就合并了&#xff0c;问题解决。

Databend Cloud 正式上线腾讯云市场,加速挖掘数据创新价值

近日&#xff0c;新一代大数据分析平台 Databend Cloud 正式上线腾讯云千帆云市场&#xff0c;成为腾讯云 SaaS 生态圈中的重要一员。依托腾讯云平台的技术支持和市场资源&#xff0c; Databend Cloud 将充分发挥数据价值的挖掘能力&#xff0c;助力更多企业实现数据驱动的决策…

基于docker的开发者集成环境

docker-compose一键部署开发者环境。 常见的中间件&#xff1a;nginx, mysql, redis, mongo, rabbitmq, nacos, rocketmq, zookeeper等。 GIthub项目地址 1. 下载项目&#xff1a;git clone https://github.com/xhga/docker-develop-env.git 2. 进入文件夹&#xff1a;cd d…

嵌入式硬件需要过哪几关?

目标是成为一名硬件工程师,用电烙铁和电路板一统江湖,游戏共有九关。 第一关:基础基础还是基础! 你要有一定的基础,模电,数电这些都得会一些。一般科班出身的专业有电信,通信,自动化等等。 你如果完全没这些基础,连电阻,电容都不认识,那就需要在这关待上很久啦。 …

[笔试强训day01]

BC153 [NOIP2010]数字统计 描述 牛牛拿到了一个字符串。 他每次“点击”&#xff0c;可以把字符串中相邻两个相同字母消除&#xff0c;例如&#xff0c;字符串"abbc"点击后可以生成"ac"。 但相同而不相邻、不相同的相邻字母都是不可以被消除的。 牛牛想把…

【Linux】应用层协议序列化和反序列化

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;C【智能指针】 前言 在正式代码开始前&#xff0c;会有一些前提知识引入 目录 &#x1f449;&#x1f3fb;序列…

设计模式———单例模式

单例也就是只能有一个实例&#xff0c;即只创建一个实例对象&#xff0c;不能有多个。 可能会疑惑&#xff0c;那我写代码的时候注意点&#xff0c;只new一次不就得了。理论上是可以的&#xff0c;但在实际中很难实现&#xff0c;因为你无法预料到后面是否会脑抽一下~~因此我们…

北京InfoComm China 2024今日开幕:重新定义人机交互

2024年4月17日&#xff0c;北京——北京InfoComm China 2024展会在万众期待中于北京国家会议中心盛大开幕。这场为期三天的行业盛会&#xff0c;将持续至4月19日&#xff0c;为参观者们带来一场前所未有的创新技术与解决方案的盛宴。 本届展会作为亚太地区领先的专业视听与集成…

本地jar包手动添加到Maven仓库

步骤&#xff1a; 打开命令行窗口&#xff08;Windows&#xff09;或终端&#xff08;macOS/Linux&#xff09;。使用cd命令导航到包含jar文件的目录。执行以下命令&#xff0c;将jar文件添加到Maven本地仓库&#xff1a; mvn install:install-file -Dfile<jar文件名>.…

Swift Publisher 5 for mac:打造精美版面

Swift Publisher 5 for mac&#xff1a;打造精美版面 Swift Publisher 5是一款专业的版面设计和编辑工具&#xff0c;为Mac用户提供了强大的设计功能和直观的操作界面。以下是关于Swift Publisher 5的功能介绍&#xff1a; 直观易用的界面&#xff1a;用户能够轻松地使用Swift …

图书管理系统概述

自友图书馆管理系统解决方案适用于中小学、大中专院校以及企事业单位中小型图书馆的自动化管理需求&#xff0c;其功能覆盖了图书馆自动化集成管理业务流程所包括的所有环节。《图书馆管理系统》首先应该按照我国图书馆行业通用CNMARC格式及《中图法第四版》行业标准开发而成,支…

【网安小白成长之路】6.pikachu、sql-labs、upload-labs靶场搭建

&#x1f42e;博主syst1m 带你 acquire knowledge&#xff01; ✨博客首页——syst1m的博客&#x1f498; &#x1f51e; 《网安小白成长之路(我要变成大佬&#x1f60e;&#xff01;&#xff01;)》真实小白学习历程&#xff0c;手把手带你一起从入门到入狱&#x1f6ad; &…

57.网络游戏逆向分析与漏洞攻防-基础数据分析筛选-获取他人发来的聊天信息

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 内容参考于&#xff1a;如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&…

从二本调剂到上海互联网公司算法工程师:我的成长故事

探讨选择成为一名程序员的原因&#xff0c;是出于兴趣还是职业发展&#xff1f; 在这个科技飞速发展的时代&#xff0c;程序员这一职业无疑成为了许多人眼中的香饽饽。那么&#xff0c;是什么驱使着越来越多的人选择投身于这一行业呢&#xff1f;是出于对编程的热爱&#xff0…

计算机网络基础:宏观认识

目录 一、网络发展背景与基本概念 二、网络协议的意义与TCP/IP五层结构模型 三、网络传输的基本流程与封装分用 四、ip地址和mac地址 随着信息技术的飞速发展&#xff0c;计算机网络已经成为了现代社会不可或缺的一部分。无论是工作、学习还是娱乐&#xff0c;我们几乎都离…

MySql中truncate,delete有什么区别?什么情况下id会不会连续呢?

TRUNCATE和DELETE都是用来删除表中数据的SQL命令&#xff0c;但它们的工作方式和使用场景有所不同&#xff1a; DELETE命令&#xff1a;DELETE命令用于从表中删除一行、多行或所有行。你可以添加WHERE子句来指定要删除的行。例如&#xff0c;DELETE FROM table_name WHERE cond…