问题产生
在某日下午临近5点,客户群突然反馈所负责项目的生产环境无法登录,遂导致后续工作无法继续。
某物流服务平台,包含船货代、箱管、仓储等等功能。
问题定位
在问题暴露后,第一时间查看服务器日志。发现登录模块下远程调用了几个模块。
- 由入口的auth模块的服务器日志确定,调用的web模块下的获取用户方法超时。
- 由获取用户方法内调用comm模块的获取客户信息方法超时。
- 进入comm模块查看日志,并无异常提示,日志文件处于中断状态,日志无打印且服务正在运行。
- 大概猜到服务当前阻塞状态,导致请求进不来。遂通过jps、jstack等命令确定问题代码。
- 最后由公司内的技术部定位具体问题:
5.1 数据库连接池配置方式有问题,导致只有8个连接生效。
5.2 system模块占用数据库连接,auth模块获取数据权限,comm模块请求system模块获取数据权限。
5.3 system模块连接不释放,需要等待auth模块返回数据。auth模块又需要请求system模块,等待连接释放才能获取数据返回。 - 如此导致一个相互等待资源释放导致的死锁。
问题解决
项目原有设计在system模块有内存缓存,在获取数据权限之后就存在本地。在正常情况下,一般不会出现问题,当在缓存失效时,并发量大的时候,就容易出现这个问题。
最终解决方案:数据库连接数调高并重启应用服务。