cpu高 load 高 内存高 io 高怎么排查
一个应用占用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,这里有很系统自动加载的一些服务,有些服务我们是用不到的,但系统会自动加载,占用不少内存,我们可以把一 ...
- Linux查询CPU、磁盘、内存、IO使用率
注: 部分概念介绍来源于网络 一.查看CPU使用率 1. top 命令 [root@sss ~]# top top - 16:54:38 up 7 days, 5:13, 3 users, lo ...
- Linux内存占用过高排查过程
一朋友找我说,他们一个项目的服务器内存占用率太高了,让我帮忙看下怎么回事.我正好不是太忙就帮他看了下,并记录如下. 1 查看服务器状态 他的服务器是阿里云的ECS,系统是 CentOS Linux r ...
- 【Java 虚拟机原理】Dalvik 虚拟机 ( 简介 | CPU 指令集 | Dalvik 虚拟机内存 )
文章目录 一.Dalvik 虚拟机简介 二.CPU 指令集 三.Dalvik 虚拟机内存 一.Dalvik 虚拟机简介 Android 5.05.05.0 之前使用的是 Dalvik 虚拟机 , 5. ...
- 高内存占用或高CPU占解决办法
服务性能排查一般就两种:高内存占用或高CPU占用,需要具体问题具体分析.比如应用程序高内存占用,可能因为大文件读取.频繁IO,内存消耗频繁,导致频繁GC,进一步占用内存和CPU:比如应用程序高CPU占 ...
- linux创建云主机内存不足,云主机DC2 Linux系统CPU与内存占用率高导致无法登录
本文档介绍 Linux 云服务器因 CPU 与内存占用率高导致无法登录等问题的排查方法和解决方案. 登录与查看系统负载登录云服务器.通过第三方软件远程登录 Linux 云服务器( Linux 云服务器 ...
- 高并发编程-通过volatile重新认识CPU缓存 和 Java内存模型(JMM)
文章目录 概述 volatile定义 CPU缓存 相关CPU术语 CPU缓存一致性协议MESI 带有高速缓存的CPU执行计算的流程 CPU 多级的缓存结构 Java 内存模型 (JMM) 线程通信的两 ...
- 宝塔可以修改服务器内存限制吗,宝塔内存使用率很高的解决方法 cpu过高这样做!...
不得不说,宝塔面板还是比较好用的,尤其是在用户体验方面做得不错,值得站长朋友们使用.倡萌会继续发布使用宝塔面板的一些技巧文章,欢迎继续关注WordPress大学. 开启监控功能 监控功能对于了解服务器 ...
- java 内存很高_Java服务器内存和CPU占用过高的原因
一.内存占用过高 1.造成服务器内存占用过高只有两种情况:内存溢出或内存泄漏 (1)内存溢出:程序分配的内存超出物理内存的大小,导致无法继续分配物理内存,出现OOM报错. (2)内存泄漏:不再调用的对 ...
最新文章
- 离开大公司,我才发现世界多残酷
- BZOJ 1901 Dynamic Rankings(线段树+treap)
- L1-009 N个数求和(分数运算模板)(34行代码AC)
- java spring hiberate_Java程序员:Spring Boot和Hibernate一起使用的技巧
- 来自官方文档的Ubuntu 16.04 + tensorflow-GPU 配置
- 配置java时找不到匹配项,检索项目的父项时出错:找不到与给定名称匹配的资源...
- 一生只有一个配偶的动物,如果一方死亡了,另一方会怎么办?
- 如何解决网络连接配置和dns异常
- 大一python实验二答案_python实验二
- 联想小新Air2020ill版换硬盘及安装Win11详细过程
- 全网最简单的方法QQ透明头像设置方法(小白教程)几分钟搞定
- vos3000外呼系统讯时O口网关加密注册 VOS 配置方法
- 计算机系统的主要部件和功能,《计算机系统的组成》教案
- Qt扫盲-QSqlQuery理论总结
- U9二次开发之BP定时任务插件开发
- 第三代酷睿i3处理器_英特尔最新10代处理器发布:游戏世界最快
- Java进阶——注解
- OSPF基础,浅显易懂
- 正则——只能允许是汉字、拼音和数字的正则表达式
- 冲鸭!羊毛薅起来!当当618专享不到4折,Python书籍囤起来!