`

排查线上应用高CPU占用故障

阅读更多
一个应用占用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 30

找到出现问题的代码了!
现在来分析下具体的代码:ShortSocketIO.readBytes(ShortSocketIO.java:106)
ShortSocketIO是应用封装的一个用短连接Socket通信的工具类。readBytes函数的代码如下:
public byte[] readBytes(int length) throws IOException {
    if ((this.socket == null) || (!this.socket.isConnected())) {
        throw new IOException("++++ attempting to read from closed socket");
    }
    byte[] result = null;
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    if (this.recIndex >= length) {
           bos.write(this.recBuf, 0, length);
           byte[] newBuf = new byte[this.recBufSize];
           if (this.recIndex > length) {
               System.arraycopy(this.recBuf, length, newBuf, 0, this.recIndex - length);
           }
           this.recBuf = newBuf;
           this.recIndex -= length;
    } else {
           int totalread = length;
           if (this.recIndex > 0) {
                totalread -= this.recIndex;
                bos.write(this.recBuf, 0, this.recIndex);
                this.recBuf = new byte[this.recBufSize];
                this.recIndex = 0;
    }
    int readCount = 0;
    while (totalread > 0) {
         if ((readCount = this.in.read(this.recBuf)) > 0) {
                if (totalread > readCount) {
                      bos.write(this.recBuf, 0, readCount);
                      this.recBuf = new byte[this.recBufSize];
                      this.recIndex = 0;
               } else {
                     bos.write(this.recBuf, 0, totalread);
                     byte[] newBuf = new byte[this.recBufSize];
                     System.arraycopy(this.recBuf, totalread, newBuf, 0, readCount - totalread);
                     this.recBuf = newBuf;
                     this.recIndex = (readCount - totalread);
             }
             totalread -= readCount;
        }
   }
}
问题就出在标红的代码部分。如果this.in.read()返回的数据小于等于0时,循环就一直进行下去了。而这种情况在网络拥塞的时候是可能发生的。
至于具体怎么修改就看业务逻辑应该怎么对待这种特殊情况了。

最后,总结下排查CPU故障的方法和技巧有哪些:
1、top命令:Linux命令。可以查看实时的CPU使用情况。也可以查看最近一段时间的CPU使用情况。
2、PS命令:Linux命令。强大的进程状态监控命令。可以查看进程以及进程中线程的当前CPU使用情况。属于当前状态的采样数据。
3、jstack:Java提供的命令。可以查看某个进程的当前线程栈运行情况。根据这个命令的输出可以定位某个进程的所有线程的当前运行状态、运行代码,以及是否死锁等等。
4、pstack:Linux命令。可以查看某个进程的当前线程栈运行情况。
(友情提示:本博文章欢迎转载,但请注明出处:hankchen,

pid为java进程id
用top -H -p pid命令查看进程内各个线程占用的CPU百分比



top -H -p 4076




http://www.blogjava.net/hankchen)
  • 大小: 65.6 KB
  • 大小: 133.1 KB
分享到:
评论

相关推荐

    线上应用故障排查之一:高CPU占用

    本篇文章将探讨一个常见的问题——"线上应用故障排查之一:高CPU占用"。高CPU占用可能导致系统响应变慢,影响用户体验,甚至可能导致服务崩溃。解决这个问题需要深入理解应用程序的运行机制以及系统资源的管理。 ...

    一种CPU占用过高的故障定位分析方法

     CPU占用过高是LINUX服务器出现常见的一种故障,也是程序员线上排查错误必须掌握的技能,我们经常需要找出相应的应用程序并快速地定位程序中的具体代码行数,本文将介绍一种CPU占用过高的一种处理思路,文中采用四...

    Java线上故障排查方案(2).pdf

    系统异常通常指的是CPU占用率过高、磁盘使用率100%、系统可用内存低等情况;而业务异常则可能包括服务运行一段时间自动退出、服务间调用时间过长、多线程并发异常、死锁等问题。在进行故障排查时,第一步便是问题的...

    Java线上故障排查方案.rar

    1. CPU分析:使用jstack分析线程状态,找出CPU占用高的原因。 2. 内存分析:使用jmap、jhat或MAT(Memory Analyzer Tool)进行堆内存分析,定位内存泄漏。 3. 响应时间:监控请求响应时间,结合调用链路分析,找出...

    Java线上故障排查方案.pdf

    1. **系统异常**:例如CPU占用率过高、磁盘空间100%满、系统可用内存过低等。 2. **业务异常**:如服务运行一段时间后自动退出、服务间调用耗时过长、多线程并发处理时出现问题、线程死锁等。 #### 三、如何定位...

    线上故障排查全套路,总有一款适合你1

    可以使用`ps`找到目标进程的PID,然后使用`top -H -p pid`找出CPU占用高的线程。将PID转换为16进制后,通过`jstack pid | grep 'nid' -C5 --color`查看堆栈详情。重点关注`WAITING`和`TIMED_WAITING`状态的线程,...

    线上故障定位分析全套方案

    本文将详细介绍一套线上故障排查的全面方案,涵盖CPU、磁盘、内存和网络四个关键层面。 首先,CPU异常是常见的故障类型。CPU使用率过高可能是由于业务逻辑中的死循环、频繁的垃圾回收(GC)或者上下文切换过于频繁...

    MySQL线上常见故障剖析

    ### MySQL线上常见故障剖析 #### 一、故障概述与分类 在MySQL的日常运维中,经常会出现各种各样的故障,这些故障可能源自于不同的层面,包括但不限于应用层、数据库层、操作系统层等。通过对这些故障的深入分析,...

    Arthas - Java 诊断利器.docx

    Arthas,全名 Alibaba Arthas,是一个强大的开源Java诊断工具,由阿里巴巴开发并维护。这个工具的主要目的是帮助...通过熟练掌握Arthas,开发者可以在面对复杂问题时更加从容,及时解决线上故障,保障服务的高可用性。

    线上系统性问题定位与方法论.docx

    基本的疑难排查步骤包括:执行 top 命令记录 CPU 使用率,执行 free 命令记录内存使用率,使用 ps 命令记录进程信息,使用 jstack 收集线程信息,使用 jstat 视图 Old 区占用率,使用 jmap 保留内存信息等。...

    IBM堆内存对象分析工具

    线上故障主要会包括 CPU、内存、磁盘以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍。基本上出问题就是 df、free、top,然后依次 使用jstack、jmap,具体问题...

    Godeyes_Android_V2.1_(for_AndroidStudio).zip

    报告通常包括异常类型、堆栈跟踪、设备信息等关键数据,这使得开发者能迅速定位问题源头,缩短故障排查时间。对于线上应用,这种即时的崩溃报告尤其重要,因为它可以帮助开发者迅速响应用户反馈,修复问题,提高应用...

    arthas培训文档arthas培训文档

    7. **CPU过高排查**:Arthas提供CPU快照分析,协助定位CPU占用高的原因。 8. **日志级别动态调整**:在线更新日志等级为debug,获取更详细的问题排查信息。 【Arthas常用命令详解】 - **jad命令**:反编译JVM中的...

    唯品会java分析工具vjtop

    3. **CPU使用率监控**:VJTop可以实时监控Java应用的CPU使用率,帮助找出CPU占用过高的线程,分析其执行的代码,从而优化性能。 4. **方法耗时统计**:通过追踪方法调用耗时,VJTop能帮助开发者识别出性能瓶颈,...

    以线上实例来看,内存泄漏的图文解决方案.docx

    本文将以一个具体的线上实例为背景,介绍如何逐步排查并解决内存泄漏问题。通过图文并茂的方式,帮助读者更好地理解内存泄漏的诊断方法。 #### 二、问题背景 在一个项目中,开发团队新上线了一个API接口,并选择了...

    行业-63 案例实战:线上数据库莫名其妙的随机性能抖动优化(下)l.rar

    通过收集CPU使用率、内存占用、磁盘I/O、网络流量等系统资源监控数据,结合数据库日志(如慢查询日志),找出性能波动的时间点和关联操作。 2. **SQL查询优化**:检查慢查询日志,找出导致性能下降的SQL语句。分析...

    android 岗位职责

    - **性能优化**:对应用进行性能分析,如内存泄漏检测、CPU占用率监控,提高应用响应速度和运行效率。 - **模块化开发**:实现模块化的代码结构,便于代码复用和后期维护。 - **集成第三方库**:集成并配置各种第...

    Java 运行时监控

    - **ELK (Elasticsearch, Logstash, Kibana)** 或 **Prometheus + Grafana**:这些现代日志和监控解决方案能实时收集、分析和可视化日志数据,提高故障排查效率。 6. **应用服务器监控** - **Tomcat、Jetty等应用...

    云原生微服务下混沌工程实践.pdf

    ChaosBlade支持多种技术栈和资源类型,如操作系统的CPU负载、内存占用、网络延迟等,以及容器服务、微服务、云平台等。 混沌实验工具可以用来进行各种故障注入测试,比如: - CPU负载:模拟CPU使用率上升导致的...

    技术团队如何为金融系统保驾护航1

    3. 故障排查效率:培训开发人员快速定位和解决问题,减少故障持续时间。 4. 优先级排序:随着问题增多,确定优先级至关重要,关键问题需优先解决。 5. 性能监控:通过监控系统CPU、内存使用情况,及时发现并定位性能...

Global site tag (gtag.js) - Google Analytics