刘华
实验室:JS测试器
分类专栏
hadoop2篇
mysql1篇
nginx8篇
java5篇
架构设计3篇
信息安全6篇
前端开发2篇
数据同步6篇
AI7篇
其他9篇

微服务系统崩溃一例及其解决

liuhua-2023/7/14 23:03:43

我负责的公司运营平台这几个月频繁发生崩溃,连服务器都登录不上。每半个月甚至一周就会发生一次。每次都只能重启服务器解决。

系统是采用Java微服务架构SpringCloud搭建的,每个服务运行在docker容器中。

之前一直没有仔细去分析发生问题的原因,都是重启服务器了事。这样长期下去不是办法,因此,这几天对这个问题进行了研究。

通过两天的观察,终于发现了端倪。

我用docker stats查看每个容器的内存占用情况,截图保存并备注监测的时间,对比不同时刻的内存占用情况,发现其中gateway服务的内存只增不减。两天下来,发现内存占用增加了500多兆。因此怀疑是发生了内存泄漏。按照这个内存消耗速度,一周左右分配给它的3G内存就会消耗完,从而无法分配新的内存来提供新的服务,进而使得依赖它的服务纷纷报错,整个系统发生雪崩,服务器内存耗尽,最后连登录到服务器都不行了。

那么怎样解决?临时解决的办法应该就是定期把这个服务重启一下。根本解决就需要分析发生内存泄漏的原因,修改那个服务的代码。后面进一步跟踪和研究这个问题。

经过分析这个服务的代码,发现是因为gateway里fegin调用必须使用一个线程池,使用完之后没有关闭这个线程池,导致内存溢出。因此,在原来的代码中增加关闭线程池的代码。

b36c41fa9e6f9e536ff65c44bb869b3d.png

在代码中,通过Executors的newFixedThreadPool创建了一个线程池,在提交任务后,通过shutdown方法优雅地将其关闭(不影响已提交任务的执行),解决线程池资源不回收的问题。


小钉 京ICP备16032583号-1