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

(友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hankchen

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

根据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,http://www.blogjava.net/hankchen

转载于:https://www.cnblogs.com/diegodu/p/9244502.html

cpu高 load 高 内存高 io 高怎么排查相关推荐

  1. 计算机内存占用过高怎么办,电脑内存占用过高怎么办?

    当电脑内存占用过高,内存不足,磁盘空间不够时,电脑就会出现卡顿不流畅,转圈圈,变慢变卡的现象.那么,如何解决内存占用过高,电脑卡这个问题呢?我们一起来看看吧! 一.关闭电脑进程中不常用的程序 在电脑中 ...

  2. 电脑内存占用过高怎么办 电脑内存占用过高解决方法

    电脑内存占用过高怎么办?1,点击开始按钮,在搜索框中,输入服务,在弹出的搜索结中,点击打开服务 2,这里有很系统自动加载的一些服务,有些服务我们是用不到的,但系统会自动加载,占用不少内存,我们可以把一 ...

  3. Linux查询CPU、磁盘、内存、IO使用率

    注: 部分概念介绍来源于网络 一.查看CPU使用率 1. top 命令 [root@sss ~]# top top - 16:54:38 up 7 days,  5:13,  3 users,  lo ...

  4. Linux内存占用过高排查过程

    一朋友找我说,他们一个项目的服务器内存占用率太高了,让我帮忙看下怎么回事.我正好不是太忙就帮他看了下,并记录如下. 1 查看服务器状态 他的服务器是阿里云的ECS,系统是 CentOS Linux r ...

  5. 【Java 虚拟机原理】Dalvik 虚拟机 ( 简介 | CPU 指令集 | Dalvik 虚拟机内存 )

    文章目录 一.Dalvik 虚拟机简介 二.CPU 指令集 三.Dalvik 虚拟机内存 一.Dalvik 虚拟机简介 Android 5.05.05.0 之前使用的是 Dalvik 虚拟机 , 5. ...

  6. 高内存占用或高CPU占解决办法

    服务性能排查一般就两种:高内存占用或高CPU占用,需要具体问题具体分析.比如应用程序高内存占用,可能因为大文件读取.频繁IO,内存消耗频繁,导致频繁GC,进一步占用内存和CPU:比如应用程序高CPU占 ...

  7. linux创建云主机内存不足,云主机DC2 Linux系统CPU与内存占用率高导致无法登录

    本文档介绍 Linux 云服务器因 CPU 与内存占用率高导致无法登录等问题的排查方法和解决方案. 登录与查看系统负载登录云服务器.通过第三方软件远程登录 Linux 云服务器( Linux 云服务器 ...

  8. 高并发编程-通过volatile重新认识CPU缓存 和 Java内存模型(JMM)

    文章目录 概述 volatile定义 CPU缓存 相关CPU术语 CPU缓存一致性协议MESI 带有高速缓存的CPU执行计算的流程 CPU 多级的缓存结构 Java 内存模型 (JMM) 线程通信的两 ...

  9. 宝塔可以修改服务器内存限制吗,宝塔内存使用率很高的解决方法 cpu过高这样做!...

    不得不说,宝塔面板还是比较好用的,尤其是在用户体验方面做得不错,值得站长朋友们使用.倡萌会继续发布使用宝塔面板的一些技巧文章,欢迎继续关注WordPress大学. 开启监控功能 监控功能对于了解服务器 ...

  10. java 内存很高_Java服务器内存和CPU占用过高的原因

    一.内存占用过高 1.造成服务器内存占用过高只有两种情况:内存溢出或内存泄漏 (1)内存溢出:程序分配的内存超出物理内存的大小,导致无法继续分配物理内存,出现OOM报错. (2)内存泄漏:不再调用的对 ...

最新文章

  1. 离开大公司,我才发现世界多残酷
  2. BZOJ 1901 Dynamic Rankings(线段树+treap)
  3. L1-009 N个数求和(分数运算模板)(34行代码AC)
  4. java spring hiberate_Java程序员:Spring Boot和Hibernate一起使用的技巧
  5. 来自官方文档的Ubuntu 16.04 + tensorflow-GPU 配置
  6. 配置java时找不到匹配项,检索项目的父项时出错:找不到与给定名称匹配的资源...
  7. 一生只有一个配偶的动物,如果一方死亡了,另一方会怎么办?
  8. 如何解决网络连接配置和dns异常
  9. 大一python实验二答案_python实验二
  10. 联想小新Air2020ill版换硬盘及安装Win11详细过程
  11. 全网最简单的方法QQ透明头像设置方法(小白教程)几分钟搞定
  12. vos3000外呼系统讯时O口网关加密注册 VOS 配置方法
  13. 计算机系统的主要部件和功能,《计算机系统的组成》教案
  14. Qt扫盲-QSqlQuery理论总结
  15. U9二次开发之BP定时任务插件开发
  16. 第三代酷睿i3处理器_英特尔最新10代处理器发布:游戏世界最快
  17. Java进阶——注解
  18. OSPF基础,浅显易懂
  19. 正则——只能允许是汉字、拼音和数字的正则表达式
  20. 冲鸭!羊毛薅起来!当当618专享不到4折,Python书籍囤起来!

热门文章

  1. 结合swiper使用图片懒加载
  2. 配置.net连接数据库的配置文件
  3. C#调用存储过程详解
  4. 次短路 Yen氏算法 凸包
  5. 百度-北大在Kaggle发起自动驾驶环境下的汽车6-DOF预测挑战赛
  6. Tensorflow Lite人体姿势跟踪功能上线:基于PosNet的实时人体姿态估计
  7. 谷歌AI:根据视频生成深度图,效果堪比激光雷达
  8. 美国IARPA发起公共安全预测机器学习挑战赛(总奖池10万美金)
  9. 升级! Facebook 模型全部迁移至 PyTorch 框架
  10. 2020-11-08