如何在perl中加速Parallel :: ForkManager

时间:2017-04-07 01:11:02

标签: multithreading perl

我正在使用EC2亚马逊服务器执行63个文件的数据处理, 我使用的服务器有16核,但使用perl Parallel :: ForkManager,线程数=核心数,然后看起来核心的一半正在睡眠,工作核心不是100%,波动在25%~50%左右 我也检查了IO,它主要是在做什么。

this

1 个答案:

答案 0 :(得分:2)

简短的回答是 - 我们无法告诉你,因为它完全取决于什么&do;'正在做。

并行代码不能创建线性速度增加的主要原因是:

  • 流程创建开销 - 一些'工作'是为了产生一个过程,所以如果这些孩子很小,就会产生浪费。努力。
  • 满足资源 - 最常见的是磁盘IO,但文件锁,数据库句柄,套接字或进程间通信等也可以发挥作用。
  • 其他导致“退缩”的事情。这会拖延一个过程。

并且不知道' do_stuff'是的,我们无法猜测它可能是什么。

但是,我建议采取以下几个步骤:

  • 将进程数加倍,使CPU计数增加一倍。这通常是一个“甜蜜点”。因为这意味着进程中的任何非CPU延迟只意味着其中一个进入全速。
  • 试试strace -fTt <yourprogram>(如果您使用的是Linux,那么其他Unix版本的命令会略有不同)。然后使用strace -fTtc再次执行此操作,因为c将汇总系统调用运行时间。看看哪些人花了最多的时间&#39;。
  • 描述您的代码以查看热点的位置。 Devel::NYTProf是您可以使用的一个库。

还有几个小问题:

my $manager=new Parallel::ForkManager($cpu->count);

写得更好:

my $manager=Parallel::ForkManager -> new ( $cpu->count);

而不是使用间接对象表示法。

如果你只是迭代@files那么最好不要使用循环计数变量而是:

foreach my $file ( @files ) { 
    $manager -> start and next;
    do_stuff($file);
    $manager -> finish;
}