记一次线上问题(监控的重要性)


起因

一天早上,突然线上的系统变得很慢,大家连登陆都很慢。打开日志,发现很多的java.io.IOException: 远程主机强迫关闭了一个现有的连接和数据库连接timeout。

分析

看到这些错,大于猜测是数据库连接的问题了。1.连接池出了问题?不可能啊,咱用的是HiKariCP啊,性能最强悍啊。2.难道连接池配置有问题?看了下,完全按照官方公式计算的(connections =((core_count * 2)+ effective_spindle_count))。3.难道是并发太大,已经达到了瓶颈?但是cpu的使用率并不是很高。

发现

在看日志的时候,返现一个页面发文的频率很高。原来是客户今天突然收到指示,集体操作同一个模块。那是不是可能是某个sql执行效率很慢,导致了查询堆积,而且出现了很多timeout?找出sql在正式数据库执行,果然需要好几秒才能返回数据。原来是因为在测试库的数据量远远小于正式库,导致问题没有及时的暴露出来。加上索引做了优化,系统立即恢复了!!!

如何防止

由于数据库不归我们管理,是客户找专门的公司维护,我们的账号没有查看慢查询的权力。那我们能不能在我们自己的系统加入监控功能,定期的查看哪些有问题的sql我们可以及时解决呢?

  1. druid:阿里开源的连接池,可以监控,但是我们有最强悍的HiKariCP,待定
  2. 能不能在mybatis上想办法,也确实存在插件,可以记录到日志中,但是不利于查找。
  3. javamelody:意外的发现,他可以与Spring集成在一起,可以监控cpu,sql,接口,jsp等,并且还有可视化的图标,一目了然,很符合我们的要求,于是准备在项目中集成他,定期监控情况,对有问题的接口、sql及时优化,而不至于再出现这样的突发状况。