关注我,一个仍存梦想的屌丝程序员,每天为你分享高质量编程博客。
回复 “代金券” 免费获取腾讯云和阿里云代金券
一、发现问题的系统检查
一个管理平台门户网页进统计页面提示请求超时,随进服务器操作系统检查load average超过4负载很大,PID为7163的进程占用到了800%多。
二、定位故障
根据这种故障的一般处理思路,先找出问题进程内CPU占用率高的线程,再通过线程栈信息找出该线程当时在运行的问题代码段,操作如下:
根据思路查看高占用的“进程中”占用高的“线程”,追踪发现7163的进程中16298的线程占用较高,使用命令:
top -Hbp 7163 | awk '/java/ && $9>50'
显示结果:
将16298的线程ID转换为16进制的线程ID。
printf "%x\n" 162983faa
通过jvm的jstack查看进程信息,发现是调用数据库的问题。
jstack 7163 | grep "3faa" -A 30
提示:最后的-A30是日志行数
显示结果:
既然是数据库的问题就检查数据库,思路是先打印了所有在跑的数据库线程,检查后发现跟进情况找到问题表:
打印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;
确认表是否有索引,发现表未创建索引;