前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java服务CPU100%异常排查实践总结

Java服务CPU100%异常排查实践总结

作者头像
CBeann
发布2023-12-25 19:26:10
1870
发布2023-12-25 19:26:10
举报
文章被收录于专栏:CBeann的博客CBeann的博客

写作目的

最近看牛客网发现了CPU 100% 怎么办这个问题,这个问题的重点是定位和解决,会用到Linux和java的的很多命令,所以写篇博客记录和总结一下。

CPU 100%复现

之前有一个1核的腾讯云服务器,正好就不用搞虚拟机了。 写一个死循环Service

代码语言:javascript
复制
@Service
public class Cpu100Service {

  public void cpu100() {
    int a = 10;
    while (a < 100) {
      System.out.println(LocalDateTime.now().toString());
    }
  }
}

在controller中调用该Service就复现了。

代码语言:javascript
复制
  @Autowired
  private Cpu100Service cpu100Service;
  
@GetMapping("/cpu100")
  public Object getWhileList() {
    cpu100Service.cpu100();
    return 1;
  }

在服务器上启动服务后调用死循环的接口,则CPU出现负载100%的情况

在这里插入图片描述
在这里插入图片描述

定位问题

定位高负载的进程服务

首先使用top命令确认服务器的具体情况,定位到高负载的进程服务,如下图所示,我发现PID为929的服务CPU那栏高达86%,初步定位到是这个PID为929服务有问题。

在这里插入图片描述
在这里插入图片描述

定位到具体的线程

通过上面我们可以定位的进程的ID为929,接下来我们要定位到该进程的哪个线程占用CPU比较高,使用如下命令,其中929为进程ID。

代码语言:javascript
复制
top -Hp 929
在这里插入图片描述
在这里插入图片描述

此时可以定位到是线程1141占用CPU比较高

将线程号(1141)转为16进制(后面用)

代码语言:javascript
复制
printf '%x\n' 1141
在这里插入图片描述
在这里插入图片描述

定位线程调用栈

通过以下命令把定位的进程线程调用栈保存下来,其中929为进程ID

代码语言:javascript
复制
jstack 929 > 929.log

下图为929.log的部分信息,其中我们知道进程中线程号(十进制1141,十六进制475)占用CPU比较高,我们可以通过线程ID的十六进制定位到线程,然后根据调用栈定位信息,发现定位到我们自己写的代码,然后在捋一捋自己代码的逻辑就好。

在这里插入图片描述
在这里插入图片描述

参考

内存溢出+CPU占用过高:问题排查+解决方案+复盘(超详细分析教程) CPU 100% 异常排查实践与总结

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-12-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写作目的
  • CPU 100%复现
  • 定位问题
    • 定位高负载的进程服务
      • 定位到具体的线程
      • 定位线程调用栈
      • 参考
      相关产品与服务
      云服务器
      云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档