2011-11-27 178 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