[Rio-pm] Ajuda com Threads - tempo de abertura

João André Simioni jasimioni em gmail.com
Segunda Julho 12 18:43:25 PDT 2010


Eu não tenho preguiça de ler, mas queria fazer um teste rápido só para
ver o desempenho. Quando aumento para 400 o paralelismo, ele continua
não utilizando os demais processadores. Vou acabar forkeando o
processo.

Mas um bug apareceu. A maioria dos testes está dando timeout apesar do
hosts responderem.

Mas vou antes tentar corrigir o problema com o Net::Ping.

Obrigado

Em 12/07/10, Thiago Glauco Sanchez<thiagoglauco em ticursos.net> escreveu:
> Se bem que... o cara já tem o caminho das pedras... tava bom para ele
> começar a ler o código e os manuais...
> Hoje não posso ajudar mais pq tenho aulas de Perl para ministrar...
>
> Leia os Manuais e poste mais dúvidas... se postar levianamente Trolls
> podem aparecer.
>
> Em 12/07/2010 17:59, Bruno Buss escreveu:
>> Talvez você queira diminuir o timeout padrão:
>> sub PING_TIMEOUT () { 5 }
>> (No seu script era 1 segundo se não me engano)
>>
>> No POE::Component::Client::Ping->spawn, talvez você queira passar a
>> opção Parallelism, ex:
>> POE::Component::Client::Ping->spawn(
>>   Alias   => 'pinger',        # The component's name will be "pinger".
>>   Timeout => PING_TIMEOUT,    # The default ping timeout.
>>   Parallelism => 128
>> );
>
> No seu código o paralelismo era 250...
>
>>
>> 2010/7/12 João André Simioni <jasimioni em gmail.com
>> <mailto:jasimioni em gmail.com>>
>>
>>     Thiago,
>>
>>     dando uma bem de vagabundo, não li nada  do POE, só modifiquei o
>>     código abaixo para pingar todos os meus Hosts.
>>
>>     Mas ele está fazendo poucos processos paralelos. O tempo total de
>>     testes está 11 minutos com o POE, e o load nem faz cócegas. Sabem
>>     fácil como mexer nisso?
>>
>>     Obrigado
>>
>>     2010/7/12 Thiago Glauco Sanchez <thiagoglauco em ticursos.net
>>     <mailto:thiagoglauco em ticursos.net>>:
>>     > Puxa... eu sou muito "toupeira"... já tem código de exemplo para
>>     isso feito
>>     > e muito mais pratico e completo que o meu...:
>>     >
>>     > http://poe.perl.org/?POE_Cookbook/Pinging_Multiple_Hosts
>>     >
>>     > Em 12/07/2010 15:52, Thiago Glauco Sanchez escreveu:
>>     >>
>>     >> Um pequeno exemplo que eu criei apenas para ilustrar... o
>>     pessoal que
>>     >> desejar incrementar, por favor, be my guest.
>>     >>
>>     >> use 5.12.0;
>>     >>  use POE;
>>     >>  use Net::Ping;
>>     >>    POE::Session->create(
>>     >>        inline_states => {
>>     >>        _start  => sub {
>>     >>            my ($kernel) = $_[KERNEL];
>>     >>            print "Setting up a session\n";
>>     >>            $kernel->yield("ping");
>>     >>        },
>>     >>
>>     >>        ping => sub{my ($kernel) = $_[KERNEL];
>>     >>            my @ping = `ping -n 1 www.ticursos.net
>>     <http://www.ticursos.net>`;
>>     >>            map{say "ping externo ok" if $_ =~ /Perdidos = 0/ }
>>     @ping;
>>     >>            $kernel->delay_set("net_ping" => 3);
>>     >>
>>     >>        },
>>     >>
>>     >>        net_ping => sub{ my ($kernel) = $_[KERNEL];
>>     >>                    my $p = Net::Ping->new();
>>     >>                    $p->port_number(80);
>>     >>                    my ($ret, $duration, $ip) =
>>     $p->ping('ticursos.net <http://ticursos.net>');
>>     >>                    say "net::ping ok" if $ret;
>>     >>                    $p->close();
>>     >>                    $kernel->delay_set("ping" => 3)
>>     >>                },
>>     >>        },
>>     >>    );
>>     >>
>>     >>    say "Iniciando o Kernel...";
>>     >>    $poe_kernel->run(  );
>>     >>    exit(0);
>>     >>
>>     >>    sub start {
>>     >>        my ($kernel) = $_[KERNEL];
>>     >>       say "Iniciando os testes com POE";
>>     >>        $kernel->yield("ping");
>>     >>    }
>>     >>
>>     >>
>>     >> Em 12/07/2010 15:38, João André Simioni escreveu:
>>     >>>
>>     >>> O pessoal comentou - eu vou dar uma olhada nele com atenção.
>>     >>>
>>     >>> Obrigado pela dica.
>>     >>>
>>     >>> 2010/7/12 Thiago Glauco Sanchez<thiagoglauco em ticursos.net
>>     <mailto:thiagoglauco em ticursos.net>>:
>>     >>>>
>>     >>>> O Perl tem um framework para aplicações em rede e Multitarefa
>>     chamada
>>     >>>> POE
>>     >>>> que
>>     >>>> "Provide a cooperative scheduling and multitasking
>>     environment rivalling
>>     >>>> threads and IPC"
>>     >>>> Não seria o caso de estudarmos a possibilidade de usar esse
>>     framework no
>>     >>>> seu
>>     >>>> sistema???
>>     >>>>
>>     >>>> Em 11/07/2010 23:57, João André Simioni escreveu:
>>     >>>>>
>>     >>>>> Foi um typo - erro de digitação - o Net::Ping testa TCP e
>>     UDP. O ping
>>     >>>>> externo ICMP.
>>     >>>>>
>>     >>>>> Mas assim, eu preciso resolver o problema com esse teste em
>>     Perl -
>>     >>>>> como eu disse, essa parte do código é só um pedaço de um sistema
>>     >>>>> maior. SNMP já é usado para várias outras coisas, mas
>>     dependem de
>>     >>>>> access lists em routers e eu não tenho como liberar.
>>     >>>>>
>>     >>>>> []'s
>>     >>>>>
>>     >>>>> 2010/7/11 Thiago Glauco Sanchez<thiagoglauco em ticursos.net
>>     <mailto:thiagoglauco em ticursos.net>>:
>>     >>>>>
>>     >>>>>> O que eu quero dizer: você testou com o ping externo que é
>>     um teste
>>     >>>>>> icmp...
>>     >>>>>> depois fez outro teste icmp com o Net::Ping...
>>     >>>>>>
>>     >>>>>> Não seria mais interessante testar de outra forma?
>>     >>>>>>
>>     >>>>>>    $p = Net::Ping->new("tcp", 2);
>>     >>>>>>    $p->port_number(getservbyname("http", "tcp"));
>>     >>>>>>
>>     >>>>>> Mais umas coisas: Suas máquinas/equipamentos em teste estão via
>>     >>>>>> internet
>>     >>>>>> ou
>>     >>>>>> rede local?
>>     >>>>>> Já pensou em usar SNMP? Já tive um problema parecido e iria
>>     utilizar
>>     >>>>>> um
>>     >>>>>> processo para cada equipamento por desempenho e acabai
>>     optando por
>>     >>>>>> utilizar
>>     >>>>>> o Net:SNMP
>>     >>>>>> que permite utilizar uma função de callback em vez de
>>     utilizar um
>>     >>>>>> processo
>>     >>>>>> para cada equipamento. Eu mando uma requisição para todos os
>>     >>>>>> equipamentos
>>     >>>>>> e
>>     >>>>>> conforme eles respondem
>>     >>>>>> a função de call-back trata a requisição.
>>     >>>>>>
>>     >>>>>> Porém, não conheço o seu ambiente. Apenas acho que criar
>>     4000 threads
>>     >>>>>> não
>>     >>>>>> seja a melhor solução.
>>     >>>>>>
>>     >>>>>>
>>     >>>>>> Em 11/07/2010 23:18, João André Simioni escreveu:
>>     >>>>>>
>>     >>>>>>> É typo - já está certo no código. ICMP vai via comando
>>     externo, UDP e
>>     >>>>>>> TCP via Net::Ping.
>>     >>>>>>>
>>     >>>>>>> Com relação aos testes, é normal um momento de sobrecarga
>>     causar a
>>     >>>>>>> não
>>     >>>>>>> resposta de testes - essas sobrecargas não devem duram
>>     mais que 5
>>     >>>>>>> segundos. Por isso o sleep - assim eu faço o mesmo teste
>>     3x, com
>>     >>>>>>> intervalos de 3 segundos.
>>     >>>>>>>
>>     >>>>>>> []'s
>>     >>>>>>>
>>     >>>>>>> On Sun, Jul 11, 2010 at 10:31 PM, Blabos de
>>     Blebe<blabos em gmail.com <mailto:blabos em gmail.com>>
>>     >>>>>>>  wrote:
>>     >>>>>>>
>>     >>>>>>>
>>     >>>>>>>> Não seria um typo?
>>     >>>>>>>>
>>     >>>>>>>> icmp ->      ping;
>>     >>>>>>>> tcp e udp ->      Net::Ping
>>     >>>>>>>>
>>     >>>>>>>>
>>     >>>>>>>>
>>     >>>>>>>> On Sun, Jul 11, 2010 at 6:42 PM, Thiago Glauco Sanchez
>>     >>>>>>>> <thiagoglauco em ticursos.net
>>     <mailto:thiagoglauco em ticursos.net>>      wrote:
>>     >>>>>>>>
>>     >>>>>>>>
>>     >>>>>>>>> Sim sim, entendi sua preocupação.
>>     >>>>>>>>> Mas em vez de:
>>     >>>>>>>>>
>>     >>>>>>>>> for (1..3) {
>>     >>>>>>>>>           my $ping = `/bin/ping -c 1 -w 1 $ip`;
>>     >>>>>>>>>
>>     >>>>>>>>> não seria melhor já mandar pingar as 3 vezes no comando
>>     ou apenas
>>     >>>>>>>>> 1?
>>     >>>>>>>>> Você
>>     >>>>>>>>> está gerando 3 processos externos sem necessidade real.
>>     >>>>>>>>>
>>     >>>>>>>>> outra... o comando ping já não é icmp?
>>     >>>>>>>>> my $p = Net::Ping->new('icmp')???
>>     >>>>>>>>>
>>     >>>>>>>>>
>>     >>>>>>>>> Em 11/07/2010 17:04, João André Simioni escreveu:
>>     >>>>>>>>>
>>     >>>>>>>>>
>>     >>>>>>>>>> Eu quero fazer o ping de 3 formas - UDP Echo / TCP Echo
>>     e ICMP
>>     >>>>>>>>>> Echo.
>>     >>>>>>>>>> Alguns clientes tem filtros e assim eu evito falsos
>>     positivos.
>>     >>>>>>>>>>
>>     >>>>>>>>>> Net::Ping mesmo com root tem resultados incoerentes
>>     quando uso
>>     >>>>>>>>>> ICMP e
>>     >>>>>>>>>> Threads.
>>     >>>>>>>>>>
>>     >>>>>>>>>> []'s
>>     >>>>>>>>>>
>>     >>>>>>>>>> On Sun, Jul 11, 2010 at 4:56 PM, Thiago Glauco Sanchez
>>     >>>>>>>>>> <thiagoglauco em ticursos.net
>>     <mailto:thiagoglauco em ticursos.net>>        wrote:
>>     >>>>>>>>>>
>>     >>>>>>>>>>
>>     >>>>>>>>>>
>>     >>>>>>>>>>> Endosso a solução do Lorn. Use o POE.
>>     >>>>>>>>>>>
>>     >>>>>>>>>>> E cara... pra que isso??
>>     >>>>>>>>>>>
>>     >>>>>>>>>>> sub checkIp {
>>     >>>>>>>>>>>    my $ip = shift;
>>     >>>>>>>>>>>    my $pingOk = 0;
>>     >>>>>>>>>>>
>>     >>>>>>>>>>>    eval {
>>     >>>>>>>>>>>        for (1..3) {
>>     >>>>>>>>>>>            my $ping = `/bin/ping -c 1 -w 1 $ip`;
>>     >>>>>>>>>>>
>>     >>>>>>>>>>>            if (grep { / 0% packet loss/ } $ping) {
>>     >>>>>>>>>>>                $pingOk = 1;
>>     >>>>>>>>>>>                return 1;
>>     >>>>>>>>>>>            }
>>     >>>>>>>>>>>
>>     >>>>>>>>>>>            if ($pingOk == 0) {
>>     >>>>>>>>>>>                my $p = Net::Ping->new('icmp');
>>     >>>>>>>>>>>                $p->service_check(1);
>>     >>>>>>>>>>>                if ($p->ping($ip, 1)) {
>>     >>>>>>>>>>>                    $pingOk = 1;
>>     >>>>>>>>>>>                    return 1;
>>     >>>>>>>>>>>                }
>>     >>>>>>>>>>>            }
>>     >>>>>>>>>>>
>>     >>>>>>>>>>>            if ($pingOk == 0) {
>>     >>>>>>>>>>>                my $p = Net::Ping->new('udp');
>>     >>>>>>>>>>>                $p->service_check(1);
>>     >>>>>>>>>>>                if ($p->ping($ip, 1)) {
>>     >>>>>>>>>>>                    $pingOk = 1;
>>     >>>>>>>>>>>                    return 1;
>>     >>>>>>>>>>>                }
>>     >>>>>>>>>>>            }
>>     >>>>>>>>>>>
>>     >>>>>>>>>>>            sleep 3;
>>     >>>>>>>>>>>        }
>>     >>>>>>>>>>>    };
>>     >>>>>>>>>>>
>>     >>>>>>>>>>> Para pingar com ping externo, depois com o Net::Ping
>>     via icmp e
>>     >>>>>>>>>>> depois
>>     >>>>>>>>>>> com
>>     >>>>>>>>>>> net::Ping udp? Ah... se não me engano, Net::Ping
>>     precisa de
>>     >>>>>>>>>>> permissão
>>     >>>>>>>>>>> root
>>     >>>>>>>>>>> para retornar um icmp de forma correta...
>>     >>>>>>>>>>>
>>     >>>>>>>>>>>
>>     >>>>>>>>>>> Em 09/07/2010 17:48, João André Simioni escreveu:
>>     >>>>>>>>>>>
>>     >>>>>>>>>>>
>>     >>>>>>>>>>>
>>     >>>>>>>>>>>> Caros,
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>> tenho um script para testar cerca de 4700
>>     equipamentos, usando
>>     >>>>>>>>>>>> ping.
>>     >>>>>>>>>>>> Queria usar cerca 250 threads para isso, então o que
>>     eu fiz foi
>>     >>>>>>>>>>>> quebrar o grupo de 4300 em grupos 18 elementos e abri
>>     uma thread
>>     >>>>>>>>>>>> para
>>     >>>>>>>>>>>> cada.
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>> Não há nenhum problema com o código, o que acontece é
>>     que o
>>     >>>>>>>>>>>> tempo
>>     >>>>>>>>>>>> de
>>     >>>>>>>>>>>> abertura das threads é muito alto. E quanto mais
>>     threads eu
>>     >>>>>>>>>>>> abro,
>>     >>>>>>>>>>>> maior o tempo para abertura das próximas. As
>>     primeiras abrem em
>>     >>>>>>>>>>>> 30ms,
>>     >>>>>>>>>>>> mas perto da thread 70 esse tempo já vai para quase 1
>>     segundo.
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>> Vocês sabem como otimizar esse tempo de abertura? Ou
>>     alguma
>>     >>>>>>>>>>>> outra
>>     >>>>>>>>>>>> solução?
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>> Segue o output do script como exemplo:
>>     >>>>>>>>>>>> Para 4677 cpes, e 250 threads, tenho no final 246
>>     grupos, com 19
>>     >>>>>>>>>>>> elementos
>>     >>>>>>>>>>>> cada
>>     >>>>>>>>>>>> Trying to create thread in Fri Jul  9 17:46:50 2010.61858
>>     >>>>>>>>>>>> Created thread 1 (1) - took 0.030138 seconds to create
>>     >>>>>>>>>>>> Trying to create thread in Fri Jul  9 17:46:50 2010.92080
>>     >>>>>>>>>>>> Created thread 2 (2) - took 0.042668 seconds to create
>>     >>>>>>>>>>>> Trying to create thread in Fri Jul  9 17:46:50
>>     2010.134968
>>     >>>>>>>>>>>> Created thread 3 (3) - took 0.064245 seconds to create
>>     >>>>>>>>>>>> Trying to create thread in Fri Jul  9 17:46:50
>>     2010.199430
>>     >>>>>>>>>>>> Created thread 4 (4) - took 0.082642 seconds to create
>>     >>>>>>>>>>>> Trying to create thread in Fri Jul  9 17:46:50
>>     2010.282278
>>     >>>>>>>>>>>> Created thread 5 (5) - took 0.128257 seconds to create
>>     >>>>>>>>>>>> Trying to create thread in Fri Jul  9 17:46:50
>>     2010.410769
>>     >>>>>>>>>>>> Created thread 6 (6) - took 0.136458 seconds to create
>>     >>>>>>>>>>>> Trying to create thread in Fri Jul  9 17:46:50
>>     2010.547383
>>     >>>>>>>>>>>> Created thread 7 (7) - took 0.208085 seconds to create
>>     >>>>>>>>>>>> Trying to create thread in Fri Jul  9 17:46:50
>>     2010.755594
>>     >>>>>>>>>>>> Created thread 8 (8) - took 0.173014 seconds to create
>>     >>>>>>>>>>>> Trying to create thread in Fri Jul  9 17:46:50
>>     2010.928756
>>     >>>>>>>>>>>> Created thread 9 (9) - took 0.132713 seconds to create
>>     >>>>>>>>>>>> Trying to create thread in Fri Jul  9 17:46:51 2010.61608
>>     >>>>>>>>>>>> Created thread 10 (10) - took 0.127795 seconds to create
>>     >>>>>>>>>>>> Trying to create thread in Fri Jul  9 17:46:51
>>     2010.189536
>>     >>>>>>>>>>>> Created thread 11 (11) - took 0.301836 seconds to create
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>> Obrigado
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>> João André Simioni
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>> #!/usr/bin/perl
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>> use strict;
>>     >>>>>>>>>>>> use DBI;
>>     >>>>>>>>>>>> use Net::Ping;
>>     >>>>>>>>>>>> use Time::HiRes qw/usleep tv_interval gettimeofday/;
>>     >>>>>>>>>>>> use threads ('yield', 'stack_size' =>
>>      32*4096, 'exit'
>>     >>>>>>>>>>>> =>
>>     >>>>>>>>>>>> 'threads_only', 'stringify');
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>> my $host = '192.168.160.179';
>>     >>>>>>>>>>>> my $sid  = 'HOMOLOG';
>>     >>>>>>>>>>>> my $user = 'mac_user';
>>     >>>>>>>>>>>> my $pass = 'mac_user';
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>> my $dbh =
>>     DBI->connect("dbi:Oracle:host=$host;sid=$sid", $user,
>>     >>>>>>>>>>>> $pass,
>>     >>>>>>>>>>>> { AutoCommit =>          1 });
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>> my $sth = $dbh->prepare('SELECT CPE_ID, CLIENTE_ID,
>>     CPE_DESC,
>>     >>>>>>>>>>>> CPE_IP_WAN, CPE_NODE, CPE_IF FROM MAC_CPE WHERE
>>     CPE_PING = ? AND
>>     >>>>>>>>>>>> CPE_ATIVO = ?');
>>     >>>>>>>>>>>> $sth->execute('1', 'A');
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>> my @cpes;
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>> while (my (@row) = $sth->fetchrow_array) {
>>     >>>>>>>>>>>>     push @cpes, [ @row ];
>>     >>>>>>>>>>>> }
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>> $dbh->disconnect();
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>> my $maxThreads = 250;
>>     >>>>>>>>>>>> my $total      = @cpes;
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>> my $cpePerThread = int($total / $maxThreads);
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>> my @toMonitor;
>>     >>>>>>>>>>>> my $i = 0;
>>     >>>>>>>>>>>> my $c = 0;
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>> foreach my $cpe (@cpes) {
>>     >>>>>>>>>>>>     push @{$toMonitor[$i]}, $cpe;
>>     >>>>>>>>>>>>     $c++;
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>>     if ($c>          $cpePerThread) {
>>     >>>>>>>>>>>>         $i++;
>>     >>>>>>>>>>>>         $c = 0;
>>     >>>>>>>>>>>>     }
>>     >>>>>>>>>>>> }
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>> print "Para $total cpes, e $maxThreads threads, tenho
>>     no final
>>     >>>>>>>>>>>> $i
>>     >>>>>>>>>>>> grupos, com ", scalar @{$toMonitor[0]}, " elementos
>>     cada\n";
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>> sub processResult {
>>     >>>>>>>>>>>>     my $r = shift;
>>     >>>>>>>>>>>>     if (ref $r ne 'ARRAY') {
>>     >>>>>>>>>>>>         print STDERR "Erro na thread\n";
>>     >>>>>>>>>>>>         return 0;
>>     >>>>>>>>>>>>     }
>>     >>>>>>>>>>>>     my ($result, $host, $ifs) = @$r;
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>> }
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>> sub testeClient {
>>     >>>>>>>>>>>>     my $threadNum = shift;
>>     >>>>>>>>>>>>     my $cpeGroup  = shift;
>>     >>>>>>>>>>>>     foreach my $cpe (@{$cpeGroup}) {
>>     >>>>>>>>>>>>         my ($cpeId, $clientId, $cpeDesc, $cpeIp,
>>     $cpeNode,
>>     >>>>>>>>>>>> $cpeIf)
>>     >>>>>>>>>>>> =
>>     >>>>>>>>>>>> @$cpe;
>>     >>>>>>>>>>>>         my $pingOk =&checkIp($cpeIp);
>>     >>>>>>>>>>>>         my $status = $pingOk ? 'RESPONDE' : 'MORTO';
>>     >>>>>>>>>>>>         # print join(", ", $threadNum, $cpeId, $clientId,
>>     >>>>>>>>>>>> $cpeDesc,
>>     >>>>>>>>>>>> $cpeIp, $cpeNode, $cpeIf, $status), "\n";
>>     >>>>>>>>>>>>     }
>>     >>>>>>>>>>>>     # print "Finishing thread $threadNum\n";
>>     >>>>>>>>>>>>     return([1, 0]);
>>     >>>>>>>>>>>> }
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>> my $threadCount = 1;
>>     >>>>>>>>>>>> foreach my $cpeGroup (@toMonitor) {
>>     >>>>>>>>>>>>     print "Trying to create thread";
>>     >>>>>>>>>>>>     my $t0 = [gettimeofday];
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>>     print " in ", scalar localtime $t0->[0], ".",
>>     $t0->[1],
>>     >>>>>>>>>>>> "\n";
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>>     my $thr = threads->create({scalar =>          '1'},
>>     >>>>>>>>>>>> 'testeClient',
>>     >>>>>>>>>>>> $threadCount, $cpeGroup);
>>     >>>>>>>>>>>>     my $elapsed = tv_interval ( $t0, [gettimeofday]);
>>     >>>>>>>>>>>>     print "Created thread $thr ($threadCount) - took
>>     $elapsed
>>     >>>>>>>>>>>> seconds
>>     >>>>>>>>>>>> to create\n";
>>     >>>>>>>>>>>>     $threadCount++;
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>>     while (threads->list()>= $maxThreads) {
>>     >>>>>>>>>>>>         my @joinable = threads->list(threads::joinable);
>>     >>>>>>>>>>>>         for (@joinable) {
>>     >>>>>>>>>>>>             my $r = $_->join();
>>     >>>>>>>>>>>> &processResult($r);
>>     >>>>>>>>>>>>         }
>>     >>>>>>>>>>>>         usleep(10000);
>>     >>>>>>>>>>>>     }
>>     >>>>>>>>>>>>     my $elapsed = tv_interval ( $t0, [gettimeofday]);
>>     >>>>>>>>>>>> }
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>> while (threads->list()) {
>>     >>>>>>>>>>>>     my @joinable = threads->list(threads::joinable);
>>     >>>>>>>>>>>>     for (@joinable) {
>>     >>>>>>>>>>>>         my $r = $_->join();
>>     >>>>>>>>>>>> &processResult($r);
>>     >>>>>>>>>>>>     }
>>     >>>>>>>>>>>>     usleep(10000);
>>     >>>>>>>>>>>> }
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>> sub checkIp {
>>     >>>>>>>>>>>>     my $ip = shift;
>>     >>>>>>>>>>>>     my $pingOk = 0;
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>>     eval {
>>     >>>>>>>>>>>>         for (1..3) {
>>     >>>>>>>>>>>>             my $ping = `/bin/ping -c 1 -w 1 $ip`;
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>>             if (grep { / 0% packet loss/ } $ping) {
>>     >>>>>>>>>>>>                 $pingOk = 1;
>>     >>>>>>>>>>>>                 return 1;
>>     >>>>>>>>>>>>             }
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>>             if ($pingOk == 0) {
>>     >>>>>>>>>>>>                 my $p = Net::Ping->new('icmp');
>>     >>>>>>>>>>>>                 $p->service_check(1);
>>     >>>>>>>>>>>>                 if ($p->ping($ip, 1)) {
>>     >>>>>>>>>>>>                     $pingOk = 1;
>>     >>>>>>>>>>>>                     return 1;
>>     >>>>>>>>>>>>                 }
>>     >>>>>>>>>>>>             }
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>>             if ($pingOk == 0) {
>>     >>>>>>>>>>>>                 my $p = Net::Ping->new('udp');
>>     >>>>>>>>>>>>                 $p->service_check(1);
>>     >>>>>>>>>>>>                 if ($p->ping($ip, 1)) {
>>     >>>>>>>>>>>>                     $pingOk = 1;
>>     >>>>>>>>>>>>                     return 1;
>>     >>>>>>>>>>>>                 }
>>     >>>>>>>>>>>>             }
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>>             sleep 3;
>>     >>>>>>>>>>>>         }
>>     >>>>>>>>>>>>     };
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>>     return $pingOk;
>>     >>>>>>>>>>>> }
>>     >>>>>>>>>>>> _______________________________________________
>>     >>>>>>>>>>>> Rio-pm mailing list
>>     >>>>>>>>>>>> Rio-pm em pm.org <mailto:Rio-pm em pm.org>
>>     >>>>>>>>>>>> http://mail.pm.org/mailman/listinfo/rio-pm
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>>>
>>     >>>>>>>>>>> --
>>     >>>>>>>>>>> What is the sound of Perl? Is it not the sound of a
>>     wall that
>>     >>>>>>>>>>> people
>>     >>>>>>>>>>> have
>>     >>>>>>>>>>> stopped banging their heads against?
>>     >>>>>>>>>>> —Larry Wall
>>     >>>>>>>>>>>
>>     >>>>>>>>>>> Thiago Glauco Sanchez
>>     >>>>>>>>>>> Intrutor Perl e Redes
>>     >>>>>>>>>>> www.ticursos.net <http://www.ticursos.net>
>>     >>>>>>>>>>>
>>     >>>>>>>>>>> _______________________________________________
>>     >>>>>>>>>>> Rio-pm mailing list
>>     >>>>>>>>>>> Rio-pm em pm.org <mailto:Rio-pm em pm.org>
>>     >>>>>>>>>>> http://mail.pm.org/mailman/listinfo/rio-pm
>>     >>>>>>>>>>>
>>     >>>>>>>>>>>
>>     >>>>>>>>>>>
>>     >>>>>>>>>>>
>>     >>>>>>>>>> _______________________________________________
>>     >>>>>>>>>> Rio-pm mailing list
>>     >>>>>>>>>> Rio-pm em pm.org <mailto:Rio-pm em pm.org>
>>     >>>>>>>>>> http://mail.pm.org/mailman/listinfo/rio-pm
>>     >>>>>>>>>>
>>     >>>>>>>>>>
>>     >>>>>>>>>>
>>     >>>>>>>>>>
>>     >>>>>>>>> --
>>     >>>>>>>>> What is the sound of Perl? Is it not the sound of a wall
>>     that
>>     >>>>>>>>> people
>>     >>>>>>>>> have
>>     >>>>>>>>> stopped banging their heads against?
>>     >>>>>>>>> —Larry Wall
>>     >>>>>>>>>
>>     >>>>>>>>> Thiago Glauco Sanchez
>>     >>>>>>>>> Intrutor Perl e Redes
>>     >>>>>>>>> www.ticursos.net <http://www.ticursos.net>
>>     >>>>>>>>>
>>     >>>>>>>>> _______________________________________________
>>     >>>>>>>>> Rio-pm mailing list
>>     >>>>>>>>> Rio-pm em pm.org <mailto:Rio-pm em pm.org>
>>     >>>>>>>>> http://mail.pm.org/mailman/listinfo/rio-pm
>>     >>>>>>>>>
>>     >>>>>>>>>
>>     >>>>>>>>>
>>     >>>>>>>> _______________________________________________
>>     >>>>>>>> Rio-pm mailing list
>>     >>>>>>>> Rio-pm em pm.org <mailto:Rio-pm em pm.org>
>>     >>>>>>>> http://mail.pm.org/mailman/listinfo/rio-pm
>>     >>>>>>>>
>>     >>>>>>>>
>>     >>>>>>>>
>>     >>>>>>> _______________________________________________
>>     >>>>>>> Rio-pm mailing list
>>     >>>>>>> Rio-pm em pm.org <mailto:Rio-pm em pm.org>
>>     >>>>>>> http://mail.pm.org/mailman/listinfo/rio-pm
>>     >>>>>>>
>>     >>>>>>>
>>     >>>>>>>
>>     >>>>>> --
>>     >>>>>> What is the sound of Perl? Is it not the sound of a wall
>>     that people
>>     >>>>>> have
>>     >>>>>> stopped banging their heads against?
>>     >>>>>> —Larry Wall
>>     >>>>>>
>>     >>>>>> Thiago Glauco Sanchez
>>     >>>>>> Intrutor Perl e Redes
>>     >>>>>> www.ticursos.net <http://www.ticursos.net>
>>     >>>>>>
>>     >>>>>> _______________________________________________
>>     >>>>>> Rio-pm mailing list
>>     >>>>>> Rio-pm em pm.org <mailto:Rio-pm em pm.org>
>>     >>>>>> http://mail.pm.org/mailman/listinfo/rio-pm
>>     >>>>>>
>>     >>>>>>
>>     >>>>> _______________________________________________
>>     >>>>> Rio-pm mailing list
>>     >>>>> Rio-pm em pm.org <mailto:Rio-pm em pm.org>
>>     >>>>> http://mail.pm.org/mailman/listinfo/rio-pm
>>     >>>>>
>>     >>>>>
>>     >>>>
>>     >>>> --
>>     >>>> What is the sound of Perl? Is it not the sound of a wall that
>>     people
>>     >>>> have
>>     >>>> stopped banging their heads against?
>>     >>>> —Larry Wall
>>     >>>>
>>     >>>> Thiago Glauco Sanchez
>>     >>>> Intrutor Perl e Redes
>>     >>>> www.ticursos.net <http://www.ticursos.net>
>>     >>>>
>>     >>>> _______________________________________________
>>     >>>> Rio-pm mailing list
>>     >>>> Rio-pm em pm.org <mailto:Rio-pm em pm.org>
>>     >>>> http://mail.pm.org/mailman/listinfo/rio-pm
>>     >>>>
>>     >>> _______________________________________________
>>     >>> Rio-pm mailing list
>>     >>> Rio-pm em pm.org <mailto:Rio-pm em pm.org>
>>     >>> http://mail.pm.org/mailman/listinfo/rio-pm
>>     >>>
>>     >>
>>     >>
>>     >
>>     >
>>     > --
>>     > What is the sound of Perl? Is it not the sound of a wall that
>>     people have
>>     > stopped banging their heads against?
>>     > —Larry Wall
>>     >
>>     > Thiago Glauco Sanchez
>>     > Intrutor Perl e Redes
>>     > www.ticursos.net <http://www.ticursos.net>
>>     >
>>     > _______________________________________________
>>     > Rio-pm mailing list
>>     > Rio-pm em pm.org <mailto:Rio-pm em pm.org>
>>     > http://mail.pm.org/mailman/listinfo/rio-pm
>>     >
>>     _______________________________________________
>>     Rio-pm mailing list
>>     Rio-pm em pm.org <mailto:Rio-pm em pm.org>
>>     http://mail.pm.org/mailman/listinfo/rio-pm
>>
>>
>>
>>
>> --
>> Bruno C. Buss
>> http://brunobuss.wordpress.com/
>> http://www.dcc.ufrj.br/~brunobuss/ <http://www.dcc.ufrj.br/%7Ebrunobuss/>
>>
>>
>> _______________________________________________
>> Rio-pm mailing list
>> Rio-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/rio-pm
>
>
> --
> What is the sound of Perl? Is it not the sound of a wall that people have
> stopped banging their heads against?
> —Larry Wall
>
> Thiago Glauco Sanchez
> Intrutor Perl e Redes
> www.ticursos.net
>
>

-- 
Enviado do meu celular


Mais detalhes sobre a lista de discussão Rio-pm