Java进程CPU占用高导致的网页请求超时的故障排查

一、发现问题的系统检查:
  一个管理平台门户网页进统计页面提示请求超时,随进服务器操作系统检查load average超过4负载很大,PID为7163的进程占用到了800%多。

二、定位故障
  根据这种故障的一般处理思路,先找出问题进程内CPU占用率高的线程,再通过线程栈信息找出该线程当时在运行的问题代码段,操作如下:

2.1、根据思路查看高占用的“进程中”占用高的“线程”,追踪发现7163的进程中16298的线程占用较高,使用命令:

top -Hbp 7163 | awk ‘/java/ && $9>50‘

显示结果:

2.2、将16298的线程ID转换为16进制的线程ID。

printf "%x\n" 16298
3faa

2.3、通过jvm的jstack查看进程信息,发现是调用数据库的问题。

jstack 7163 | grep "3faa" -A 30

显示结果:

2.4、既然是数据库的问题就检查数据库,思路是先打印了所有在跑的数据库线程,检查后发现跟进情况找到问题表:

2.4.1、打印mysql现有进程信息,并把信息生成log文件,使用的命令如下:

mysql -uroot -p -e "show full processlist" > mysql_full_process.log

2.4.2、过滤log文件,发现查询最多的表,使用的命令如下:

grep Query mysql_full_process.log

2.4.3、确认表中数据量,发现表中已经有将近300万条数据,判断问题是查询时间过长导致的,使用的命令如下:

use databases_name;
select count(1) from table_name;

2.4.4、确认表是否有索引,发现表未创建索引;

show create table table_name\G

三、确认及处理问题:
  询问了研发表的数据是否重要,确认不重要,检查字段有时间字段,根据时间确认只留一个月的数据,操作如下:

3.1、清理数据只保留一个月的数据,清理后数据只剩下4000多,使用命令如下;

delete from table_name where xxxx_time < ‘2019-07-01 00:00:00‘ or xxxx_time is null;

3.2、由于表未加索引,所以给表创建索引,使用命令如下:

alter table table_name add index (device_uuid);

3.3、检查索引是否创建,已经有device_uuid的索引。

show create table table_name;

四、结果:
  处理后进程的CPU占用到了40%,本次排查主要用到了jvm进程查看及dump进程详细信息的操作,确认是由数据库问题导致的原因,并对数据库进行了清理并创建了索引。

五、其他:
  在处理问题后,又查询了一下数据库相关问题的优化,有方案说在mysql配置文件中添加innodb_buffer_pool_size参数也可以优化查询查询时间,但该参数的意义把数据放到内存了,也就是说如果数据更新了,还会导致buffer失效,通常的优化方法还是添加索引。该方法添加参数具体如下:
innodb_buffer_pool_size=4G

原文地址:https://blog.51cto.com/rongshu/2426712

时间: 2024-08-07 02:31:29

Java进程CPU占用高导致的网页请求超时的故障排查的相关文章

Java进程CPU使用率高排查

近期java应用,CPU使用率一直很高,经常达到100%,通过以下步骤完美解决,分享一下. 1.jps 获取Java进程的PID. 2.jstack pid >> java.txt 导出CPU占用高进程的线程栈. 3.top -H -p PID 查看对应进程的哪个线程占用CPU过高. 4.echo "obase=16; PID" | bc 将线程的PID转换为16进制. 5.在第二步导出的Java.txt中查找转换成为16进制的线程PID.找到对应的线程栈. 6.分析负载高

java进程CPU飙高

因为这段时间一直在弄监控,但是工作还是在进行中 因为机器不多,所以今天早上巡检了一下,看到一台生产机器上的CPU飙高 top 然后就请出了大神工具JVM 具体JVM的介绍看:http://www.cnblogs.com/smail-bao/p/6027756.html CPU飙高的话,我们就是用jstack的工具 首先我们使用top查出来是哪个进程导致的CPU飙高 这里我们看到是PID号为11506的进程 这个进程对应的项目是哪个(为了后面可以把错误的定位发给相关的开发人员看),使用ps -au

