今天进行压力测试,测试进行了两波后,发现使用top命令监控系统性能,mem中used很高:
一段时间甚至接近total
很疑惑到底为什么,开始怀疑是内存泄露,但是服务已经全部杀掉后used仍然保持很高。
查询了下linux下使用top命令进行监控的详细解释,网上对这个的解释很多很详细,实际上并非服务内存泄露的原因,而是linux内核对于内存的管理造成的:
1. linux中内核对于已经使用了的内存,当期被服务或应用释放掉后,未必会将其放在free中,而是可能将其放在buffers和cached中
2. top中显示的men中 used free 实际上都是内核角度的内存分配情况 也就是虽然used 使用很高 但是实际上服务或者应用是可以使用buffers和cached的内存的
当top中看到的free不多了的时候,内核会从buffers和cached中吐一部分出来支援free
3. 可以使用 free -m 命令进行进一步的查看:
图中可见:
buffer/cache 中的used 实际上才是实际被使用的内存大小,而其下的free 31360 是实际服务/应用可用的内存,mem与top中的mem是一样的,也就是mem中的free+buffers+cached才是buffer/cache中的 free
后续压测中也验证了这一点,当mem中free较多时,优先使用free的实际物理内存,buffers和cached基本不变,当free快要耗尽时,buffers和cached变小,free会增加一些。
当然,如果buffers和cached也耗尽了,系统就会使用swap虚拟内存。
综上,linux系统下进行top检测内存的使用情况,不能完全看mem中的used 和 free 还是需要结合 free -m 和实际的应用进行具体分析。