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
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Jenkins小项目—代码测试、部署、回滚、keepalived+haproxy调度至tomcat
1.分别配置两台tomcat后端服务的java环境 1)准备jdk8压缩包 [root@tomcat jdk]# pwd /usr/local/src/jdk root@tomcat jdk]# ls jdk-8u211-linux-x64.tar.gz 2)解压jdk压缩包当前目录下并创建软连接 [root@tomcat jdk]# tar xvf jdk-8u211-linux-x64.tar.gz [root@tomcat jdk]# ln -sv jdk1.8.0_211/ jdk 3)配置java的环境变量并生效 [root@tomcat ~]# vim /etc/profile……export JAVA_HOME=/usr/local/src/jdk/jdkexport JRE_HOME=$JAVA_HOME/jreexport CLASSPATH=$JAVA_HOME/lib/:$JRE_HOME/libexport TOMCAT_HOME=/usr/local/src/tomcat/tomcatexport PATH=$PATH:$JAVA_HOME/bin:$JRE_...
- 下一篇
Trunk链路的配置、以太网通道的作用及实验(全程操作,可跟做!)
本次我们进行的是Trunk链路的配置及以太网通道实验 实验环境:软件准备我之前文章里提到的GNS3、CRT和Wireshark首先我们进入GNS3界面,点击左侧的路由器图标,拖取两台路由器到拓扑操作区,再点击PC图标,选择VPC拖取四台PC机到拓扑操作区;同时对两台路由器进行配置设置(改图标为交换机、更改设备名为sw1/2、添加二层业务单板、设置磁盘空间为128Mb)接下来是连线的方式如下:1.PC1到SW1的F1/02.PC2到SW1的F1/13.SW1的F1/2到SW2的F1/24.PC3到SW2的F1/05.PC4到SW2的F1/1设置好之后点击全部开启,然后显示全部端口,结果及操作如下图:接下来我们要划分VLAN:1.PC1和PC3为vlan102.PC2和PC4为vlan20 IP地址设置为:PC1:192.168.10.10/24PC2:192.168.10.20/24PC3:192.168.10.30/24PC4:192.168.10.40/24 接下来我们进行相对应的配置之后进行互通测试如果可以连通的话PC1是可以和PC3通讯的,PC2是可以和PC4通讯的,但是PC1是...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker使用Oracle官方镜像安装(12C,18C,19C)