João, estou com pressa agora e não posso detalhar muito o email, mas tente trocar sua solução de threads pelo POE<div><br><div><a href="http://search.cpan.org/~rcaputo/POE-1.289/lib/POE.pm">http://search.cpan.org/~rcaputo/POE-1.289/lib/POE.pm</a></div>
<div><br></div><div>Vai parecer um pouco complicado no inicio, mas depois que pega o jeito você vai gostar :)</div><div>Tem muitos exemplos aqui <a href="http://poe.perl.org/?POE_Cookbook">http://poe.perl.org/?POE_Cookbook</a> a maioria das coisas que fiz com ele eu usei como base algum script desse Cookbook.</div>
<div><br></div><div>Enjoy!</div><div><br><br><div class="gmail_quote">2010/7/9 João André Simioni <span dir="ltr">&lt;<a href="mailto:jasimioni@gmail.com">jasimioni@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Caros,<br>
<br>
tenho um script para testar cerca de 4700 equipamentos, usando ping.<br>
Queria usar cerca 250 threads para isso, então o que eu fiz foi<br>
quebrar o grupo de 4300 em grupos 18 elementos e abri uma thread para<br>
cada.<br>
<br>
Não há nenhum problema com o código, o que acontece é que o tempo de<br>
abertura das threads é muito alto. E quanto mais threads eu abro,<br>
maior o tempo para abertura das próximas. As primeiras abrem em 30ms,<br>
mas perto da thread 70 esse tempo já vai para quase 1 segundo.<br>
<br>
Vocês sabem como otimizar esse tempo de abertura? Ou alguma outra solução?<br>
<br>
Segue o output do script como exemplo:<br>
Para 4677 cpes, e 250 threads, tenho no final 246 grupos, com 19 elementos cada<br>
Trying to create thread in Fri Jul  9 17:46:50 2010.61858<br>
Created thread 1 (1) - took 0.030138 seconds to create<br>
Trying to create thread in Fri Jul  9 17:46:50 2010.92080<br>
Created thread 2 (2) - took 0.042668 seconds to create<br>
Trying to create thread in Fri Jul  9 17:46:50 2010.134968<br>
Created thread 3 (3) - took 0.064245 seconds to create<br>
Trying to create thread in Fri Jul  9 17:46:50 2010.199430<br>
Created thread 4 (4) - took 0.082642 seconds to create<br>
Trying to create thread in Fri Jul  9 17:46:50 2010.282278<br>
Created thread 5 (5) - took 0.128257 seconds to create<br>
Trying to create thread in Fri Jul  9 17:46:50 2010.410769<br>
Created thread 6 (6) - took 0.136458 seconds to create<br>
Trying to create thread in Fri Jul  9 17:46:50 2010.547383<br>
Created thread 7 (7) - took 0.208085 seconds to create<br>
Trying to create thread in Fri Jul  9 17:46:50 2010.755594<br>
Created thread 8 (8) - took 0.173014 seconds to create<br>
Trying to create thread in Fri Jul  9 17:46:50 2010.928756<br>
Created thread 9 (9) - took 0.132713 seconds to create<br>
Trying to create thread in Fri Jul  9 17:46:51 2010.61608<br>
Created thread 10 (10) - took 0.127795 seconds to create<br>
Trying to create thread in Fri Jul  9 17:46:51 2010.189536<br>
Created thread 11 (11) - took 0.301836 seconds to create<br>
<br>
Obrigado<br>
<br>
João André Simioni<br>
<br>
<br>
<br>
#!/usr/bin/perl<br>
<br>
use strict;<br>
use DBI;<br>
use Net::Ping;<br>
use Time::HiRes qw/usleep tv_interval gettimeofday/;<br>
use threads (&#39;yield&#39;, &#39;stack_size&#39; =&gt; 32*4096, &#39;exit&#39; =&gt;<br>
&#39;threads_only&#39;, &#39;stringify&#39;);<br>
<br>
my $host = &#39;192.168.160.179&#39;;<br>
my $sid  = &#39;HOMOLOG&#39;;<br>
my $user = &#39;mac_user&#39;;<br>
my $pass = &#39;mac_user&#39;;<br>
<br>
my $dbh = DBI-&gt;connect(&quot;dbi:Oracle:host=$host;sid=$sid&quot;, $user, $pass,<br>
{ AutoCommit =&gt; 1 });<br>
<br>
my $sth = $dbh-&gt;prepare(&#39;SELECT CPE_ID, CLIENTE_ID, CPE_DESC,<br>
CPE_IP_WAN, CPE_NODE, CPE_IF FROM MAC_CPE WHERE CPE_PING = ? AND<br>
CPE_ATIVO = ?&#39;);<br>
$sth-&gt;execute(&#39;1&#39;, &#39;A&#39;);<br>
<br>
my @cpes;<br>
<br>
while (my (@row) = $sth-&gt;fetchrow_array) {<br>
    push @cpes, [ @row ];<br>
}<br>
<br>
$dbh-&gt;disconnect();<br>
<br>
my $maxThreads = 250;<br>
my $total      = @cpes;<br>
<br>
my $cpePerThread = int($total / $maxThreads);<br>
<br>
my @toMonitor;<br>
my $i = 0;<br>
my $c = 0;<br>
<br>
foreach my $cpe (@cpes) {<br>
    push @{$toMonitor[$i]}, $cpe;<br>
    $c++;<br>
<br>
    if ($c &gt; $cpePerThread) {<br>
        $i++;<br>
        $c = 0;<br>
    }<br>
}<br>
<br>
print &quot;Para $total cpes, e $maxThreads threads, tenho no final $i<br>
grupos, com &quot;, scalar @{$toMonitor[0]}, &quot; elementos cada\n&quot;;<br>
<br>
sub processResult {<br>
    my $r = shift;<br>
    if (ref $r ne &#39;ARRAY&#39;) {<br>
        print STDERR &quot;Erro na thread\n&quot;;<br>
        return 0;<br>
    }<br>
    my ($result, $host, $ifs) = @$r;<br>
<br>
}<br>
<br>
sub testeClient {<br>
    my $threadNum = shift;<br>
    my $cpeGroup  = shift;<br>
    foreach my $cpe (@{$cpeGroup}) {<br>
        my ($cpeId, $clientId, $cpeDesc, $cpeIp, $cpeNode, $cpeIf) = @$cpe;<br>
        my $pingOk = &amp;checkIp($cpeIp);<br>
        my $status = $pingOk ? &#39;RESPONDE&#39; : &#39;MORTO&#39;;<br>
        # print join(&quot;, &quot;, $threadNum, $cpeId, $clientId, $cpeDesc,<br>
$cpeIp, $cpeNode, $cpeIf, $status), &quot;\n&quot;;<br>
    }<br>
    # print &quot;Finishing thread $threadNum\n&quot;;<br>
    return([1, 0]);<br>
}<br>
<br>
my $threadCount = 1;<br>
foreach my $cpeGroup (@toMonitor) {<br>
    print &quot;Trying to create thread&quot;;<br>
    my $t0 = [gettimeofday];<br>
<br>
    print &quot; in &quot;, scalar localtime $t0-&gt;[0], &quot;.&quot;, $t0-&gt;[1], &quot;\n&quot;;<br>
<br>
    my $thr = threads-&gt;create({scalar =&gt; &#39;1&#39;}, &#39;testeClient&#39;,<br>
$threadCount, $cpeGroup);<br>
    my $elapsed = tv_interval ( $t0, [gettimeofday]);<br>
    print &quot;Created thread $thr ($threadCount) - took $elapsed seconds<br>
to create\n&quot;;<br>
    $threadCount++;<br>
<br>
    while (threads-&gt;list() &gt;= $maxThreads) {<br>
        my @joinable = threads-&gt;list(threads::joinable);<br>
        for (@joinable) {<br>
            my $r = $_-&gt;join();<br>
            &amp;processResult($r);<br>
        }<br>
        usleep(10000);<br>
    }<br>
    my $elapsed = tv_interval ( $t0, [gettimeofday]);<br>
}<br>
<br>
while (threads-&gt;list()) {<br>
    my @joinable = threads-&gt;list(threads::joinable);<br>
    for (@joinable) {<br>
        my $r = $_-&gt;join();<br>
        &amp;processResult($r);<br>
    }<br>
    usleep(10000);<br>
}<br>
<br>
sub checkIp {<br>
    my $ip = shift;<br>
    my $pingOk = 0;<br>
<br>
    eval {<br>
        for (1..3) {<br>
            my $ping = `/bin/ping -c 1 -w 1 $ip`;<br>
<br>
            if (grep { / 0% packet loss/ } $ping) {<br>
                $pingOk = 1;<br>
                return 1;<br>
            }<br>
<br>
            if ($pingOk == 0) {<br>
                my $p = Net::Ping-&gt;new(&#39;icmp&#39;);<br>
                $p-&gt;service_check(1);<br>
                if ($p-&gt;ping($ip, 1)) {<br>
                    $pingOk = 1;<br>
                    return 1;<br>
                }<br>
            }<br>
<br>
            if ($pingOk == 0) {<br>
                my $p = Net::Ping-&gt;new(&#39;udp&#39;);<br>
                $p-&gt;service_check(1);<br>
                if ($p-&gt;ping($ip, 1)) {<br>
                    $pingOk = 1;<br>
                    return 1;<br>
                }<br>
            }<br>
<br>
            sleep 3;<br>
        }<br>
    };<br>
<br>
    return $pingOk;<br>
}<br>
_______________________________________________<br>
Rio-pm mailing list<br>
<a href="mailto:Rio-pm@pm.org">Rio-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/rio-pm" target="_blank">http://mail.pm.org/mailman/listinfo/rio-pm</a><br>
</blockquote></div><br><br clear="all"><br>-- <br>lorn at lornlab dot org<br>Lindolfo &quot;Lorn&quot; Rodrigues<br><br>
</div></div>