Linux下java进程CPU占用率高分析方法

Linux下java进程CPU占用率高分析方法 在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况.这种情况发生时,我们怎么去找出原因并解决. 一般解决方法是通过top命令找出消耗资源高的线程id,利用strace命令查看该线程所有系统调用 1. 通过top命令找到可疑进程PID top - 09:37:18 up 70 days, 16:29, 2 users, load average: 1.13, 1.04, 0.97 Tasks: 105 total, 1 running

Nodejs mkdirP 模块导致CPU占用高的问题

Nodejs mkdirP 模块导致CPU占用高的问题 近期将nodejs项目部署到服务器上并启动时,发现node进程的cpu占用率在40%左右,当时表示非常不解,刚启动的服务并没有运行什么需要大量消耗cpu的逻辑,且此时还未有请求发送到服务器端. 鉴于这种情况,只能猜测是某段程序在初始化一些东西的时候异常,所以才导致了这种情况. 经过对代码的排查后,最终锁定出为题的代码块如下: router.use(multer({ dest: config.uploadDir, limits:{ fileS

Java进程CPU高

Java进程CPU高1-1) 查看$PID进程里面的线程CPU占用状况    top -H -p $PID1-2) 显示线程列表,并按照CPU占用高的线程排序     ps -mp $PID -o THREAD,tid,time | sort -rn2) 找出CPU消耗较多的线程id, 并转换成16进制     printf "%x\n" $TID3) 查询出具体的线程状态     jstack $PID | grep -A 10 0x$TID

Linux下java进程CPU占用率高-分析方法

今天登陆同事的一台gateway 开始以为hive环境登陆不了了,仔细一看看了下是因为机器很卡,我每次等几秒没登陆就ctrl+c了,看了下是有个java进程cpu:340.4%  mem:14.6% 一般解决方法是通过top命令找出消耗资源高的线程id,利用strace命令查看该线程所有系统调用 1. 通过top命令找到可疑进程PID top 一下 可以看出java进程CPU利用率一直保持100%,稳居不下,找到PID 24138 2. 找出消耗资源最高的线程 top -H -p  29580 

C# Winform程序CPU占用高的原因和解决方法

程序CPU占用高的可能原因: 1.存在死循环: 为什么死循环会导致CPU占用高呢?      虽然分时操作系统是采用时间片的机制对CPU的时间进行管理的,也就是说到了一定时间它会自动从一个进程切换到下一个进程.但是,当进入别的进程后,若该进程告诉系统它现在不需要做什么,不需要那么多的时间,这个时候,系统就会切换到下一个进程,当切换到死循环所在进程后,由于它一直在循环,永远告诉系统它有事情做(实质仅在死循环,没做任何事),那么系统就尽可能的将其他进程省下了的时间让它做死循环了,CPU占用不高才怪咧

SQLSERVER排查CPU占用高的情况

SQLSERVER排查CPU占用高的情况 今天中午,有朋友叫我帮他看一下数据库,操作系统是Windows2008R2 ,数据库是SQL2008R2 64位 64G内存,16核CPU 硬件配置还是比较高的,他说服务器运行的是金蝶K3软件,数据库实例里有多个数据库 他说是这几天才出现的,而且在每天的某一个时间段才会出现CPU占用高的情况 内存占用也很高,占用了30个G -----------------------------------------------华丽的分割线-------------

jstack命令定位java程序CPU利用率高的代码位置

高手是怎么使用jstack精确找到异常代码的(java程序CPU利用率高的情况) 请jstack神器来帮忙 本文介绍Linux环境下使用jstack定位问题的秘笈s1.[top命令]找到CPU利用率持续比较高的进程,获取[进程号],此处PID为 1289112891 s2.[ps p 12891 -L -o pcpu,pid,tid,time,tname,cmd 命令]找到上述进程中,CPU利用率比较高的[线程号TID](十进制数),此处为 12946ps p 12891 -L -o pcpu,