我已經寫了一個perl腳本多次啓動程序,在for循環中使用不同的參數。該程序進行數值計算,如果可以得到一個,則使用整個CPU。我有幾個CPU可用,所以理想情況下,我想一次啓動儘可能多的程序實例,因爲有可用的CPU,但不是更多。由於可能有其他進程在運行,可用CPU的數量並不總是相同的。使用Perl腳本來優化使用可用的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一千一百零六分之七十○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,我不應該啓動任何更多的子進程,但根據頂部似乎有一些閒置的CPU,雖然第四個數字是70.
啓動進程的數量取決於所涉及的任務類型(內存密集型?cpu-bound?I/O密集型?)。看一看'/ proc/cpuinfo'來看看你已經安裝了什麼。 – xxfelixxx
http://search.cpan.org/~jstowe/Linux-Cpuinfo-1.10/lib/Linux/Cpuinfo.pm – xxfelixxx
@xxfelixxx如果你願意,程序的一次運行使用100%的一個CPU。 – fifaltra