阿里云报警ecs服务器内存使用率过高,超过内存的90%,因为程序刚刚上线,用户数量不多,并发请求并不高,正常情况下不应该出现内存不足现象,所以需要查找原因,否则用户数量提高,并发数量上来之后,服务器内存撑不住
这里首先登陆到服务器,使用top命令查看(当时忘记截图,下图为后期配图,未复现状态图片)
当时,查看used 确实超过了total的90%,而且居高不下一直无法释放。
然后查看java gc日志,服务将gc日志储存到gc.log中,查看日志:
日志中都是因为分配内存导致失败的minor gc,并且都成功了,没有进行full gc,说明程序里面年轻代内存基本够用,没有或者只有少量需长期存在的大对象,说明程序内内存使用基本没有问题。
然后想起来看下内存都被哪些程序所占用,再次使用top命令:
发现有两个java程序占用内存较高,(这为后期记录时截图,当时实际情况为一个占用1.3G左右,一个占用1.02G左右),然后想起来,这一台服务器,部署了两个容器,提供两个服务。
然后使用jinfo -flags pid 分别查看java启动参数,找到问题所在:
两个应用程序的启动参数都设置了2G的内存,而这台服务器总内存还不到4G,然后查找应用启动脚本发现,容器没有限制内存的使用大小,且脚本判断当前服务器的内存大于3G,所以设置java启动参数内存为2G,从而导致了内存占用一直处于很高的状态,剩余空闲内存,由于请求会创建新的线程,随着并发请求增加,空闲内存减少,则内存会处于报警状态
解决方案,根据现有程序堆内存的需求不同,两个服务中其中一个业务逻辑简单,所需内存较少,于是设置容器的内存限制,降低其中一个应用的内存占用,最终使现有阶段内存占有降了下来,后续如果用户请求增加,则可以增加服务器的物理内存,也可将两个容器分别部署到两台各自的云服务器上