【问题标题】:Perl perl-5.8.8-38 Vs perl-5.10.1-136.el6.x86_64 Thread Memory leakPerl perl-5.8.8-38 与 perl-5.10.1-136.el6.x86_64 线程内存泄漏
【发布时间】:2014-11-21 00:54:46
【问题描述】:

我对 perl 有点陌生。但是我在线程实现中看到了这种内存泄漏。 比较的版本 perl-5.8.8-38 VS perl-5.10.1-136.el6.x86_64

我执行的代码是

#!/usr/bin/perl -w

my $pid            = "$$";
my $profileCommand = "/export/user_share/builder/cyborgtools/process_profiler/bin/process_profiler $pid";
print "$profileCommand\n";
system("$profileCommand 2>&1 >> /var/log/processProfiler_exec.log &");

#use threads('stack_size' => 5242880);
use threads;
use threads::shared;

my $curr_size = threads->get_stack_size();

my @threads;

my @cmds = ( "Anugraha", "Rinky", "Pratyush", "Shubham" );
for my $cmd (@cmds) {
    my $thread = threads->new( \&execCmd, $cmd );
    push( @threads, $thread );
    my $size = $thread->get_stack_size();
    print "Invoked stack for $cmd with stack size $size\n";
}

foreach (@threads) {
    $_->join;
}

print "Thread main entering into sleep mode (10 secs) after thread join\n";
sleep(10);
exit;

sub execCmd {
    my ($threadCmd) = @_;
    print "In execCmd for thread $threadCmd\n";
    print "Entering sleep mode (5secs) for thread with cmd $threadCmd\n";
    sleep(5);
}

以上代码的输出执行 Perl 版本:perl-5.8.8-38

[root@my-machine ~]# ./temp.pl 
/tmp/process_profiler 7216
Invoked stack for Anugraha with stack size 10485760
In execCmd for thread Anugraha
Entering sleep mode (5secs) for thread with cmd Anugraha
Invoked stack for Rinky with stack size 10485760
In execCmd for thread Rinky
Entering sleep mode (5secs) for thread with cmd Rinky
Invoked stack for Pratyush with stack size 10485760
Invoked stack for Shubham with stack size 10485760
In execCmd for thread Pratyush
Entering sleep mode (5secs) for thread with cmd Pratyush
In execCmd for thread Shubham
Entering sleep mode (5secs) for thread with cmd Shubham
Thread main entering into sleep mode (10 secs) after thread join
[root@my-machine ~]#

以上代码的输出执行 Perl 版本:perl-5.10.1-136.el6.x86_64

[asinha@hydra-cyborgmother perl_thread_testing]$ ./temp.pl 
/export/user_share/builder/cyborgtools/process_profiler/bin/process_profiler 9566
Invoked stack for Anugraha with stack size 10485760
In execCmd for thread Anugraha
Entering sleep mode (5secs) for thread with cmd Anugraha
Invoked stack for Rinky with stack size 10485760
In execCmd for thread Rinky
Entering sleep mode (5secs) for thread with cmd Rinky
Invoked stack for Pratyush with stack size 10485760
In execCmd for thread Pratyush
Entering sleep mode (5secs) for thread with cmd Pratyush
Invoked stack for Shubham with stack size 10485760
In execCmd for thread Shubham
Entering sleep mode (5secs) for thread with cmd Shubham
Thread main entering into sleep mode (10 secs) after thread join
[asinha@hydra-cyborgmother perl_thread_testing]$

我有一个本地内存分析实用程序作为 process_profiler 它基本上遍历 proc 文件系统任务目录中的 PID 以查看线程 并带出内存信息。

此分析器在 PERL 版本 perl-5.8.8-38 上的上述代码的输出

