快速定位线上CPU100%原因

简介: 快速定位线上CPU100%原因

引言


最近项目部门反应有个系统特别卡顿,很多页面都打不开了,开发人员告诉我说最近没有进行代码升级,我登录到对应的服务器上执行了top命令,发现cpu飙升到100%,对于这种问题我们应该快速的定位到问题,否则会影响线上系统的正常作业。


对于造成这种问题的可能原因,迅速的在头脑中闪过四种情况:


 1、某个接口响应时间超长,并且可能被频繁调用


 2、产生了过大的对象,造成频繁FGC


 3、代码出现死循环


 4、线程出现死锁


下面是小编的定位问题的步骤:


 1)top


  2)top  -Hp 2848


  3)printf "%x" 2925


  4)jstack 2848 | grep 0xb6d -C50 --color


第一、执行top命令,结果如下

20191126173300764.png

我们根据top结果发现,有java进程CPU占用超过100%,说明这个进程中的代码出现问题了


第二、执行top  -Hp 2848 查看该pid详情


20191126172813792.png


从上面结果,我们基本可以排除产生大对象的情况,因为如果有大对象产生,这个时候的结果应该是有多个进程CPU占用都会超过80%,其中有多个进程在在进行GC,从而造成CPU飙升。


第三  执行 printf "%x" 2925 转换为 十六进制


20191126172841181.png


第四 执行 jstack 2848 | grep 0xb6d -C50 --color 查看具体的信息,由于我们项目使用daemon用户启动,所以我执行的命令为


/sbin/runuser -s /bin/bash daemon -c "jstack 2848 | grep 0xb6d -C50 --color"

 

20191126172959235.png

20191126172951271.png


上图中红色的nid就是我们查看的进行对应的详细代码信息,从上面我们就可以很快的定位到具体的代码行,我们系统此处代码是一个统计的方法,由于前端传递的时间跨度非常大,并且多个人在频繁的刷新造成系统卡死。


注意:我们执行jstack的时候,执行用户需要和进程启动用户一直,否则会提示下面错误


Unable to open socket file: target process not responding or HotSpot VM not loaded

The -F option can be used when the target process is not responding


********************下面我们分析一下 代码执行过程中产生 "超大对象" 出现的现象***************************************


1、top

20191127102226406.png

2、 执行命令 top -Hp 23002


20191127102253875.png


我们发现有很多的进程cpu占用都查过了90%,这种情况很可能是多个进程在进行FGC,为了验证这种情况我们执行下面命令


3、jstat -gcutil 23002 2000 5


上面命令是 输出该进程在jvm中的占用情况  每2000毫秒执行一次 一共执行5次


20191127105645975.png

从输出信息可以看出,Eden区内存占用100%,Old区内存占用99.97%,Full GC的次数高达170次,并且频繁Full GC,Full GC的持续时间也特别长,平均每次Full GC耗时5.93秒(1009.445/170)。根据这些信息,基本可以确定是程序代码上出现了问题,可能存在不合理创建对象的地方


4、将上面的对应的四个线程号十进制转换为 十六进制


5、执行命令 jstack 23002 |grep "0x59dd" -C50 --color 查看对应的线程信息


2019112710291662.png

由上图可见,cpu使用率高的线程都在GC task,JVM的GC线程一直在占用大量CPU


6、也可以执行命令jstack -l 23002 >/data1/23002.statck 将对应的进程号的栈信息输入到指定目录


7、在23002.statck中就行过滤查询

20191127103048414.png


7、过滤搜索一下 我们项目名称,就可以看到具体的代码位置

20200731153928375.png


8、然后根据具体的代码分析一下,出现 问题的具体原因


小结


线上出现cpu100%问题需要我们在最短的是时间内解决该问题,其中最重要的是我们能快速的定位到问题出现的具体代码位置,然后我们才能在最短的时间内解决,对于一些不是很重要的统计功能,我们可以先暂停该功能,首先保证主要流程正常使用,待服务恢复正常以后,我们在 优化具体的代码。

目录
相关文章
CPU过高问题定位
CPU过高问题定位
105 0
|
设计模式 监控 安全
如何定位当生产环境CPU飙升的时候的问题
在当今的信息化时代,计算机系统在各行各业都发挥着重要的作用。然而,当生产环境中的CPU飙升时,系统性能会受到影响,甚至导致整个系统瘫痪。这不仅会对企业造成经济损失,还会对用户体验造成严重影响。因此,如何定位并解决生产环境中CPU飙升的问题,已成为众多企业和开发人员亟待解决的问题之一。本文旨在探讨如何定位生产环境中CPU飙升的问题,并提供相应的解决方案。通过了解CPU飙升的原因、定位方法以及解决方案,企业和开发人员可以更好地应对生产环境中出现的CPU飙升问题,提高系统性能和用户体验。
310 1
|
8月前
|
存储 设计模式 监控
快速定位并优化CPU 与 JVM 内存性能瓶颈
本文介绍了 Java 应用常见的 CPU & JVM 内存热点原因及优化思路。
881 166
|
5月前
|
监控 C#
【Function App】如果一个拥有多个Function App的Plan遇见了High CPU问题? 如何方便定位是哪一个Function App引发的呢?
在Azure Function App测试中,若多个Function App共用同一App Service Plan资源,当出现High CPU问题时,由于Function App公开指标无法直接观测CPU状态,可通过启用Application Insights解决。其Live Metrics功能可过滤并查看每个Function App的CPU使用情况。具体步骤为:将所有Function App连接至同一Application Insights资源,进入Live Metrics页面按Role筛选监控数据。附有三段C#代码示例,分别展示占用CPU、Memory及普通功能的实现方法。
150 36
|
11月前
线程CPU异常定位分析
【10月更文挑战第3天】 开发过程中会出现一些CPU异常升高的问题,想要定位到具体的位置就需要一系列的分析,记录一些分析手段。
248 0
|
6月前
|
存储 设计模式 监控
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
147 0
如何快速定位并优化CPU 与 JVM 内存性能瓶颈?
|
11月前
|
Java
Java面试题之cpu占用率100%,进行定位和解决
这篇文章介绍了如何定位和解决Java服务中CPU占用率过高的问题,包括使用top命令找到高CPU占用的进程和线程,以及使用jstack工具获取堆栈信息来确定问题代码位置的步骤。
722 0
Java面试题之cpu占用率100%,进行定位和解决
|
小程序 JavaScript Java
【Java】服务CPU占用率100%,教你用jstack排查定位
本文详细讲解如何使用jstack排查定位CPU高占用问题。首先介绍jstack的基本概念:它是诊断Java应用程序线程问题的工具,能生成线程堆栈快照,帮助找出程序中的瓶颈。接着,文章通过具体步骤演示如何使用`top`命令找到高CPU占用的Java进程及线程,再结合`jstack`命令获取堆栈信息并进行分析,最终定位问题代码。
1241 2
【Java】服务CPU占用率100%,教你用jstack排查定位
|
Java
Jstack 查看线程状态及定位占用 cpu 较高的 java 线程
Jstack 查看线程状态及定位占用 cpu 较高的 java 线程
1191 2
使用funcgraph-retval和bpftrace/kprobe快速定位并解决cpu控制器无法使能的问题
使用funcgraph-retval和bpftrace/kprobe快速定位并解决cpu控制器无法使能的问题