Оптимизация скриптов на perl используя threads

Есть у меня скрипт, который обходит пачку серверов внешней утилитой zabbix_get, получает значения нужных ключей, складывает их и отдает ответ. И вот пришла мне в голову идея оптимизировать это дело используя нити, что бы работало все это паралельно, а не последовательно.
Было:
[cc lang=»perl»]sub get_value_from_Zagent(){
foreach $_ (@_){
print «DEBUG: run external command: /begun/zabbix/bin/zabbix_get -s $_ -k \»json[$toolset, $key]\»=» if $debug;
$result += `/begun/zabbix/bin/zabbix_get -s $_ -k «json[$ARGV[1], $key]»`;
print «$result\n» if $debug;
}

return $result;
}
[/cc]
Стало:
[cc lang=»perl»]
sub threads_get_value_from_Zageng(){
while ($_ = $quere_host->dequeue){
$quere_result->enqueue(`/begun/zabbix/bin/zabbix_get -s $_ -k \»json[$toolset, $key]\»`);
}

}
sub get_value_from_Zagent(){
use threads;
use Thread::Queue;
my @threads;

push @threads, threads->create(\&threads_get_value_from_Zageng) for (1..5);

my @hosts = @_;
my $result;

for (@hosts){
$quere_host->enqueue($_);
print $_ if $debug;
}

for (@threads){
$quere_host->enqueue(undef);
}
$_->join for(@threads);

$quere_result->enqueue(undef);
while ($_=$quere_result->dequeue){
$result += $_;
}
return $result;
}
[/cc]
Итоги: при 5ти трэдах падение скорости выполнения примерно 30%, чем больше трэдов, тем медленней работает. Если трэдов всего 2, то потери производительности нет (или она в пределах статистической погрешности).

You can leave a response, or trackback from your own site.

Leave a Reply

Subscribe to RSS Feed