我疯了,试图find我们的主要箱子之一的内存泄漏。 它运行CentOS,内核2.6.18,x86-64。 这个盒子(实际上是Xen上的VM)自从6个月前创build以来就一直运行良好。 它是为了replace旧的物理盒子而创build的,并且以相同的方式进行了configuration。 VM是一个Web服务器,只运行Tomcat和Apache。 这是坚实的,没有问题,没有内存泄漏。
大约两周前,我们有一个问题,我们的Xen设置中的四个物理服务器中的两个重新启动(出于某种原因)。 我们稍微恢复了一些,并没有太多的问题(我们不得不重新加载一个MySQL数据库,在复制过程中由于停机而错过了一些logging)。
从那以后,我们在这个虚拟机上遇到了内存问题。 我们所有的其他虚拟机都没有问题,只有这个。 内存使用量将增加,最高可达200 MB / h,直到盒子用完。 它会通过交换咀嚼,然后OOM杀手将开始导致问题,直到我们重新启动虚拟机。
在尝试其他事情(重启VM,重启物理服务器,将VM迁移到不同的物理服务器)后,我使用RPM来validation磁盘上的所有文件,以发现损坏。 我发现一些文件,我不确定我们甚至使用过,所以我重新安装了软件包,以便它们再次清洁。
这减缓了泄漏,但仍然存在。 现在我们正在以10-50MB / h的速度泄漏,但似乎在接近尾声时加速。昨天,当服务器几乎空闲时,内存迅速攀升,由于某种原因,在12小时内上升了2.5个演出。
有趣的是,在运行rpm来validation所有内容之前,在进程退出之前,它抓取几乎所有可用的物理内存,之后必须重启虚拟机。 唯一的configuration变化是将虚拟机的内存从2GB提高到4GB,这样内存耗尽需要更长的时间,我们不得不重新启动。
我试过跟踪记忆。 这似乎是我们正在失去的匿名页面,因为该框并没有真正使用它的磁盘,我不惊讶,我们正在失去的网页不支持磁盘。 Tomcat / Java有2个虚拟内存,挂在1个居民身边(分配给1.5个演出)。 就像我刚才所说的那样,这是6个月以上的configuration,以及之前使用多年的configuration。
事件发生前一周,我们的软件没有更新,所以不是这样。 从那以后,我们重build了它并进行了更新,但这并没有解决问题。
我们已经尝试使用yum更新系统上的所有其他内容,但这没有什么区别。 没有百胜安装的唯一的软件是Java(我更新)和我们的软件(我更新)。
我编写了一个小程序,通过在/ proc文件系统中总计数字来跟踪虚拟机上每个进程的总虚拟大小,常驻大小和数据段大小。 让它运行一天之后,你可以看到Apache的虚拟大小随着负载而上下反弹,但是常驻大小从未改变过。 Java整天慢慢地爬到了50MB的地步,并且符合我们的期望。 然而在那段时间,我们损失了500多MB的内存。 顶部不显示任何使用更多内存的Java。 我的程序发现服务器上的每个进程(除Java和Apache之外)在一天之内都没有改变超过几千字节。
基本上,有些东西在吃掉我们的记忆,但是我完全搞不清楚是什么。 内核是我最好的猜测,但即使内存使用率很高,内核的内存大小(我记不起来的/ proc / vmstat中的内容)只有大约200兆字节。
在这一点上,我们准备从头开始重build虚拟机。 我认为这是最终的结论。
当这样的事情发生时,你如何找出漏记的内容? 我从来没有见过像这样的内存泄漏(这并没有出现在顶部),但我的经验是相当有限的。 任何人都可以提出一些我可以看看或我可以在这种情况下使用的工具吗?
虚拟机是否可能被黑客入侵? 您正在使用哪些工具来监视已知良好的只读介质中的进程和内存列表? 你可以安装一个rootkit来隐藏泄漏的进程。
我们有类似于Centos05和相同的内核。 公羊记忆力不断增加,这是无法解释的。 我们认为这可能与我们安装的一些库/程序有关。 你有Hdf5的安装和哪个版本? 目前,这是我们的主要嫌疑人。 Openmpi / mpich2是我们的第一个嫌疑犯,但是,那些似乎没问题。 不知道。 如果我没有记错的话,那么以前的内核也会出现问题。
我在重新引导时遇到了问题,后来的内核真的很糟糕,发现有一个虚拟机从重新启动服务器移动到另一台服务器,导致它崩溃,所以我意识到这是客人之一。 我使用了Citrix Xen,它使用了2.6.18内核,并且重build了guest虚拟机,并且一直坚如磐石,但是现在已经从citrix移植到了正常的xen 2.6.18内核,并且重新生成了guest虚拟机,并且仍然很好。 后来我又遇到了另一个xen客户的问题,但是他没有把主机取出来,但却导致客户崩溃,以至于我无法进入控制台,只是将所有组件更新为不稳定的版本。 奇怪的是,它现在实际上是稳定的:)