一篇 CPU 占用高,导致请求超时的故障排查

image

关注我,一个仍存梦想的屌丝程序员,每天为你分享高质量编程博客。

回复 “代金券”  免费获取腾讯云和阿里云代金券

image

一、发现问题的系统检查

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

image

二、定位故障

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

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

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

显示结果:

image

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

printf "%x\n" 162983faa

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

jstack 7163 | grep "3faa" -A 30

提示:最后的-A30是日志行数
显示结果:

image

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

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

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

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

grep Query mysql_full_process.log

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

use databases_name;select count(1) from table_name;

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

show create table table_name\G

三、确认及处理问题

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

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

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

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

alter table table_name add index (device_uuid);

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

show create table table_name;

四、结果

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

五、其他

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

回复 “ mysql ” 获取超级详细的mysql 优化手册**

innodb_buffer_pool_size=4G

回复关键字:
1、回复 “10”  查看 最有价值的10个spring boot开源项目

2、回复 “国旗”  获取国旗头像教程

3、回复 “Ubuntu”  获取100 个最佳 Ubuntu 应用 和 linux神器

4、回复 “ idea ”  获取**最新idea破解教程 和 装逼神奇

5、回复 “ ssh ”  获取史上最好的 ssh工具  支持mac

6、回复 “ 代金券 ”  腾讯云和阿里云代金券

7、回复 “免费” 可以获取免费的java面试资源和学习视频

image

推荐阅读:

springboot集成ES实现磁盘文件全文检索

oauth2 认证服务器 资源服务器分离 使用Redis存储Token

Spring Boot最核心的27个注解,你了解多少?

Spring-Boot-Starter开发手册全集

MySQL优化-一篇文章就够了(转发加收藏吧)

程序员一般可以从什么平台接私活?

看完这14张思维导图,你的python才算入门

手把手讲解 OkHttp硬核知识点(1)

Python 爬取微信公众号文章和评论 (有源码)

Java 开发人员常用的服务配置(Nginx、Tomcat、JVM、Mysql、Redis)

腾讯电话面试总结—Linux运维工程师

python爬虫:(嘿嘿嘿)爬你喜欢的照片

面试官问我:一个 TCP 连接可以发多少个 HTTP 请求?我竟然回答不上来…

教你迅雷&百度非会员也能享受不限速的特权

Chrome开发者工具(DevTools)使用技巧

100个最有价值的开源项目–微信开发系列

IDEA 2019 最新激活教程

一台Linux服务器可以负载多少个连接?(底部有福利)

免责声明:

1.本公众号所转载文章均来自公开网络。

2.如果出处标注有误或侵犯到原著作者权益,请联系删除。

3.转载本公众号中的文章请注明原文链接和作者,否则产生的任何版权纠纷均与本公众号无关。

发布了173 篇原创文章 · 获赞 195 · 访问量 45万+

猜你喜欢

转载自blog.csdn.net/chenjianandiyi/article/details/102952299