【发布时间】:2015-11-30 06:36:39
【问题描述】:
我编写了一个小 perl 脚本,它可以多次启动一个程序,在 for 循环中使用不同的参数。该程序进行数值计算并使用整个 CPU(如果可以的话)。我有几个可用的 CPU,所以理想情况下,我想一次启动与可用 CPU 一样多的程序实例,但不会更多。由于可能有其他进程正在运行,因此可用 CPU 的数量并不总是相同的。
到目前为止我所做的是:
#!/usr/bin/perl
use strict;
use warnings;
use IPC::Open2;
use Parallel::ForkManager;
my $program = "./program";
my($out, $in);
my $pid;
my $pm = new Parallel::ForkManager(44);
for my $x (0..100){
my $childpid = $pm->start and next;
$pid= open2($out, $in, $program);
print $in <<EOF;
#input involving $x
EOF
my $printstring = "";
while(<$out>){
if (/^\s*1\.000\s+(-\S+)D(\S+)\s*$/){
$printstring .= "$1e$2";
}
}
print $printstring, "\n";
waitpid( $pid, 0 );
$pm->finish;
}
$pm->wait_all_children;
print "\n\n END\n";
这显然包含要启动的固定数量的进程,因此可以使用固定数量的 CPU,我不知道如何进行更改以灵活确定可用的 CPU 并相应地更改子节点的数量.任何想法如何做到这一点?
更新:
需要明确的是,这里的限制因素绝对是 CPU 时间,而不是 I/O 的东西。
我查看了loadavg,但我对它的输出感到困惑。
68.71 66.40 63.72 70/1106 19247
同时top显示
Tasks: 978 total, 23 running, 955 sleeping, 0 stopped, 0 zombie
Cpu(s): 2.1%us, 1.5%sy, 93.3%ni, 3.1%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
CPU个数是48,所以我想如果第四个数字(在本例中为70)大于48,我不应该再启动任何子进程,但根据top似乎有一些空闲CPU 在那里,虽然第四个数字是 70。
【问题讨论】:
-
启动的正确进程数取决于所涉及的任务类型(内存密集型?cpu 密集型?i/o 密集型?)。看看
/proc/cpuinfo看看你安装了什么。 -
@xxfelixxx 如果允许的话,程序的一次运行会占用一个 CPU 的 100%。
-
@xxfelixxx 我知道我有什么 CPU,我不需要脚本来确定硬件信息。我有 48 个 CPU 可用,这就是为什么我将 44 作为最大子代数,因为这将为可能想要计算某些东西的其他人留下一些 CPU。我宁愿找出他们现在有多少是免费的,并相应地调整孩子的数量。
-
@fifaltra,检查
loadavg。用最简单的术语来说,它可以告诉您现在使用了多少 CPU/内核。如果数量大于 CPU 数量,则系统过载。
标签: perl parallel-processing cpu-usage