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

本文讲述了在遇到一个管理平台门户网页请求超时的问题时,如何通过系统检查、线程分析、数据库排查,最终发现是由于未加索引的数据库查询导致的CPU占用过高。通过清理数据和创建索引,成功将CPU占用降低到40%。此外,还提到了mysql优化手册和其他资源的获取方式。
摘要由CSDN通过智能技术生成

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;

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值