---------------------------------------------------------------------------------------------
Date                  PID   VmPeak   VmSize   VmHWM   VmRSS   VmData   VmStk   CmdLine   Parent
---------------------------------------------------------------------------------------------
2014-09-26 05:02:33   7216   225088KB   192136KB   5040KB   5040KB   110780KB   88KB   /usr/bin/perl   *
2014-09-26 05:02:34   7216   225088KB   192136KB   5040KB   5040KB   110780KB   88KB   /usr/bin/perl   *
2014-09-26 05:02:34   7220   225088KB   192136KB   5040KB   5040KB   110780KB   88KB   /usr/bin/perl   
2014-09-26 05:02:34   7225   225088KB   192136KB   5040KB   5040KB   110780KB   88KB   /usr/bin/perl   
2014-09-26 05:02:34   7227   225088KB   192136KB   5040KB   5040KB   110780KB   88KB   /usr/bin/perl   
2014-09-26 05:02:34   7231   225088KB   192136KB   5040KB   5040KB   110780KB   88KB   /usr/bin/perl   
2014-09-26 05:02:35   7216   225088KB   192136KB   5040KB   5040KB   110780KB   88KB   /usr/bin/perl   *
2014-09-26 05:02:35   7220   225088KB   192136KB   5040KB   5040KB   110780KB   88KB   /usr/bin/perl   
2014-09-26 05:02:35   7225   225088KB   192136KB   5040KB   5040KB   110780KB   88KB   /usr/bin/perl   
2014-09-26 05:02:35   7227   225088KB   192136KB   5040KB   5040KB   110780KB   88KB   /usr/bin/perl   
2014-09-26 05:02:35   7231   225088KB   192136KB   5040KB   5040KB   110780KB   88KB   /usr/bin/perl   
2014-09-26 05:02:36   7216   225088KB   192136KB   5040KB   5040KB   110780KB   88KB   /usr/bin/perl   *
2014-09-26 05:02:36   7220   225088KB   192136KB   5040KB   5040KB   110780KB   88KB   /usr/bin/perl   
2014-09-26 05:02:36   7225   225088KB   192136KB   5040KB   5040KB   110780KB   88KB   /usr/bin/perl   
2014-09-26 05:02:36   7227   225088KB   192136KB   5040KB   5040KB   110780KB   88KB   /usr/bin/perl   
2014-09-26 05:02:36   7231   225088KB   192136KB   5040KB   5040KB   110780KB   88KB   /usr/bin/perl   
2014-09-26 05:02:37   7216   225088KB   192136KB   5040KB   5040KB   110780KB   88KB   /usr/bin/perl   *
2014-09-26 05:02:37   7220   225088KB   192136KB   5040KB   5040KB   110780KB   88KB   /usr/bin/perl   
2014-09-26 05:02:37   7225   225088KB   192136KB   5040KB   5040KB   110780KB   88KB   /usr/bin/perl   
2014-09-26 05:02:37   7227   225088KB   192136KB   5040KB   5040KB   110780KB   88KB   /usr/bin/perl   
2014-09-26 05:02:37   7231   225088KB   192136KB   5040KB   5040KB   110780KB   88KB   /usr/bin/perl   
2014-09-26 05:02:38   7216   225088KB   181220KB   5040KB   4948KB   99864KB   88KB   /usr/bin/perl   *
2014-09-26 05:02:39   7216   225088KB   181220KB   5040KB   4948KB   99864KB   88KB   /usr/bin/perl   *
2014-09-26 05:02:40   7216   225088KB   181220KB   5040KB   4948KB   99864KB   88KB   /usr/bin/perl   *
2014-09-26 05:02:41   7216   225088KB   181220KB   5040KB   4948KB   99864KB   88KB   /usr/bin/perl   *
2014-09-26 05:02:42   7216   225088KB   181220KB   5040KB   4948KB   99864KB   88KB   /usr/bin/perl   *
2014-09-26 05:02:43   7216   225088KB   181220KB   5040KB   4948KB   99864KB   88KB   /usr/bin/perl   *
2014-09-26 05:02:44   7216   225088KB   181220KB   5040KB   4948KB   99864KB   88KB   /usr/bin/perl   *
2014-09-26 05:02:45   7216   225088KB   181220KB   5040KB   4948KB   99864KB   88KB   /usr/bin/perl   *
2014-09-26 05:02:46   7216   225088KB   181220KB   5040KB   4948KB   99864KB   88KB   /usr/bin/perl   *
2014-09-26 05:02:47   7216   225088KB   181220KB   5040KB   4948KB   99864KB   88KB   /usr/bin/perl   *

