2012-10-20 2 views
8

이제이 문제에 대해 2 주 동안 검색 중이며 웹에서 검색하는 것만으로는 찾을 수없는 것 같습니다.스레드에서의 Perl 메모리 누수 (스레드가 메모리를 해제하지 않음)

1 :

#! /usr/bin/perl 

# 
# RELEASE MEMORY 
# 

use threads; 

my @child; 

$ii=0; 


while (1) 
{ 
    my @child = threads->new(\&test, "test"); 
    $_->detach for @child; 
    print "$ii\n"; 
    $ii++; 
} 

sub test { 
    my ($ee) = 0;  
} 

2 :

#! /usr/bin/perl 

# 
# DO NOT RELEASE MEMORY 
# 

use threads; 

my @child; 

$ii=0; 


for($ii=0;$ii<2000;$ii++) { 
    my @child = threads->new(\&test, "test"); 
    $_->detach for @child; 
    print "$ii\n"; 
} 

while(1) 
{ 
    sleep(10); 
} 

sub test { 
    my ($ee) = 0;  
} 

그래서 여기에 문제의

그래서, 여기에 코드의 두 조각입니다. 첫 번째 코드는 하나의 무한 루프 만 실행하고 매 2 초마다 운영 체제에 메모리를 다시 보냅니다 (ps에 따라)

두 번째 코드는 "for"루프 내에서 실행될 때만 메모리를 해제합니다. for 루프를 종료하고 무한 루프를 입력하면 for 루프로 해제되지 않은 모든 메모리가 절대로 운영 체제로 다시 릴리스되지 않습니다.

누구에게도 동일한 문제가 발생합니까?

펄 : 데비안 6.0.5

덕분에 많은


편집 : 1 : 내가 사용 x86_64에-리눅스 스레드 멀티에 대한

OS 내장 (v5.16.1) 800 개의 스레드와 모두 $ ee var 인쇄하여 종료 확인할.

하지만 while (1) 루프에 들어가면 여기에 ps aux | grep perl 출력 :

[email protected]:~# ps aux | grep perl 
root  6807 41.5 2.5 387780 209580 pts/0 S+ 16:38 0:02 /opt/ActivePerl-5.16/bin/perl /home/tttlast.pl 
root  7627 0.0 0.0 7548 856 pts/1 S+ 16:38 0:00 grep perl 

모든 스레드가 종료되었지만 메모리 사용량은 여전히 ​​내 서버 총 메모리의 2.5 %입니다. 프로그램을 죽이지 않으면 메모리가 여전히 사용 중입니다.


편집 2 : 나는 내 문제를 해결

, 내 구조를 변경했습니다. 실제로 주 프로그램 (장기 실행 프로그램)은 분리되어 있으며 모든 스레드가 종료되기 전에 기다리는 작은 프로그램을 사용합니다.

이렇게하면 가상 메모리가 가득 차고 다른 데몬은 죽지 않습니다.

나를 솔루션으로 안내하는 모든 분들께 감사드립니다.

+3

OS X 10.8/Perl 5.16.0에서 사용해 보았습니다. 첫 번째로 보는 동작은 약 6 메가 주민이 수천 스레드 뒤에있는 메모리 사용 수준입니다. 두 번째 단계는 거의 같은 수준에서 벗어나 수면 상태를 유지합니다. 스레드 메모리는 분명히 두 경우 모두 릴리스됩니다. 메모리가 공개되지 않는다는 증거를 더 게시 할 수 있습니까? 어쩌면'ps'가 1 초마다 출력 될까요? – Schwern

+0

ps 출력이 추가되었습니다. 실제로 실제 프로그램은 더 복잡하고, 불에 타지 않기 위해 여기에 게시하지는 않았지만 오랜 시간 동안 실행하고 매 시간마다 250에서 900 개의 스레드를 열어 전체 메모리를 전체 메모리의 약 10 %로 풀어 놓지 않습니다. . 그러나 이것은 두 번째 예와 완전히 같습니다. 더 많은 정보가 필요한 경우 알려주십시오. 덕분에 – user1761742

+1

내가 틀렸다고 정정 해 주지만 * 프로세스 *가 종료 될 때 Perl * only * 무료 메모리를 사용하지 않습니까? 이것은 오랫동안 지속 되어온 "기능"이었으며, 최근 perldeltas에서 스레딩과 관련된 최적화의 증거를 찾을 수 없었습니다. 나는 당신이 "누설"보다 목격했다고 주장하는 메모리 사용의 감소 *에 더 놀랐습니다. – amon

답변

4

여기에 "문제"가 없습니다. 이것은 모두 정상적이고 예상되는 동작입니다. 이것이 어떤 문제를 일으키는 경우, 그것이 무엇인지 설명하지 않았습니다.

가상 메모리가 희소 한 리소스가 아니기 때문에 운영 체제로 가상 메모리를 반환 할 이유가 없습니다. 운영 체제가 물리적 메모리를 더 나은 용도로 사용한다면 운영 체제에서이를 가져올 것이므로 실제 메모리를 운영 체제로 되돌릴 필요는 없습니다.

메모리 누수가 있다는 증거는 없습니다. 테스트 결과에 따르면 메모리 사용이 제한없이 증가하는 경우는 없습니다. 결국 모든 경우에 수평이됩니다.

+0

당신이 옳았음을 확인했습니다. 다른 프로세스가 사용하는 메모리는 perl 프로그램이 메모리를 필요로 할 때 사용됩니다. 문제는 mysql과 메일 서버처럼 perl 메모리에서 다른 프로세스가 삭제된다는 것입니다. 펄 프로그램은 mysql과 메일 서버를 사용하여 실행한다. 내 게시물을 편집하거나 다른 질문을 게시해야합니까? Btw 고마워요 – user1761742

+1

당신은 너무 많은 스레드를 만들어서는 안됩니다. 그것은 합리적인 것이 아닙니다. –

관련 문제