记录用户反应程序相应很慢,甚至卡死处理
前言
今早突然用户群里很多人再说系统很卡,页面半天出不来,甚至有页面超时报错的情况. 嗯?嗯?嗯? 什么情况,怎么会这样,当时我们是一脸疑惑, 之前也没有发生过这种情况, 没办法,于是就开始排查了
过程
项目是一个比较简单的前后分离架构, 后端是war包部署在tomcat上,因为项目的特殊性,只有特定的用户使用,所以访问量是不大的
早上用户不断反应之后,我们就开始排查,先看看日志,正常打印,但是是间隔性的,一会打印一下,当时没在意,以为就是正常访问的间隔行
因为前端放在外网,后端放在内容,中间有很多层网关转发,于是又开始从这排查,因为以前发生过突然无法访问,都是网关的问题,要么是路径配错了,要么是网关服务突然挂了
结果不是,因为用户反映的是很卡,但不是不能访问,我就想会不会是哪里数据突然集中访问,数据太大卡住了,于是就先随便访问了个服务器接口,果然,一直转,很久才有返回结果, 应该是后台的哪个共用服务被堵死了,当时用Xshell还看了下top
信息,好家伙, tomcat直接爆了啊, cpu占用率一直99%+ ,因为卡顿,用户一直再刷新访问, 导致整个服务压力就上来了
解决
其实很简单粗暴,直接把服务停了,两分钟后重启,就全部恢复正常了
最主要的是找到这次问题的原因,及后续的处理方案
最开始在网上找看有没有类似的情况,确实也找到了一些,可参考[传送门]
但文章中的有些命令我这是无法执行的,所以我用不了,万幸的是,tomcat配置了很详细的日志,因此直接在日志中找原因即可,后续发现, 在报错日志中,频繁出现一个服务的名字,原来是最近用户在访问同一个流程 ,而那个流程首先数据量是比较大的, 其次流程服务中还调用了一个古老的系统接口, 那个接口本身就很会卡顿 , 所以就导致了程序线程一直堆积, 导致服务cpu爆满
至于解决方案,对代码做了一部分的优化,由于项目整体的特殊性,是没发做太多改动的,还是得根据项目的实际情况去操作
如果是正常的项目,这种情况我能想到的如下优化方案:
1,可增设程序服务监控,心里有个安慰
2,增加负载, 压力分流
3,对压力大的表做优化,索引,分表
4,接口做限流,避免重复多次点击
5,审查代码,改进优化
总结
多看,多学,多动脑子