一次线上事故排查

  1. 问题

  1. 3月1日监控系统监测到某子系统所在机器Cpu突然飙升。

  1. 排查系统

  1. 首先登录对应系统的机器,top查看机器信息,显示当前cpu已经到了800%

  1. top 显示800%

  1. 根据top的pid查看对应服务,查看服务子进程

  1. 排查子线程,发现子线程有8个都100%了,然后查看java服务

  1. ps-ef | grep tomcat

找到对应服务

  1. 打印服务的栈信息

jstack pid > pid.log

打印服务的主线程的Pid的栈信息,子进程的栈信息输出会有问题,输出的信息没有参考价值

sun.jvm.hotspot.debugger.DebuggerException: get_thread_regs failed for a lwp

  1. 分析主线程的栈信息异常发现有一直在GC,日志中大量输出redis timeout ,初步认为是大量连接redis超时导致创建线程过多,导致最终OutOfMemoryError

  1. 停止服务进程,重启服务,观察运行,服务正常运行,第二天中午吃饭时间,突然监控系统再次发出cpu告警,在输出栈信息,信息与之前基本相同,还是没有实质性进展,先保存现场恢复正常服务于;

  1. 运维同时反馈有操作后导致服务宕机,联系运维同事,重新启动项一个节点服务,触发运维同事操作,发现新节点宕机,根据运维同事操作,输入详细日志信息,同时dump内存信息(服务节点dump内存信息太大),然后分析代码,发现在一处获取菜单处产生大量对象且无法回收,继续增加日志,输出菜单的详细信息,同时根据代码发现存在递归获取信息

然后再根据日志数据的取查看数据库,实际菜单数据只有不到一千条,日志输出的获取i12的行数数十万行,可以确定是在获取菜单这里形成死循环了,再次增加日志输出这里获取菜单的数据,根据日志输出排查数据库,找到异常数据:第一级菜单的父级菜单应该是null,数据库的最新值是一个四级菜单,修改异常数据,等待数据库缓存刷新,再次触发操作,操作正常,服务正常。

  1. 处理遗留问题

  1. 系统恢复正常后,跟领导确认,去掉全部运维账号的菜单权限,防止此类问题以后再次出现

  1. 排查数据库接口操作记录,确定运维同学是在前一天下午的18点修改的菜单数据,至此问题解决。

  1. 复盘

  1. 代码中慎用递归,尤其是线上环境

  1. 线上环境一定要设置oom自动保存信息

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Sequelize 是 Node.js 环境下的 ORM 框架,提供了比较完善的数据库操作支持。Sequelize 的连接池是其关键特性之一,可以在多个请求之间共享数据库连接,提升数据库查询性能。但是,连接池的配置和使用也需要注意一些细节。 在线上环境中,我们曾经遇到过 Sequelize 连接池报错“ResourceRequest timed out”的问题。经过排查,我们发现该问题主要有以下几个原因: 1. 连接池配置不合理 Sequelize 的连接池有很多配置项,比如最大连接数、最小连接数、连接超时时间等。如果这些参数设置不合理,就容易导致连接池资源不足或者连接过期。因此,我们需要根据实际需求和服务器性能,进行合理的配置。 2. 数据库连接未释放 在使用 Sequelize 连接池时,我们需要手动释放连接资源。如果没有正确释放,就会导致连接池资源耗尽。通常我们可以使用 Promise.then 或 .finally 方法来释放连接资源。 3. 数据库连接泄露 数据库连接泄露是指在应用中创建的数据库连接未被正确关闭,从而导致连接池中的连接资源逐渐耗尽。通常我们可以使用 Sequelize 提供的 sequelize.close() 方法来关闭所有数据库连接,确保连接池资源得到释放。 4. 高并发压力过大 当应用面临高并发压力时,连接池中的连接资源可能会被快速消耗完毕。此时,我们需要调整连接池的配置或者增加服务器资源,来满足高并发请求的需求。 总之,Sequelize 连接池的问题排查需要综合考虑多个因素。在实际项目中,我们可以通过监控工具、日志分析等手段,及时发现和解决连接池问题,确保应用的稳定性和性能表现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

布吉岛的石头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值