此分析器在 PERL 版本 perl-5.10.1-136.el6.x86_64 上的上述代码的输出

---------------------------------------------------------------------------------------------
Date                  PID   VmPeak   VmSize   VmHWM   VmRSS   VmData   VmStk   CmdLine   Parent
---------------------------------------------------------------------------------------------
2014-09-26 10:01:28   9566   129820KB   282600KB   5540KB   5540KB   306888KB   88KB   /usr/bin/perl   *
2014-09-26 10:01:29   9566   500636KB   435100KB   5540KB   5540KB   306888KB   88KB   /usr/bin/perl   *
2014-09-26 10:01:29   9574   500636KB   435100KB   5540KB   5540KB   306888KB   88KB   /usr/bin/perl   
2014-09-26 10:01:29   9577   500636KB   435100KB   5540KB   5540KB   306888KB   88KB   /usr/bin/perl   
2014-09-26 10:01:29   9581   500636KB   435100KB   5540KB   5540KB   306888KB   88KB   /usr/bin/perl   
2014-09-26 10:01:29   9583   500636KB   435100KB   5540KB   5540KB   306888KB   88KB   /usr/bin/perl   
2014-09-26 10:01:30   9566   500636KB   435100KB   5540KB   5540KB   306888KB   88KB   /usr/bin/perl   *
2014-09-26 10:01:30   9574   500636KB   435100KB   5540KB   5540KB   306888KB   88KB   /usr/bin/perl   
2014-09-26 10:01:30   9577   500636KB   435100KB   5540KB   5540KB   306888KB   88KB   /usr/bin/perl   
2014-09-26 10:01:30   9581   500636KB   435100KB   5540KB   5540KB   306888KB   88KB   /usr/bin/perl   
2014-09-26 10:01:30   9583   500636KB   435100KB   5540KB   5540KB   306888KB   88KB   /usr/bin/perl   
2014-09-26 10:01:31   9566   500636KB   435100KB   5540KB   5540KB   306888KB   88KB   /usr/bin/perl   *
2014-09-26 10:01:31   9574   500636KB   435100KB   5540KB   5540KB   306888KB   88KB   /usr/bin/perl   
2014-09-26 10:01:31   9577   500636KB   435100KB   5540KB   5540KB   306888KB   88KB   /usr/bin/perl   
2014-09-26 10:01:31   9581   500636KB   435100KB   5540KB   5540KB   306888KB   88KB   /usr/bin/perl   
2014-09-26 10:01:31   9583   500636KB   435100KB   5540KB   5540KB   306888KB   88KB   /usr/bin/perl   
2014-09-26 10:01:33   9566   500636KB   435100KB   5540KB   5540KB   306888KB   88KB   /usr/bin/perl   *
2014-09-26 10:01:33   9574   500636KB   435100KB   5540KB   5540KB   306888KB   88KB   /usr/bin/perl   
2014-09-26 10:01:33   9577   500636KB   435100KB   5540KB   5540KB   306888KB   88KB   /usr/bin/perl   
2014-09-26 10:01:33   9581   500636KB   435100KB   5540KB   5540KB   306888KB   88KB   /usr/bin/perl   
2014-09-26 10:01:33   9583   500636KB   435100KB   5540KB   5540KB   306888KB   88KB   /usr/bin/perl   
2014-09-26 10:01:34   9566   500636KB   424808KB   5540KB   5532KB   296596KB   88KB   /usr/bin/perl   *
2014-09-26 10:01:35   9566   500636KB   424808KB   5540KB   5532KB   296596KB   88KB   /usr/bin/perl   *
2014-09-26 10:01:36   9566   500636KB   424808KB   5540KB   5532KB   296596KB   88KB   /usr/bin/perl   *
2014-09-26 10:01:37   9566   500636KB   424808KB   5540KB   5532KB   296596KB   88KB   /usr/bin/perl   *
2014-09-26 10:01:38   9566   500636KB   424808KB   5540KB   5532KB   296596KB   88KB   /usr/bin/perl   *
2014-09-26 10:01:39   9566   500636KB   424808KB   5540KB   5532KB   296596KB   88KB   /usr/bin/perl   *
2014-09-26 10:01:40   9566   500636KB   424808KB   5540KB   5532KB   296596KB   88KB   /usr/bin/perl   *
2014-09-26 10:01:41   9566   500636KB   424808KB   5540KB   5532KB   296596KB   88KB   /usr/bin/perl   *
2014-09-26 10:01:42   9566   500636KB   424808KB   5540KB   5532KB   296596KB   88KB   /usr/bin/perl   *
2014-09-26 10:01:43   9566   500636KB   424808KB   5540KB   5532KB   296596KB   88KB   /usr/bin/perl   *

