我正在使用EC2亚马逊服务器执行63个文件的数据处理, 我使用的服务器有16核,但使用perl Parallel :: ForkManager,线程数=核心数,然后看起来核心的一半正在睡眠,工作核心不是100%,波动在25%~50%左右 我也检查了IO,它主要是在做什么。
this
答案 0 :(得分:2)
简短的回答是 - 我们无法告诉你,因为它完全取决于什么&do;'正在做。
并行代码不能创建线性速度增加的主要原因是:
并且不知道' do_stuff'是的,我们无法猜测它可能是什么。
但是,我建议采取以下几个步骤:
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;
}