2011-11-27 177 views
4

我正在研究一个使用Perl的大型企业应用程序,有几十个模块等,主要用于抓取网络上的一些内容。Perl和流程管理

我写的子程序之一是做图像检索&分析。对于我发送给它的每个参数,通常需要几秒钟才能完成。所以我将它发送到不同的进程(分叉...)。问题是,一段时间后系统变得非常不稳定,内存已满。

问题

  1. 是因为每个进程创建的,在一个单独的存储位置创建父数据的副本?如果是这样,是否意味着每个孩子都拥有所有模块的副本? (并且有几十...)
  2. 什么是释放这个内存/管理这些进程的最佳方法?

回答

6

分叉使用copy-on-write,所以分叉的进程不应该获得太多的内存,除非它们特别长寿。

这听起来像你的系统中有内存泄漏。你有任何相互依赖或循环数据结构吗?如果是这样,您可能需要考虑使用Scalar::Util::weaken来调整数据结构上的引用计数。

+0

我会研究它,同样,我退出每个孩子使用'exit 0'没有任何sig处理程序的进程,后来当我检查ps时,我看到很多perl僵尸进程,许多许多甚至几十个百分之一他们是否正常? – snoofkin

+1

你需要在你的子进程上等待(http://perldoc.perl.org/functions/waitpid.html)以获得退出状态,否则他们将以僵尸身份生活。你可能想看看像[Parallel :: ForkManager](https://metacpan.org/module/Parallel:ForkManager)这样的处理这些细节的东西。 – friedo

+0

谢谢,将考虑Parallel :: ForkManager – snoofkin