面试拆解:系统上线后CPU急速飙升,该怎么排查?

c6ad2b669c203b8e8bb758540ca675a8.jpeg

上次面试官问了个问题:应用上线后Cpu使用率飙升如何排查?

其实这是个很常见的问题,也非常简单,那既然如此我为什么还要写呢?因为上次回答的时候我忘记将线程PID转换成16进制的命令了。

所以我决定再重温一遍这个问题,当然贴心的我还给大家准备好了测试代码,大家可以实际操作一下,这样下次就不会忘记了。

模拟一个高CPU场景

public class HighCpuTest {public static void main(String[] args) {List<HignCpu> cpus = new ArrayList<>();Thread highCpuThread = new Thread(()->{int i = 0;while (true){HignCpu cpu = new HignCpu("Java日知录",i);cpus.add(cpu);System.out.println("high cpu size:" + cpus.size());i ++;}});highCpuThread.setName("HignCpu");highCpuThread.start();}
}

在main方法中开启了一个线程,无限构建HighCpu对象。

@Data
@AllArgsConstructor
public class HignCpu {private String name;private int age;
}

准备好上面的代码,运行HighCpuTest,然后就可以开始一些列的操作来发现问题原因了。

排查步骤

第一步,使用 top 找到占用 CPU 最高的 Java 进程

1. 监控cpu运行状,显示进程运行信息列表
top -c2. 按CPU使用率排序,键入大写的P
P
54cd8fe1896ea66b53dd6df9dd51ed07.png

第二步,用 top -Hp 命令查看占用 CPU 最高的线程

上一步用 top命令找到了那个 Java 进程。那一个进程中有那么多线程,不可能所有线程都一直占着 CPU 不放,这一步要做的就是揪出这个罪魁祸首,当然有可能不止一个。

执行top -Hp pid命令,pid 就是前面的 Java 进程,我这个例子中就是 16738 ,完整命令为:

top -Hp 16738,然后键入P (大写p),线程按照CPU使用率排序

执行之后的效果如下

d4f71b3991684cc432638b485c2d2e9a.png

查到占用CPU最高的那个线程 PID 为 16756

第三步,查看堆栈信息,定位对应代码

通过printf命令将其转化成16进制,之所以需要转化为16进制,是因为堆栈里,线程id是用16进制表示的。(我当时就是忘记这个命令了~)

[root@review-dev ~]# printf "%x\n" 16756
4174

得到16进制的线程ID为4174。

通过jstack命令查看堆栈信息

jstack 16738 | grep '0x4174' -C10 --color
d1766517cd0f9edef6a44902c34e79f7.png

如上图,找到了耗CPU高的线程对应的线程名称“HighCpu”,以及看到了该线程正在执行代码的堆栈。

最后,根据堆栈里的信息,定位到对应死循环代码,搞定。

小结

cpu使用率飙升后如何排查这个问题不仅面试中经常会问,而且在实际工作中也非常有用,大家最好根据上述步骤实际操作一下,这样才能记得住记得牢。

a5efa589df6d7f0ced58896b53ad239d.gif

往期推荐

76cc14577934c1fbd870657a4757b9ce.jpeg

面试突击63:distinct 和 group by有什么区别?


0910ce7819bfc254ba774d85a4033118.jpeg

从20s优化到500ms,我用了这三招


19fd3d1b8a24b5a87f561395ae0778c1.jpeg

阿里出品,SpringBoot自动化部署神器!


843a24ad349f7898c3252fb6fb6304eb.gif

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

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

相关文章

MySQL 死锁了,怎么办?

作者&#xff1a;小林coding提纲如下&#xff1a;正文有个业务主要逻辑就是新增订单、修改订单、查询订单等操作。然后因为订单是不能重复的&#xff0c;所以当时在新增订单的时候做了幂等性校验&#xff0c;做法就是在新增订单记录之前&#xff0c;先通过 select ... for upda…

10 张图搞懂服务注册发现机制

在微服务架构或分布式环境下&#xff0c;服务注册与发现技术不可或缺&#xff0c;这也是程序员进阶之路必须要掌握的核心技术之一&#xff0c;本文通过图解的方式带领大家轻轻松松掌握。引入服务注册与发现组件的原因先来看一个问题&#xff0c;假如现在我们要做一个商城项目&a…

ASP.NET 5 Beta8 已经发布

Microsoft ASP.NET and Web Tools 2015 (Beta8) http://www.microsoft.com/en-us/download/details.aspx?id49442 .net core 完成了98%&#xff0c;绝大部分类库完成了跨平台开发&#xff0c;已经基本可用&#xff0c;下一版本为RC&#xff0c;发布时间为12月&#xff0c;将可…

面试突击65:HTTPS有什么优点?说一下它的执行流程?

作者 | 磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;说到 HTTPS 相信大部分人都是不陌生&#xff0c;因为目前我们使用的绝大数网站都是基于 HTTPS 的&#xff0c;比如以…

Cell.reuseIdentifier 指什么

Cell.reuseIdentifier 指的是 默认为空&#xff0c;如果不定义&#xff0c;在执行 [_tableView registerNib:templateCellNib forCellReuseIdentifier:_templateCell.reuseIdentifier]; 时&#xff0c;提示 must pass a valid reuse identifier to -[UITableView registerNib:f…

