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

Blabos de Blebe blabos em gmail.com
Domingo Julho 11 18:31:28 PDT 2010


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> 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>  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
>>>> 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
>>>
>>> _______________________________________________
>>> Rio-pm mailing list
>>> Rio-pm em pm.org
>>> http://mail.pm.org/mailman/listinfo/rio-pm
>>>
>>>
>>
>> _______________________________________________
>> 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
>
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
>


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