2012-10-20 39 views
8

Tôi hiện đang tìm kiếm 2 tuần về vấn đề này và dường như tôi không thể tìm thấy câu trả lời nào chỉ tìm kiếm trên web.Rò rỉ bộ nhớ Perl trong chủ đề (chủ đề không giải phóng bộ nhớ)

Vì vậy, đây là hai đoạn mã:

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;  
} 

Vì vậy, đây là vấn đề. Mã đầu tiên chỉ chạy một vòng lặp vô hạn và nó giải phóng bộ nhớ về hệ điều hành khoảng 2 giây (theo ps)

Mã thứ hai cũng giải phóng bộ nhớ nhưng chỉ khi nó chạy bên trong vòng lặp "for". Sau khi thoát khỏi vòng lặp for và nhập vòng lặp vô hạn, tất cả bộ nhớ chưa được giải phóng vào vòng lặp for sẽ không bao giờ được trả về hệ điều hành.

Có ai đang gặp phải vấn đề tương tự không?

Perl: (v5.16.1) xây dựng cho x86_64-linux-thread-đa

Hệ điều hành: Debian 6.0.5

Thanks a lot


Sửa 1: tôi đã sử dụng 800 chủ đề và tất cả xác minh rằng họ thoát bằng cách in $ ee var.

Nhưng khi nhập vòng lặp while (1) ở đây là ps aux | đầu ra 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 

Vì vậy, tất cả các chuỗi đã hết nhưng mức sử dụng bộ nhớ vẫn là 2,5% tổng số bộ nhớ máy chủ của tôi. Vì vậy, trừ khi tôi giết chương trình, bộ nhớ vẫn đang được sử dụng.


Chỉnh sửa 2:

tôi giải quyết vấn đề của tôi, tôi đã thay đổi cấu trúc của tôi. Trong thực tế, chương trình chính (chạy dài) đã được tách ra và tôi sử dụng chương trình nhỏ, những người chờ đợi trước khi tất cả các chủ đề kết thúc để thoát.

Bằng cách này Nó không đầy đủ bộ nhớ ảo và daemon khác không bị giết.

Nhờ mọi người dẫn tôi đến giải pháp đó.

+3

Tôi đã thử chúng trên OS X 10.8/Perl 5.16.0. Các hành vi tôi nhìn thấy đầu tiên là mức độ sử dụng bộ nhớ tắt sau một vài nghìn chủ đề ở khoảng 6 megs cư dân. Các cấp độ thứ hai ở mức tương đương và vẫn ở đó lúc ngủ. Bộ nhớ luồng rõ ràng đang được phát hành trong cả hai trường hợp. Bạn có thể đăng thêm bằng chứng rằng bộ nhớ không được phát hành? Có lẽ đầu ra 'ps' mỗi giây? – Schwern

+0

Đã thêm đầu ra ps. Trong thực tế, chương trình thực sự phức tạp hơn, không được đăng ở đây để không bị quấy rầy, nhưng nó chạy trong thời gian dài và mỗi giờ mở khoảng 250 đến 900 luồng đầy bộ nhớ tới khoảng 10% tổng bộ nhớ của tôi và không bao giờ phát hành . Nhưng đây là cách chính xác giống như trong ví dụ thứ hai. Hãy cho tôi biết nếu bạn cần thêm thông tin. cảm ơn – user1761742

+1

Đúng nếu tôi sai, nhưng không phải Perl * chỉ * bộ nhớ trống khi một tiến trình * thoát ra? Đây là một "tính năng" lâu đời, và tôi không thể tìm thấy bất kỳ bằng chứng nào về sự tối ưu hóa về luồng trong các tầng lớp gần đây. Tôi ngạc nhiên hơn bởi việc giảm * sử dụng bộ nhớ mà bạn cho là đã chứng kiến ​​hơn là "rò rỉ". – amon

Trả lời

4

Không có "vấn đề" ở đây. Đây là hành vi bình thường, mong đợi. Nếu điều này gây ra cho bạn một số loại vấn đề, bạn đã không giải thích nó là gì.

Không có lý do gì để trả lại bộ nhớ ảo cho hệ điều hành vì bộ nhớ ảo không phải là tài nguyên khan hiếm. Không có lý do gì để trả lại bộ nhớ vật lý cho hệ điều hành vì hệ điều hành sẽ lấy nó nếu nó sử dụng tốt hơn cho nó.

Không có bằng chứng nào là rò rỉ bộ nhớ. Kết quả thử nghiệm cho thấy rằng không có trường hợp nào việc sử dụng bộ nhớ tăng lên mà không bị ràng buộc - trong mọi trường hợp, nó sẽ giảm dần.

+0

Chỉ cần xác minh và bạn đã đúng. Bộ nhớ được sử dụng bởi các quá trình khác được thực hiện khi chương trình perl cần bộ nhớ. Vấn đề trong thực tế là quá trình khác từ perl mất bộ nhớ bị giết, như mysql và mail server. Và chương trình perl sử dụng mysql và máy chủ mail để chạy. Tôi có nên chỉnh sửa bài đăng của mình hoặc đăng câu hỏi khác không? Btw cảm ơn rất nhiều – user1761742

+1

Bạn không nên tạo quá nhiều chủ đề. Nó không hợp lý. –