添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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 使用率 过高 、内存使用率 过高 的方法,大家可以根据自己的环境灵活搭配使用上述方法,解决性能问题。