我认为 perl-5.10.1-136.el6.x86_64 上存在内存问题。 我在这里遗漏了什么吗?


编辑

这两种情况下最大堆栈大小的 ulimit 都是 10240KB。两者都是具有 8GB RAM 和 16GB 交换空间的 linux (x86_64) 机器。 perl 版本 perl-5.8.8-38 = 2.6.18-308.11.1.el5.x86_64 的内核 perl 版本的内核 perl-5.10.1-136.el6.x86_64 = 2.6.32-431.el6.x86_64

【问题讨论】:

  • (1) 我可以看到峰值使用率更高,但看不到任何泄漏(增加的数字)并且 RSS 似乎稳定且可比较。您能否更明确地说明您认为存在泄漏的原因。 (2) 下载 perlbrew 并使用最近的 Perl 进行尝试 - 如果 5.10 中出现问题,则不会有错误修复,是吗?
  • @RichardHuxton 我关心的是 VmData。是的,VmRSS 和 VmHWM 一致且低。但是,VmData 太高,两个版本之间相差 3 倍左右。
  • 它可能“太高了”,但据我所知,它并没有稳定增长,所以这不是内存泄漏。此外,就像我说的,没有人可以做任何事情。 Perl 5.10 的最后一个版本是五年前。如果出现问题,请尝试使用最新版本。

标签: multithreading perl memory-leaks


【解决方案1】:

使用 perl 吸引人们的一件事是内存使用。 Perl 有自己的内存分配和垃圾收集,所以如果你从操作系统的角度来看它……你会得到一个扭曲的画面。通常你不需要担心“整理”,但你需要稍微小心以确保事情的范围是适当的。例如,全局变量是内存泄漏的典型来源,因为您可以不断向数组添加元素。

不过,从根本上说,正如 cmets 中所指出的那样,您的 RSS 不会随着时间的推移而发生太大变化。无论如何,很难在几秒钟内发现内存泄漏。因此它看起来不像一个 - 但如果循环和循环更长,它可能会更明显一些。

即使您在 perl 5.8 或 5.10 中发现了一个错误……您也不太可能会发现有人急于分析您的错误,因为它们分别在 2008 年和 2009 年结束了生命周期。 (是的,我知道这是一篇较旧的帖子,距离 EOL 还差 5 年)。

最新的 perl(撰写本文时为 5.20)可在此处找到:http://www.cpan.org/src/README.html

【讨论】:

    猜你喜欢
    • 2012-03-06
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2011-03-22
    • 2012-08-12
    • 2013-08-27
    相关资源
    最近更新 更多