2010-12-09 4 views
2

다양한 작업을 수행하는 약 10 개의 세션이있는 POE를 사용하는 응용 프로그램이 있습니다. 시간이 지남에 따라 앱이 더 많은 RAM을 소비하기 시작하며 앱이 80 %의 유휴 상태 일지라도이 사용량은 줄어들지 않습니다. 내 유일한 솔루션은 현재 프로세스를 자주 다시 시작하는 것입니다.시간이 지남에 따라 내 프로그램에서 많은 양의 메모리를 사용하게되는 원인을 찾으려면 어떻게해야합니까?

나는 여기에 내 코드를 게시 할 수 없으므로 도움을 받기가 어렵다는 것을 알고 있지만 누군가 내가 스스로를 알아낼 수있는 것을 말할 수 있습니까?

+1

[일반 Perl 메모리/참조 누출 패턴?] (http://stackoverflow.com/questions/2223721/common-perl-memory- 참조 누수 패턴) 및 [Perl 메모리 사용 프로파일 링 및 누출 감지] (http://stackoverflow.com/questions/1359771/perl-memory-usage-profiling-and-leak-detection) 및 [어떻게 메모리를 찾을 수 있습니까? 장기 실행 Perl 프로그램의 누출?] (http://stackoverflow.com/questions/429254/how-can-i-find-memory-leaks-in-long-running-perl-program) 및 [도구가 있습니까? 내 Perl 프로그램에서 메모리 누출을 발견 했습니까?] (0120-17753) – Ether

답변

2

프로세스 크기가 감소하지 않을 것으로 예상하지 마십시오. 프로세스가 종료 될 때까지 메모리가 OS로 다시 릴리스되지 않습니다.

그렇다면 데이터 구조에서 참조 루프를 어딘가에 가질 수 있을까요? AFAIK, perl 가비지 컬렉터는 참조 루프를 분류 할 수 없습니다.

어디에서나 XS 모듈을 사용하고 있습니까? 내부에 누설이 숨어있을 수 있습니다.

+0

메모리가 OS로 다시 릴리스되지 않으면 사용량이 계속 증가할까요? 내가 사용하고있는 모듈 중 하나의 종속성에 XS 모듈이있을 수 있습니다. 나는 또한 HTML :: TreeBuilder를 사용하고 있는데, 문서화에 명시 적으로 delete() 메서드를 호출하여 내가 이미하고있는 메모리에서 파기해야한다고 명시하고있다. – perlit

+0

크기가 제한없이 커질 필요는 없습니다. 누출이 없다면 특정 크기와 수준으로 증가 할 것입니다. 물론 메모리가 적절히 재사용 되기에는 조각화되지 않는 한. 그것이 제한없이 자라나거나 안락하게하기에는 너무 커지면 죽이지 않습니까? –

+0

VPS에서 실행 중이므로 약 100MB RAM을 사용하면 결국 종료됩니다. 하루에 8 ~ 10 번 정도해야합니다. – perlit

1

추측 : 프로그램은 실행되는 동안 루프를 실행합니다. 이 루프에서는 어떤 조건이 발생할 때마다 버퍼 (또는 그 이상)에 메모리를 할당 할 수 있습니다. 스코프가 종료되지 않으므로 메모리는 남아 있으며 절대로 정리되지 않습니다. 나는 당신이 이것 같이 무언가를 검사 할 것을 조언한다. 이 경우 할당 코드를 루프에서 호출 한 하위 위치와 범위를 벗어나는 위치에 놓고 루프 돌아가서 정리하십시오.

1

모양은 Test::Valgrind은 메모리 누수를 검색하는 도구입니다. 나는 그것을 사용하지 않았다. (그러나 나는 C 소스와 함께 평범한 valgrind를 사용했다.)

1

한 가지 방법은 $ POE :: Kernel :: poe_kernel의 내용을 시간 또는 시퀀스 이름의 파일에 주기적으로 덤프하는 것입니다. $ poe_kernel은 모든 알려진 세션과 그 힙의 내용에 걸친 트리의 루트입니다. 유출 된 메모리를 참조하면 스냅 샷이 단조롭게 커집니다. 초기 스냅 샷과 차후 스냅 샷을 차별화하여 누출되는 것을 찾을 수 있습니다.

POE의 내부 데이터 일관성 검사를 사용하려면 POE_ASSERT_DATA = 1을 내보낼 수 있습니다. 나는 그것이 문제를 드러내지는 않을 것이라고 기대하지만, 그렇게한다면 나는 버그 보고서를 받게되어 매우 행복 할 것이다.

1

Perl은 참조 링을 해석 할 수 없습니다. (ps axl을 통해 감지 할 수있는) 좀비가 있거나 메모리 누수가 있습니다 (참조 고리/원)

메모리 누수를 감지하는 데는 많은 프로그램이 있습니다. strace, mtrace, Devel :: LeakTrace :: Fast, Devel ::주기

관련 문제