2011-11-27 3 views
4

저는 펄을 사용하여 꽤 큰 엔터프라이즈 애플리케이션을 개발하고 있으며, 수십 개의 모듈을 가지고 있습니다. 주로 웹을 통해 물건을 크롤링하는 데 주로 사용되었습니다.펄 및 프로세스 관리

내가 쓴 서브 루틴 중 하나는 이미지 검색 &을 분석하는 중입니다. 대개는 각 매개 변수에 대해 수행하는 데 몇 초가 걸립니다. 그래서 나는 그것을 다른 과정 (forking ...)으로 보내고있다. 문제는 시스템이 매우 불안정 해지고 얼마 후 메모리가 가득 찼다는 것입니다.

질문 : 각 프로세스가 생성하기 때문에, 별도의 메모리 위치의 상위 데이터의 복사본을 생성

  1. 인가? 그렇다면 각 어린이에게 모든 모듈의 사본이 있음을 의미합니까? (그리고 수십 가지가 있습니다 ...)
  2. 이 메모리를 비우거나 프로세스를 관리하는 가장 좋은 방법은 무엇입니까?

답변

6

포킹은 copy-on-write을 사용하므로, 포크 된 프로세스는 특히 오래 오래 걸리지 않는 한 너무 많은 메모리를 차지해서는 안됩니다.

시스템에 메모리 누수가있는 것 같습니다. 상호 - 재귀 의존성 또는 순환 데이터 구조가 있습니까? 그렇다면 Scalar::Util::weaken을 사용하여 데이터 구조의 참조 카운트를 조정할 수 있습니다.

+0

나는 그것을 조사 할 것이다. 또한 각 자식의 프로세스를 sig 처리기없이 'exit 0'을 사용하여 종료한다. 추후에 ps를 점검 할 때, 펄 좀비 프로세스가 많이 보이고, 수 많은/심지어 수십 그들 중 정상입니까? – snoofkin

+1

자녀 프로세스에서 [종료] (http://perldoc.perl.org/functions/waitpid.html)해야 자신의 종료 상태를 알 수 있습니다. 그렇지 않으면 좀비로 진행됩니다. 이러한 세부 정보를 처리하는 [Parallel :: ForkManager] (https://metacpan.org/module/Parallel::ForkManager)와 같은 것을 보길 원할 것입니다. – friedo

+0

감사합니다, Parallel :: ForkManager 살펴 보겠습니다. – snoofkin