暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

JAVA应用-CPU使用率过高问题排查思路

笨鸟之路 2021-04-19
3757

本次应用投产后,生产报告cpu使用率过高,经常100%

参考网上资料,经排查后解决。现将思路分享出来:

名词解释:

pid 进程IDtid 线程ID

1. top -d 1命令查看 当前占用cpu资源最多的,找到pid

2. ps -mp pid -o THREAD,tid,time命令查看该进程的线程情况,找到tid

3. printf "%x\n" tId    tid转成16进制 0xtid

4. jstack pid|grep 0xtid -A 30 ----查看具体堆栈信息,从栈中找到对应的代码段

5. 根据找到的代码段,进行具体的分析。

 

分析步骤:

1.登陆应用机器,top -d 1命令查看 当前占用cpu资源最多的,一般排名第一位肯定是java进程

一般也可能存在多个java进程 

2.查看进程的哪个线程占用cpu比较高,取线上另外一台正常情况下利用cpu比较高的应用:通过

ps -mp pid -o THREAD,tid,time命令查看该进程的线程情况

ps -mp 1679 -o THREAD,tid,time 


 

 

通过以上线程CPU切片 耗时在pid=1679 Tid =1896 耗时 1分59秒,4%CPU占用最大。时间最长。

TID为1679的线程利用cpu资源比较多,怎么能看到这个线程在干什么呢?

需要将1896 转换为16进制,便于在jvm堆栈中查找。

printf "%x\n" 1896

计算出对应16进制为 768

 

通过jstack命令来查看下当前内存状态:

jstack 1679|grep 768 -A 30

 

 定位到cpu过高是IO读写太高 ,接下来就是找开发人员确认这段代码是否可以优化。

----------------------------------补充知识---------------------------------------

1CPU 使用率怎么计算?

CPU% = 1 - idleTime sysTime * 100

idleTimeCPU处于空闲状态的时间

sysTimeCPU处于用户态和内核态的时间总和

 

2CPU 使用率跟啥有关系?

计算密集型的程序是比较耗 CPU 使用率的。

JAVA 应用中哪些操作是比较耗 CPU 使用的?

列举日常程序中常见的耗CPU的操作:

A. 频繁GC,访问量高时,有可能造成频繁的GC、甚至FGC。当调用量大时,内存分配过快,就会造成GC线程不停的执行,导致CPU飙高

B. 序列化与反序列化,后文中举了一个真实的案例,程序执行xml解析的时,调用量增大的情况下,导致了CPU被打满

C. 加密、解密

D. 正则表达式校验,曾经线上发生一次血案,正则校验将CPU打满。大概原因是:Java 正则表达式使用的引擎实现是 NFA 自动机,这种引擎在进行字符匹配会发生回溯(backtracking

E. 线程上下文切换、当启动了很多线程,而这些线程都处于不断的阻塞状态(锁等待、IO等待等)和执行状态的变化过程中。当锁竞争激烈时,很容易出现这种情况

  F.某些线程在做无阻塞的运算,简单的例子while(true)中不停的做运算,没有任何阻塞。写程序时,如果需要做很久的计算,可以适当将程序sleep下。

   比如在循环中不断计算:

修改前:

对应的计算如下:

修改后:


文章转载自笨鸟之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论