刚入职现在的公司,发现线上某个实例会不定期不提供服务,进程还在,但是不再接受请求。每次都重启就恢复,后来一直观察。线上没写权限,也没什么监控工具,就是那种突然出问题,还要临时申请写权限去机器上执行jvm的相关命令。有时候也抱怨权限这东西,就跟站着茅坑不拉屎一样搞笑,有权限的人不做,要做的人做不了。有次用eclipse的工具看了下,dubbo对象特别多,都超过spring boot的了,看了dubbo的代码,发觉居然是每次都new出Reference来的,没有用注解,没有交给spring接管。交给容器后,后来也出现过服务不可用。一次偶然的机会,排查另一个问题时发现mybatis数据库异常,分析日志得知一个sql查询足足执行了30多分钟,看了sql语句,where条件触发了全表超大量数据扫描,然后服务就撑差不多半小时,异常之前服务是正常提供的,直到oom时僵尸。因为订单表订单号是拆单,父订单的父订单号自然为0,有一些老订单数据不符合规范,导致查询了订单号为0的sql。本地模拟果不其然,执行半个小时后就oom,服务不可用。oom是标准输出,日志并无该提示,导致一直未能看到。就加了一个if订单号不为0就解决了,你说这代码写的,找谁说理去。这个问题足足留意了差不多2个月,才找到是这么个原因,居然骂人都没脾气的问题。
展开