CPU占用过高是LINUX服务器常见的一种故障,也是程序员线上排查故障必备的技能,如果线上出现此种故障,程序员应如何快速定位代码块排查故障呢?
一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环。
出现了死循环,一般是因为代码逻辑不严谨,触发了某个条件,那么怎么才能定位到是哪段代码导致的呢?
本文将从四个步骤进行分析,快速定位问题所在,从应用程序的进程入手到具体线程再到应用程序的具体代码,从整体到局部,化繁为简,层层深入,为读者提供了一种线上快速定位排查故障的思路和手段。
二、案例实战
我们以最近出现的一个实际故障为例,介绍怎么定位和解决这类问题。
根据top命令,发现PID为28555的Java进程占用CPU高达200%,出现故障。
通过ps aux | grep PID命令,可以进一步确定是tomcat进程出现了问题。
但是,怎么定位到具体线程或者代码呢?
首先显示线程列表
:
# ps -mp pid -o THREAD,tid,time
找到了耗时最高的线程28802,占用CPU时间快两个小时了!
其次将需要的线程ID转换为16进制格式:
# printf "%x\n" tid
最后打印此进程下线程的堆栈信息:
# jstack pid | grep tid -A 60
找到出现问题的代码了!
现在来分析下具体的代码:ShortSocketIO.readBytes(ShortSocketIO.java:106)
ShortSocketIO是应用封装的一个用短连接Socket通信的工具类。
问题就出在标红的代码部分:
如果this.in.read()返回的数据小于等于0时,循环就一直进行下去了,而这种情况在网络拥塞的时候是可能发生的。
至于具体怎么修改就看业务逻辑应该怎么对待这种特殊情况了。
最后,总结下排查CPU故障的方法和技巧:
1、top命令:Linux命令。可以查看实时的CPU使用情况。也可以查看最近一段时间的CPU使用情况。
2、ps命令:Linux命令。强大的进程状态监控命令。可以查看进程以及进程中线程的当前CPU使用情况。属于当前状态的采样数据。
3、jstack:Java提供的命令。可以查看某个进程的当前线程栈运行情况。根据这个命令的输出可以定位某个进程的所有线程的当前运行状态、运行代码,以及是否死锁等等。
4、pstack:Linux命令。可以查看某个进程的当前线程栈运行情况。
记一次java程序CPU占用过高问题排查
https://puhaiyang.blog.csdn.net/article/details/78663942
JAVA工程,线上应用故障排查系列
http://www.blogjava.net/hankchen/archive/2012/05/09/377738.html
1、
故障
现象客服同事反馈平台系统运行缓慢,网页卡顿严重,多次重启系统后问题依然存在,使用top命令查看服务器情况,发现
CPU
占用
率
过高
。2、
CPU
占用
过高
问题
定位
2.1、
定位
问题进程使用top命令查看资源
占用
情况,发现pid为14063的进程
占用
了大量的
CPU
资源,
CPU
占用
率高达776.1%,内存
占用
率也达到了29.8%[ylp@ylp-web-01 ~]$ toptop - 14:51:10 ...
对于互联网公司,线上
CPU
飙升的问题很常见(例如某个活动开始,流量突然飙升时),按照本文的步骤
排查
,基本1分钟即可搞定!特此整理
排查
方法一篇,供大家参考讨论提高。线上系统突然运行缓慢,
CPU
飙升,甚至到100%,以及Full GC次数过多,接着就是各种报警:例如接口超时报警等。此时急需快速线上
排查
问题。不管什么问题,既然是
CPU
飙升,肯定是查一下耗
CPU
的线程,然后看看GC。
Java
程序
的
CPU
占用
过高
意味着该
程序
在运行过程中消耗了大量的中央处理器(
CPU
)资源。这可能会导致系统性能下降、响应变慢以及其他正在运行的应用
程序
受到影响。
CPU
占用
过高
通常是一个需要关注和解决的问题,因为它可能影响整个系统的稳定性和性能。
定位
docker容器。根据lsns -p PID获取到的信息(jar包名称可
定位
项目)
定位
到docker容器,需人工判断。a、
占用
CPU
最高的PID在jps的列表里,
java
进程运行在服务器,可直接执行jstack PID。b、
占用
CPU
最高的PID不在jps列表里,
java
进程运行在容器中。lsns命令查看
程序
的命名空间 ,如果显示的命名空间信息中有。容器内查看进程ID,ps、jps、top命令都可以。,那么该 PID 很可能在一个 Docker 容器中。jps命令查看当前在服务器执行的
java
程序
。
我们可以使用命令 cat jstack_result.log | grep "
java
.lang.Thread.State" | sort -nr | uniq -c 来对 jstack 的状态有一个整体的把握,如果 WAITING 之类的特别多,那么多半是有问题啦。当然更常见的是我们对整个 jstack 文件进行分析,通常我们会比较关注 WAITING 和 TIMED_WAITING 的部分,BLOCKED 就不用说了。这里介绍如何使用原生top命令来做
定位
具体代码的位置处理。
top命令查看
CPU
、内存等使用情况,这种命令可以动态的获取
cpu
、内存等信息top如果知道具体的业务可以指定对应的进程号top -p pid不过一般
java
服务不仅仅只是一个主线程,还会有很多线程,因此往往需要将线程也给打印出来这里我们会发现COMMAND这一列的字符串显示了线程号(不过是被截断过的),这里我们可以使用-c bw {number} 进行命令的增强显示命令行补充01: 我们可以使用ps命令根据
cpu
使用率进行排序。
Spring cloud微服务广泛应用后,服务的监控和运维压力也与日俱增,经常有服务出现
CPU
或者内存使用率
过高
的告警,那么遇到这样的问题我们该如何
排查
呢?本文介绍了通过系统日志、
java
JDK工具、JVM参数、
linux
系统命令、Arthas诊断工具等方法,
定位
和解决线上
CPU
使用率
过高
、内存使用率
过高
的方法,大家可以根据自己的环境灵活搭配使用上述方法,解决性能问题。