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

Thiago Glauco Sanchez thiagoglauco em ticursos.net
Terça Julho 13 03:46:21 PDT 2010


Não acho que tenha preguiça, pelo contrário... apenas estude um pouco 
mais as soluções e o POE, por que
você melhor do que ninguém conhece os detalhes da sua estrutura...

Tem sistemas que limitam o número de processos paralelos, por questão de 
segurança. E não de bug.
Verifique se o seu OS tem essa limitação. Por isso sugeri dividir a 
carga rodando duas instâncias do código.
Imagine se o OS deixar qualquer programa rodar infinitos processos 
paralelos até consumir toda a máquina... é um ótimo ataque.



Em 12/07/2010 22:43, João André Simioni escreveu:
> 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
>>
>>
>>      
>    


-- 
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



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