2010-10-03 56 views
1

我的LAMP应用程序似乎最终会耗尽我服务器的所有内存和交换空间。我的直觉是,它与我必须调用的外部过程有关(因为这是问题出现的唯一时间)。LAMP和内存/交换空间问题

我需要不断地调用GhostScript,ImageMagick的“convert”,PDFTK等。当这些进程正在运行时,那是当我看到我的内存用完了。所以,问题:

  1. 我应该使用哪些技术来确定哪个进程实际上导致内存问题?我现在的计划是单独运行这些进程,并通过* nix命令“top”观察内存使用情况。有没有一种方法可以通过编程方式来完成?

  2. 有没有我可以使用的“内存冲洗”解决方案?这是一个好主意吗?

回答

0

你可能面临的另一个问题是,分叉的时候,你从叉是“加倍”,因此它的内存消耗一倍的应用。如果你有一个常驻的应用程序服务器并保存大量数据,这可能非常重要。

此问题的解决方案是运行一个小型驻留脚本/程序侦听套接字或命名管道来启动外部程序。

您可以使用top -b(或类似的)来接收计算机可读输出并使用脚本监视那里的内存消耗。

顺便说一句:不要将交换空间计算为“真实”的内存,您的应用程序应该运行而不会遇到交换空间。一旦你开始访问交换空间,性能下降得太快,请求开始堆积,导致使用更多的内存,导致更多的内容被交换。如果您看到重要的交换空间被分配,然后增加内存(或购买更大的托管计划)

+0

这些外部进程通过PHP的exec()调用。这是否构成分叉?这些进程不应该在完成时释放内存吗?或者我应该做些什么?我如何知道他们是否不释放内存? – StackOverflowNewbie 2010-10-03 13:05:56

+0

是的,php exec使用fork创建子进程。只要您没有重定向由于某种原因而被阻塞的输入/输出文件,它将在应用程序完成时释放内存。 – 2010-10-03 13:13:09

+0

您能否详细说明您的评论:“解决此问题的方法是运行一个小型驻留脚本/程序,在套接字或命名管道上侦听以启动外部程序。”? – StackOverflowNewbie 2010-10-03 14:36:52