首页 > 其他分享 >线上应用故障排查之一:高CPU占用

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

时间:2023-06-01 15:31:39浏览次数:34  
标签:totalread 排查 recBuf 线程 线上 byte CPU recIndex


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


一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环。

以我们最近出现的一个实际故障为例,介绍怎么定位和解决这类问题。

线上应用故障排查之一:高CPU占用_操作系统

根据top命令,发现PID为28555的Java进程占用CPU高达200%,出现故障。

通过ps aux | grep PID命令,可以进一步确定是tomcat进程出现了问题。但是,怎么定位到具体线程或者代码呢?

首先显示线程列表:

ps -mp pid -o THREAD,tid,time

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

找到了耗时最高的线程28802,占用CPU时间快两个小时了!

其次将需要的线程ID转换为16进制格式:

printf "%x\n" tid

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

最后打印线程的堆栈信息:

jstack pid |grep tid -A 30

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

找到出现问题的代码了!

现在来分析下具体的代码: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命令。可以查看某个进程的当前线程栈运行情况。

标签:totalread,排查,recBuf,线程,线上,byte,CPU,recIndex
From: https://blog.51cto.com/u_8400305/6394792

相关文章

  • 使用taskset命令让进程运行在指定CPU上
    taskset命令让进程运行在指定CPU上taskset命令,可用于进程的CPU调优,可以把云服务器上运行的某个进程,指定在某个CPU上工作。#1、执行如下命令,查看服务器CPU核数cat/proc/cpuinfo#关于CPU的核心参数说明#processor:指明第几个CPU处理器#cpucores:指明每个处理器的核心数......
  • linux 性能自我学习 ———— cpu 切换带来的性能损耗 [二]
    前言我们知道现在操作系统,都是多进程和多线程,那么会有一个操作系统帮助我们去切换进程和线程,这个是要消耗cpu资源的,那么就来了解一下cpu资源消耗情况。正文一般是下面几个场景切换:进程上下文切换线程上下文切换中断上下文切换在了解进程切换的时候,需要了解另外一个......
  • 变更线上数据库表字段类型之方案
    假设yy_yp_yppcmx表,rkpcs字段最初设计的类型为varchar,上线后由于业务中传入数据较长,varchar类型已经装不下了(比如Oracle中varchar超过4K,将自动转为long类型,会导致插入失败),急需将该字段改为CLOB类型,稳妥的步骤如下:新增一个临时字段类型是CLOB的ALTERTABLEyy_yp_yppcmxADD......
  • Linux环境下耗尽cpu占用率的指令
     模拟cpu打满foriin`seq1$(cat/proc/cpuinfo|grep"physicalid"|wc-l)`doddif=/dev/zeroof=/dev/null&done 模拟内存打满生产大文件ddif=/dev/zeroof=testbs=1Mcount=2000然后vi打开 vimtest&这种也可以。使用top命令查看linux系统cpu使用情况:#......
  • AWR报告参数DB TIME和DB CPU分析
    什么是AWR?ASH(ActiveSessionHistory,活动会话历史信息)、AWR(AutomaticWorkloadRepository,自动负载信息库)、ADDM(AutomaticDatabaseDiagnosticMonitor,数据库自动诊断监视工具)是Oracle性能调整的三把利剑,需要深入地了解,但是面试一般都问得比较简单,主要问到的是AWR。Oracle性能......
  • 【windowns】记一次天玥安全网关无法连接运维机排查
    问题背景:在用天玥安全网关来连接项目中的运维机时,发现无法连接报网络连接错误(报错图如下:),但是通过同网络的区域的其它电脑是可以正常远程到目标主机。解决方案:经过排查发现,是因为之前有做加固操作,WindowsServer远程桌面SSL/TLS漏洞修复  修复过程如下:1、运行“gpedit.m......
  • 简单了解一下国产CPU
    这几天在B站、油管上刷了一些国产芯片真实上手视频,顺便自己也梳理一下芯片的一些基本概念,以及在美国科技制裁和围堵的情况下,国产CPU的发展情况。文末有我整理的一张思维导图,hopeufinditinformative! 01 缩写表/术语表IC:IntegratedCircuit集成电路IP:IntellectualProp......
  • k8s节点宕机排查
    查看集群信息发现节点宕机 排查:1、查看服务器的物理环境free-mh/df-h2、查看内存是否溢出,磁盘空间是否够用,经查均在正常使用范围内;3、top查看cpu使用状态,在可用范围内;4、再查master组件scheduer,controller-manager,apiserver等都在正常运行;5、查看node详细信息[root@master~......
  • Oracle 性能慢排查脚本
    查看总消耗时间最多的前100条SQL语句select*from(selectv.sql_id,v.child_number,v.sql_text,last_load_time,v.PARSING_USER_ID,ROUND(v.ELAPSED_TIME/1000000/(CASEWHEN(EXECUTIONS=0ORNVL(EXECUTIONS,1)=1)THEN1ELSEEXECUTIONSEND),2)"执行......
  • 检测CPU,内存,磁盘使用率shell
    检测CPU,内存,磁盘使用率shell 1.检测CPU,内存,磁盘使用率超过80%,则发送邮件告警#!/bin/bash#当前主机ipHOST=$(ipashoweth0|grep'\inet\b'|awk'{print$2}'|sed's/\/.*//')#告警邮箱[email protected]#磁盘使用百分比阈值DISK_USAGE_THRESHOLD=80#CPU......