0
点赞
收藏
分享

微信扫一扫

记录一次死锁导致生产问题

芭芭蘑菇 2022-05-03 阅读 57

问题产生

在某日下午临近5点,客户群突然反馈所负责项目的生产环境无法登录,遂导致后续工作无法继续。

问题定位

在问题暴露后,第一时间查看服务器日志。发现登录模块下远程调用了几个模块。

  1. 由入口的auth模块的服务器日志确定,调用的web模块下的获取用户方法超时
  2. 获取用户方法内调用comm模块获取客户信息方法超时
  3. 进入comm模块查看日志,并无异常提示,日志文件处于中断状态,日志无打印且服务正在运行
  4. 大概猜到服务当前阻塞状态,导致请求进不来。遂通过jps、jstack等命令确定问题代码。
  5. 最后由公司内的技术部定位具体问题:
    5.1 数据库连接池配置方式有问题,导致只有8个连接生效。
    5.2 system模块占用数据库连接,auth模块获取数据权限,comm模块请求system模块获取数据权限。
    5.3 system模块连接不释放,需要等待auth模块返回数据。auth模块又需要请求system模块,等待连接释放才能获取数据返回。
  6. 如此导致一个相互等待资源释放导致的死锁。

问题解决

项目原有设计在system模块有内存缓存,在获取数据权限之后就存在本地。在正常情况下,一般不会出现问题,当在缓存失效时,并发量大的时候,就容易出现这个问题。
最终解决方案:数据库连接数调高并重启应用服务

举报

相关推荐

0 条评论