记录一次系统内存消耗太大的问题排查

      系统架构采用了spring cloud,数据库架构在mycat上,系统大体的架构如下:

 

未做前后端分离。前端采用jsp,ui做前端汇总,存放jsp。controller被ui引用,manager做逻辑层,microservice做微服务层,controller 引用service-client 通过fegin 调用microservice。系统的熔断时间设置为250秒,未做超时重试,严格意义上,这不是一个完整的微服务架构。

 

记录一次系统内存消耗太大的问题排查_第1张图片

事件大致是这样:门户访问base微服务,开初是一天挂3-5次,一连几天均如此,zabbix监控看,mycat服务器和base微服务的内存消耗极高,gc非常严重。随着用户访问量逐渐加大,基本上启动起来后2-3分钟内,base便挂掉,随即ui挂掉。刚开始一直没想到要分析dump,后面分析dump,发现mapper里面的某个查询,根据map做为条件查询,在某个条件下,map条件为空,拼接出来的查询为无条件查询,刚好该接口被其它外部接口调用,未做条件为空的判断。系统架构在mycat上面,由于查询是连表查询,在没有条件的情况下,未自动添加limit 限制,导致查询出全表的数据,一次查询占用内存10个G。直接让系统崩溃掉。

经验总结:

       对查询添加limit 非常有必要。

你可能感兴趣的:(系统故障记录)