我在CentOS服务器上运行繁重的应用程序,我看到一个奇怪的内存行为。 这里是一个munin图的快照:
正如您所看到的,提交内存的数量逐渐增加,导致交换文件被使用。 令我感到奇怪的是,不活跃的内存量也在不断增长。 这是我的理解,不活动的内存实际上是释放内存,但尚未清理的操作系统,并放回到可用内存池。 似乎内存不足是由于缺乏清理而造成的,但我可能是错的。
你能提供一些技巧来找出问题的原因,并且/或者让CentOS回收不活动的内存?
谢谢。
一些额外的信息:
1)我有一个tmpfs挂载在/ tmp和存储在那里的文件数量增长(但它是非活动内存量的两倍)。
2)cat / proc / meminfo(在比图像更晚的阶段)给出:
MemTotal: 14371428 kB MemFree: 1207108 kB Buffers: 35440 kB Cached: 4276628 kB SwapCached: 785316 kB Active: 9038924 kB Inactive: 3902876 kB HighTotal: 0 kB HighFree: 0 kB LowTotal: 14371428 kB LowFree: 1207108 kB SwapTotal: 10223608 kB SwapFree: 6438320 kB Dirty: 627792 kB Writeback: 0 kB AnonPages: 7844560 kB Mapped: 49304 kB Slab: 146676 kB PageTables: 27480 kB NFS_Unstable: 0 kB Bounce: 0 kB CommitLimit: 17409320 kB Committed_AS: 16471488 kB VmallocTotal: 34359738367 kB VmallocUsed: 275852 kB VmallocChunk: 34359462007 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 Hugepagesize: 2048 kB
3)该应用程序是MySQL,Heritrix( http://crawler.archive.org/ )和一个基于Tomcat的Java servlet的组合来pipe理事情。
这是我的理解,不活动的内存实际上是释放内存,但尚未清理的操作系统,并放回到可用内存池。
这是错误的。 “不活跃”的内存是主动映射内存,一段时间以来一直没有被任何应用程序利用。 当它交换的时候,内存从标记为这样的页面被取出并被换出。 它也可以用来换出页面caching。
正如您所看到的,提交内存的数量逐渐增加,导致交换文件被使用。 令我感到奇怪的是,不活跃的内存量也在不断增长。
这两个不一定相互关联,但对我来说,这看起来好像有什么东西在泄漏记忆。 事实上,你的页面没有被任何应用程序访问,而且交换也在增长,这表明事物正在分配内存,忘记了它,然后就没有释放它。
内存可能是“不活跃的”,例如,如果malloc()被调用。 这是一个libc调用,可能会分配一块内存,但只有一部分被用来做任何工作(less于分配的页数)。 即使你使用malloc释放它并不意味着你通过要求操作系统来释放内存,它只是mallocs表可能标记为“可重用”,它可能会释放它。
这个应用程序是什么,它有内存泄漏? 即如果您的应用程序终止,内存是否返回到操作系统?
如果你的应用程序泄漏内存,你需要使用类似电围栏的东西来find这些问题,并纠正它们。
你写的是什么申请书? 您需要为写入的语言使用正确的debugging器。
我非常怀疑操作系统是否正在泄漏内存,除非你的应用程序占用了大量的资源而没有正确地释放它们。
此外,你的记忆图非常非常繁忙,很难理解,那里有大约20种颜色,它就像泥浆一样清晰。
你认为这是你的RAM磁盘的问题吗? 它可能正在扩大以满足需求,但在需要时不会缩减。