一个非常奇怪的PHP / Mysql CLI内存泄漏问题

时间:2012-09-25 22:21:34

标签: php mysql

我已经有这个问题好几个星期了,我遇到了最不可能的修复。我会在稍后解释一下,但因为当我把所有内容都打破时,这篇文章可能会有几页,我想通过一个如何修复它的例子来窥探你的兴趣。我将跟进对我认为发生的事情的解释,并且我还将提供所有必要的分发和包装信息,以便每个人都知道我正在处理什么。

我在服务器上运行了大量服务器端CLI脚本来实现我们的目标。比如,在任何时间运行相同任务的200到700个实例之间。每个CLI脚本都有内存泄漏。在你为我解决问题之前,让我给你一些更多的信息。这种泄漏不是由于没有释放子对象引起的 - 这是php5中的一个标准。我已经做了这么多,并花了将近15个小时收紧我的Active Record和Select类,以确保在返回数据时清除所有子引用和循环引用,或者释放活动记录对象本身 - 它不是AR /选择。每个过程泄漏相当标准但随机量的ram,(每次使用约25 megs + - 15 megs标准变化)。每个进程大约需要15分钟才能运行,最后并没有正确地将内存释放回系统堆。走对了吗?不。我可以做大量选择7百万条记录,并从linux cmd行(“就在之前”)结束时终止该脚本。 (约15分钟,我通常会有一个秒表)。当我杀了它时,它需要几秒钟才能实际返回到提示符,但是低并且看到我服务器内存的所有128个gig都会返回到系统堆中。它丢失在MySql或php堆中的某个地方,并且在某种程度上选择了大量的数据时它会找到它并将其放回活动的Php / MySql堆中(也许它总是在那里!而不是自由编辑回到操作系统)。无论如何在完成之前杀死进程会将内存释放回系统堆。奇?是。什么应该发生?也许我在这里遗漏了一些东西。

我们正在运行php 5.3。我更新到PHP 5.4,看看是否会修复它,没有骰子。我们正在运行mysql 5.5.24-0ubuntu0.12.04.1。我们正在运行ubuntu,我们已经竭尽全力制作测试驱动程序来证明脚本没有泄漏。测试驱动器返回true和solid,但系统本身仍然泄漏。

我没有真正的代码示例向您展示。它是一个相当大的框架,理解它对于经验丰富的开发人员至少需要几个小时。还有什么我可以提供给你的,或者你可以告诉我一个关于如何解决这类问题的错误报告。

0 个答案:

没有答案