我写了一个小的Perl脚本,使用for循环以不同参数多次启动程序。该程序进行数字计算,如果可以获得整个CPU,则使用整个CPU。我有几个可用的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
该系统有48个CPU。因此,我本以为如果第四个数字(在本例中为70)大于48,就不应再启动任何子进程。然而,根据top命令的显示情况,似乎还有一些空闲的CPU,尽管第四个数字是70。
/proc/cpuinfo
以查看您安装了什么。 - xxfelixxxloadavg
。简单来说,它告诉你现在有多少个 CPU/核心正在使用。如果这个数字大于 CPU 的数量,那么系统就超载了。 - Dummy00001