缓存穿透、缓存雪崩、缓存击穿?

背景 在现代软件架构中&#xff0c;缓存的应用已经非常普及。缓存的使用在面试和实践中都是避不开的硬技能、硬知识&#xff0c;如果你说还不太熟悉缓存的使用&#xff0c;可能都不好意思说自己是程序员。这篇文章&#xff0c;带大家进一步学习在缓存使用中不得不考虑三个特殊场…

如何防止订单重复支付?

大家好&#xff0c;我是磊哥&#xff0c;想必大家对在线支付都不陌生&#xff0c;今天和大家聊聊如何防止订单重复支付。看看订单支付流程我们来看看&#xff0c;电商订单支付的简要流程&#xff1a;订单钱包支付流程从下单/计算开始&#xff1a;下单/结算&#xff1a;这一步虽…

3 分钟快速上手 Spring 事件机制

小伙伴们好呀~ 今天来和大家分享下这个 Spring事件机制内容概览image-20210829132019387原理image-20210828184103069这个熟悉 观察者模式 的小伙伴应该一眼就看出来啦~其实就是个简单版的 发布-订阅模式有三个核心类&#x1f447;事件 ApplicationEvent事件发布器 Application…

mis dss gis_MIS中的决策支持系统(DSS)

mis dss gisThe Decision Support System is always helpful to management people to take decisions/decisions and finds the key business insights from available information systems. 决策支持系统始终有助于管理人员做出决策/决策&#xff0c;并从可用的信息系统中找到…

使用Grunt构建自动化开发环境

1、准备工作 1&#xff09;首页确保电脑上网&#xff0c;以及能够访问https://registry.npmjs.org/&#xff0c;因需从此网站中下载安装相应的插件; 2&#xff09;电脑安装Node.js&#xff0c;Grunt及Grunt插件都是基于node.js运行的&#xff1b;如果你电脑上未装node.js&#…

面试突击66:请求转发和请求重定向有什么区别?

作者 | 磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;在 Java 中&#xff0c;跳转的实现方式有两种&#xff1a;请求转发和请求重定向&#xff0c;但二者是完全不同的&…

99%的Java程序员会踩的6个坑

前言作为Java程序员的你&#xff0c;不知道有没有踩过一些基础知识的坑。有时候&#xff0c;某个bug&#xff0c;你查了半天&#xff0c;最后发现竟然是一个非常低级的错误。有时候&#xff0c;某些代码&#xff0c;这一批数据功能正常&#xff0c;但换了一批数据就出现异常了。…

BigDecimal 的 4 个坑,你踩过几个?

背景 一直从事金融相关项目&#xff0c;所以对BigDecimal再熟悉不过了&#xff0c;也曾看到很多同学因为不知道、不了解或使用不当导致资损事件发生。所以&#xff0c;如果你从事金融相关项目&#xff0c;或者你的项目中涉及到金额的计算&#xff0c;那么你一定要花时间看看这篇…

Windows Server 2012 R2 里面如何安装Net Framework 3.5

图示 不要慌&#xff0c;和windows是不一样的&#xff0c;没有问题 下一步 默认即可&#xff0c;下一步 这里面的东西以后会装&#xff0c;先不管&#xff0c;我们今天目的是装 net framework 3.5 选一下 正在安装 如果出错了请参考&#xff1a; http://www.2cto.com/os/201410…

聊聊Java中代码优化的30个小技巧

今天我们一起聊聊Java中代码优化的30个小技巧&#xff0c;希望会对你有所帮助。1.用String.format拼接字符串不知道你有没有拼接过字符串&#xff0c;特别是那种有多个参数&#xff0c;字符串比较长的情况。比如现在有个需求&#xff1a;要用get请求调用第三方接口&#xff0c;…

面试突击69:TCP 可靠吗?为什么?

作者 | 磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;相比于 UDP 来说&#xff0c;TCP 的主要特性是三个&#xff1a;有连接、可靠、面向数据流。所谓的“有连接”指的是 …

Java 是值传递还是引用传递?

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;开篇先来曝答案&#xff0c;在 Java 语言中&#xff0c;本质只有值传递&#xff0c;而无引用传递&#xff0c;解释和证明详见…

SpringCloud基于RocketMQ实现分布式事务

前言分布式事务是在微服务开发中经常会遇到的一个问题&#xff0c;之前的文章中我们已经实现了利用Seata来实现强一致性事务&#xff0c;其实还有一种广为人知的方案就是利用消息队列来实现分布式事务&#xff0c;保证数据的最终一致性&#xff0c;也就是我们常说的柔性事务。消…

漫画:怎么证明sleep不释放锁,而wait释放锁?

wait 加锁示例public class WaitDemo {private static Object locker new Object();public static void main(String[] args) throws InterruptedException {WaitDemo waitDemo new WaitDemo();// 启动新线程&#xff0c;防止主线程被休眠new Thread(() -> {try {waitDemo…

就国内某个程序员问答网站的简单的分析

为什么80%的码农都做不了架构师&#xff1f;>>> 一、数据抓取 分析页面数据&#xff0c;设计数据表结构数据只要包含投票、回答数、问题状态、最后谁回答过、浏览数、问题标题、标签&#xff0c;数据样例如下&#xff1a;由于一开只打算爬问题标题&#xff0c;问题…