线上服务器出现了, 内存占用过高, 导致服务器卡顿的情况。 出现问题时的内存占用情况如下图:
memory.PNG通过上图可以看到, cached内存占用了10G 左右,free memory可用内存大概在192M 左右, 这个时候明显内存已经不够用了, 但是系统并没有自动释放cache page.
在参考了技术文章后,https://linux.cn/article-7310-1.html,有了一个深入的了解。
然后在测试环境做了一个实验:手动释放cache page, 看是否能够释放。
memtest.PNG
得出结论, tomcat服务器所占用的cache page, 是可以被释放的。 那么系统能否主动去释放cache page呢。 进一步调查, 可以发现,系统是可以自动释放cache page的, 条件是当free memory 小于一个阈值 min_free_kbytes. 这个值查看了一下, 系统默认是66M。 这也是为什么线上服务器会出现cache page不被释放的原因。 因为还剩192M, 没有达到这个阈值。 但是这时系统已经hang了。
具体min_free_kbytes的设置要进行微调,高了低了都不好。 低了就是今天出现的这种情况,已经没有内存可用了, 但是cache page也得不到释放。 高了就可能出现内存的浪费, 并且很容易频繁触发cache 的释放,影响性能。
目前在16G内存的机器上,先设置成了512M, 8G内存的机器上上设置成了256M。先看看效果如何吧。
网友评论