Перейти к содержанию

Распределенные и параллельные вычисления/Приложение 1

Материал из Викиучебника — открытых книг для открытого мира

Чтобы получить список всех доступных узлов в кластере, с помощью утилиты gstat из пакета ganglia, необходимо выполнить серию команд в конвейере:

echo `gstat -a -1 -l -n| sed -e 's/ .*$//g'| paste -s -d ','| sed -e 's/,/, /g'`

Вместо команды echo можно использовать любую команду, которая будет обрабатывать список узлов, например mpirun

Аналогичную задачу можно решить с помощью скрипта на языке perl:

#!/usr/bin/perl
#-w -d

$dbg="";
$hlp="";
$hnmbr=100;

# Перебираем аргументы (параметры) коммандной строки
while ($arg = shift @ARGV)
{
    if($arg eq "-d") { $dbg="true"; }
    else { if($arg eq "-h" || $arg eq "--help") {$hlp="true"}
		else { if($arg eq '-n') { $hnmbr=shift @ARGV; }
		     }
	 }
}

if($hlp)
{
    print "-d debug mode\n";
    print "-h --help prints this message\n";
    exit;
}

# Определяем опрерационную систему
if($dbg) { print $^O, "\n", "Будет использовано $hnmbr хостов.\n"; }

# Получаем информацию из ganglia
$_=`gstat -a -1 -l -n`;
#$_='';
if($dbg) { print; }

# Преобразуем в массив строк
@lines=split /\n/;
$lines[0]=~m/\d+\.\d+\.\d+\.\d+/;
if ($& eq '')
{
    #print 'Не возможно получить информацию из ganglia!!!';
    print '127.0.0.1';
    exit;
}

if ($dbg)
{
    print "\n==================\n", $&, "\n==============\n";
    foreach $i (@lines) { print $i.">>\n"; }
}

# Инициализация счетчика
$dlt=101;
$name=$dlt;

foreach (@lines)
{
    s/[\[\],\(\)\/]/ /g;
    @$name=split;
    $name++;
}

# Всего узлов доступно
$atall  = +@lines;
$atalli = $atall+$dlt;

# Отладочный вывод
if ($dbg) { print "Всего узлов доступно: ", $atall, "\n"; }

# Отладочный вывод
if ($dbg) { for($i=$dlt; $i < $atalli; $i++) { print "host ".$i." ip=".$$i[0]."\n"; } }

# Не обязательная инициализация массива
%asoc=();
$suf=0.0001;
$iname="";

##################################
for($i2=$dlt; $i2 < $atalli; $i2++)
{
    $iname=$$i2[6]+$suf+(100-$$i2[10]);
    $asoc{$iname} = $$i2[0];
    $suf+=0.0001;
    if ($dbg)
    {
	print "\n>>>", $$i2[6], "=", $$i2[0];
	print "\n>  ", "asoc", $iname, "=", $asoc{$iname}, "\n";
    }
}

$cntr=1;

foreach $kk (sort keys %asoc)
{
    $hlist.=$asoc{$kk}.", ";
    if($cntr >= $hnmbr) { last; }
    $cntr++;
}
$hosts = $hlist;
$hosts =~ s/..$//;
print $hosts;

__END__