记录一个跌宕起伏的解决bug过程

el/2024/7/13 12:32:16

问题症状:测试发现在服务在运行一段时间之后就会挂掉,尤其是在进行安全漏洞扫描和性能测试时更加明显,后台没有报错日志,单纯的应用不再接收新的请求;

问题重现、分析和解决:刚开始很难在开发环境上复现这个问题(我们自己开发环境经常会重启),而且无法定位到在进行什么操作的时候才会导致服务器挂掉;只能通过多次进行扫描然后查看导致服务挂掉的请求时什么,发现每次扫描卡住之后最后一个请求都是登录请求,所以我们初步判断可能是登录导致应用挂掉,但是让人疑惑的是为什么正常操作时应用没有挂掉,而是操作一段时间之后应用才会挂掉,然后网上一顿搜索分析,发现服务不再响应的特征是数据库的连接数达到一定的数量而且这些连接由于被阻塞不能释放,导致数据库卡死;到这基本是找到了导致服务挂掉的罪魁祸首了,但是怎么解决这个问题呢,是那一块的代码导致了这个问题呢?然后我首先将可能导致数据库发生阻塞的代码重新走了一遍,甚至将很多不规范的写法都重新规范了一遍,还是不行,然后我又回想起每次挂掉前的最后一个扫描请求时登录,所以我又回到登录页面去查(因为我们登录时做的单点登录,在跳转到另一个系统进行登录的)一遍遍的修改调试都无果,而这时通过大量在开发环境的测试(我们在开发环境将最大连接数设置小一些,问题也更容易复现)我们发现不止是进行一定量的登录请求后会发生这个问题,不停的刷新首页也会导致这个问题,然后我们排除了登录的问题,而扫描漏洞导致服务挂掉前的最后一个请求每次都是登录请求也可以理解,因为我们某些页面有登录拦截,然后扫描漏洞的程序在每隔一定的时间就会进行登录操作,而一旦发现登录不上去了,程序就停止扫描了,而服务也许在这之前就已经挂掉了;言归正传,这时我们把问题锁定到首页上,因为不断f5刷新首页,确实可以看到后台数据库的阻塞进程在增加,然后就是分析首页的代码,一段一段的屏蔽排除发现是页面上的的图片加载会导致这个问题,这让我们又疑惑了,但是随着继续深入的测试,点击一个加载失败的图片链接让我们有了新的发现,这个加载失败的图片跳转到的一个404页面里面包含了获取后台用户数据的操作,继续前面的排除法,删除这部分代码就不会出现问题了,到这里我们至少知道该怎么去解决项目上的问题了,但是这并没有解决疑惑,为什么在404页面获取用户信息会导致这个问题,继续深入研究发现是数据库配置的问题,发现是在openSessionInViewFilter的拦截没有配置Error这个选项,导致在error页打开的session没有正常关闭,加上这个不修改error的tag页也可以解决问题!


http://www.ngui.cc/el/5557319.html

相关文章

swoole学习过程中踩到的坑

坑 swManager_loop(:272): wait() failed. [2017-09-02 13:41:19 #8475.2] NOTICE Server is shutdown now. [2017-09-02 13:41:19 $8476.0] ERROR swManager_loop(:272): wait() failed. Error: Interrupted system call[4]. 当前版本是1.8.11,在论坛中&a…

更改session目录

之前线上的项目(thinkphp,阿里云服务器)无法访问,发现是服务器节点满了 这个环境有点奇葩,系统的节点用的差不多了,但是挂载了一个额外的云盘,节点剩了很多,之前就是把本来放到系统…

学习鸟哥的Linux私房菜笔记(1)——基础使用

一、计算机的五大单元 二、Linux用户环境 1、内核(Kernel) 内核管理的事项有:系统调用接口(实现开发人员与核心的沟通)、进程控制,合理分配CPU资源、内存管理、文件系统管理 2、Shell shell用于接收用户的命令&#xf…

学习鸟哥的Linux私房菜笔记(6)——过滤器、输入输出及管道

一、过滤器 Linux中的应用工具分为三种: 交互工具 过滤器 编辑器 能够接受数据,过滤再输出的工具,称之为过滤器 对过滤器和进程,存在着输入源与输出对象 二、输入、输出、重定向 输入:过滤器的数据来源 ——标准输入st…

学习鸟哥的Linux私房菜笔记(13)——用户管理

一、检查用户身份 用户可以使用下列指令了解用户身份 who &#xff1a;查询当前在线的用户 groups &#xff1a;查询用户所属组 id &#xff1a;显示当前用户信息 finger &#xff1a;查询用户信息 二、添加用户 用指令添加命令 useradd <username> passwd <passwd&g…

mysql 查询出某字段的值为空的语句

1.不为空 select * from table where id <> ""; select * from table where id ! ""; 2.为空 select * from table where id ""; select * from table where isNull(id); 具体情况具体分析&#xff0c;如果字段是char或者varchar类型的&am…

Junit配置

1.点击Build Path ---》configure 2.选择Add Library &#xff0c;点击next 3.选择Junit4&#xff0c;点击Finish

Git常用命令解说(从创建到提交)

Git库中由三部分组成 Git 仓库就是那个.git 目录&#xff0c;其中存放的是我们所提交的文档索引内容&#xff0c;Git 可基于文档索引内容对其所管理的文档进行内容追踪&#xff0c;从而实现文档的版本控制。.git目录位于工作目录内。 1&#xff09;工作目录&#xff1…

git 创建 .gitignore 文件 建立项目过滤规则

创建 .gitignore 随意设置想跟踪哪些文件和不跟踪哪些文件. 1.在项目根目录下建立 .gitignore 文件 2. .gitignore文件过滤有两种模式&#xff0c;开放模式和保守模式 2.1开放模式负责设置过滤哪些文件和文件夹 eg&#xff1a; 过滤文件夹设置&#xff1a; /mtk/ 过滤文件设…

使用eclipse 添加user library

在Eclipse中有两种常用的添加引用的jar包的方法&#xff0c;一个就是添加Referenced Library&#xff0c;这种方式很简单&#xff0c;出选中项目右键->import之外&#xff0c;还可以直接向WebRoot->WEB-INF->lib中复制粘贴jar包文件&#xff0c;缺点是下次添加同样的j…