升级 nacos 后,系统内存占用一直在增长,但是进程占用内存不高
本文主要记录了一次 spring 升级版本后导致机器内存飙升,但是进程占用内存一直不高的问题。
0x00 背景描述
项目是 spring-cloud-gateway 的项目,使用的技术栈是 spring cloud + nacos ,版本如下:
1 | <spring.boot.version>2.3.2.RELEASE</spring.boot.version> |
公司要求将 nacos 版本从 1.x 升级到 2.x,由此根据官方的参考文档以及公司推荐的版本,升级到如下版本:
1 | <spring.boot.version>2.3.12.RELEASE</spring.boot.version> |
对应的 nacos-client 升级到 2.1.0,spring 版本从 5.1.18 升级到了 5.2.15
官方参考文档:https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E
升级后,开始进行网关灰度的时候发现,系统的内存占用和java 的进程占用的内存对应不上,并且系统占用内存一直在增长,由于使用的是容器部署,容器内部没有其余的占用内存的进程。
理论上而言,系统内存的占用应该近似和进程的内存占用,但是现象不一样,线上的现象是 ** java 进程占用的比系统占用的少,系统内存占用比较高,并且还一直在增长**。见下图:
0x01 问题分析
与正常的版本相比, 比较核心的就是升级了 spring cloud 的版本以及 nacos-client,其余的没有什么变化。并且网关只使用了 discovery 功能用于发现下游的服务实例,其余的应该没有什么区别。
由于是内存的占用一直在增长,通过free -h 查看发现,没有特别的异常,只是已使用一直在增长,其余没有任何的异常,vmstat 查看也只是memory 的 free 一直在减少。查看/proc/meminfo 也没有什么特别的异常。
经过 n 种方式查询,没有什么特别的异常,后续通过 slabtop 对比正常的版本和异常的版本发现,dentry 项两个机器差了一个数量级。
正常版本:
异常版本:
通过图上可以明显看出来,异常的 dentry 占用比正常的高一个数量级。
但是也不知道后续怎么排查了,找到了系统容器组的同事。经过他的排查定位发现/tmp 目录创建了上百万个文件。最终定位为 spring 的一个 bug 导致的。详情见:https://github.com/spring-projects/spring-framework/issues/27092
0x02 问题解决
经过查看 pr,发现为默认创建文件夹导致内存占用高,影响的 jar 包是 spring-web,查看 github 发现,5.2.16 版本修复了这个问题,果断进行升级后,系统正常了。
后续请教了一下内核组的同事,他说是通过drgn工具定位的,其余的办法好像查不到,工具具体放参考资料里面。
0x03 参考资料
1、spring bug issue : https://github.com/spring-projects/spring-framewor
2、slab 内存占用高排查:http://aliyun123.cn/news/924.html
3、排查工具:https://github.com/osandov/drgn/pull/306#issuecomment-1619742195