Threadostrophal

Servus,

u. a. Script erzeugt unter Windows reproduzier- aber nicht nachvollziehbare, unsinnige Ergebnisse nach

  • Hauptspeicherverbratung ca 1,5 MB je Thread (gesamt 360 MB)
  • 60 Sekunden
  • Prozessorauslastung 50% (auf Mehrprozessorsystem)

Nach einem Upgrade von ActivePerl von 5.8.2 auf 5.8.8 braucht’s nur noch ca. 23 Sekunden, andere, gleichermaßen unsinnige Ergebnisse unter ansonsten gleichen Werten zu erzeugen.

Unter Linux sind die Ergebnisse brauchbar und zeitnah,

  • ca. 3, 4 Sekunden
    allerdings
  • Hauptspeicherverbratung ca 1,5 MB je Thread
  • Prozessorauslastung 50% (auf Mehrprozessorsystem)

Das gleiche Script, nach meinem Können 1:1 in Python übersetzt kommt - unter Linux, unter Win keine Testumgebung - auf unter der Lupe nicht feststellbare RAM-Auslastung, mikroskopisch immerhin nachweisliche Prozessorauslastung.

Ist das ein Problem von Perl, oder lediglich Ausdruck meiner Fähigkeiten in dieser Programmiersprache?

Gruss
Schorsch

#!/usr/bin/perl 

use threads;
use Net::stuck\_out\_tongue:ing;

@pingThreads;

for ( $i = 0; $i new( \&pingThr, $addr );
 push( @pingThreads, $thr );
} 
foreach( @pingThreads ) {
 print $\_-\>join;
}

sub pingThr
{
 my ($addr ) = @\_;
 my $ping = Net::stuck\_out\_tongue:ing-\>new('icmp');
 return $ping-\>ping( $addr, 1 );
}

Hallo,

u. a. Script erzeugt unter Windows

Hab ich nicht, kenn ich mich nicht mit aus…

Unter Linux sind die Ergebnisse brauchbar und zeitnah,

  • ca. 3, 4 Sekunden

Same here.

allerdings

  • Hauptspeicherverbratung ca 1,5 MB je Thread

Kann ich bestätigen

  • Prozessorauslastung 50% (auf Mehrprozessorsystem)

Maximal 18% hier, auf einem dual core.

Das gleiche Script, nach meinem Können 1:1 in Python übersetzt
kommt - unter Linux, unter Win keine Testumgebung - auf unter
der Lupe nicht feststellbare RAM-Auslastung, mikroskopisch
immerhin nachweisliche Prozessorauslastung.

Ist das ein Problem von Perl, oder lediglich Ausdruck meiner
Fähigkeiten in dieser Programmiersprache?

Die Speicherbelastung ist v.a. eine Perl-Geschichte.

Tendenziell empfiehlt es sich immer , use strict; zu verwenden. Unter anderem deswegen, weil nicht mit „my“ deklarierte Variablen global sind, und beim erstellen eines neuen Threads werden sie mitkopiert. Sehr viel bringt das aber auch nicht.

Abhilfe wird Perl 6 schaffen, das mit „use strict;“ per default kommt, und alle möglichen impliziten „globalen“ Variablen ($., %ARGV, whatever…) ordentliches Scoping gibt und damit echte „leichte“ Threads erlaubt.

Ein Weg darum herum könnte POE::Component::Client::stuck_out_tongue:ing vom CPAN sein, das keine Threads started, sondern über non-blocking IO arbeitet. Glaube ich :wink:

> #!/usr/bin/perl  
>   
> use threads;  
> use Net::stuck\_out\_tongue:ing;

Net::stuck_out_tongue:ing bitte :wink:

> @pingThreads;

mit „use warnings“ würdest hier ein „Useless use of a variable in void context“ sehen - wenn du die Variable deklarieren willst, tu es mit „my“.

Grüße,
Moritz

Hallo Schorsch

Ist das ein Problem von Perl, oder lediglich Ausdruck meiner
Fähigkeiten in dieser Programmiersprache?

ich mach das so:

#!/usr/bin/perl
use strict;
use warnings;

 # use:
 # $\> pingscan.pl 192.168.0.1
 #
 # or from cgi (w/PATH\_INFO active):
 # http://myserver.de/cgi-bin/pingscan.pl/192.168.0.1/html

 my $nm = $^O=~/win32/i ? 'C:/Programme\Nmap\nmap.exe -sP'
 : '/usr/bin/nmap -PS22,23,25,80,113,139,1050 -sP';

 my @ranges = split '/', ($ENV{PATH\_INFO} || '');
 @ranges = ('', $ARGV[0], 'txt') unless @ranges;
 print "Content-type: text/plain\n\n" if $ranges[2] eq 'html';

 my @hosts = hosts\_from\_pingscan( $nm, $ranges[1] );
 print join "\n", @hosts;

 sub hosts\_from\_pingscan
{
 my ($pg, $dst) = @\_;
 open(my $ph, "$pg --max-retries=2 $dst/24 |") or die "Can't pipe nmap $!";
 my @lines = ; close $ph;
 return map /Host\s+([-\w\.]+).+?up\./g, @lines;
}

Und zwar unter Win32 oder Linux, auf der Kommandozeile oder
in einer CGI-Umgebung.

Ach ja => http://download.insecure.org/nmap/dist/nmap-4.20-set…

Grüße

CMБ

Hallo Semjon

ich mach das so:

[…]

my $nm = $^O=~/win32/i ? ‚C:/Programme\Nmap\nmap.exe -sP‘

leider hatte ich unterlassen, das konkrete Einsatzszenario zu beschreiben, in dem ich den Ping einsetze. Ich möchte mir in einem verzweigten Netz einen Überblick über den Zustand bestimmter Organisationseinheiten verschaffen. Z. B. möchte ich von sämtlichen kritischen Routern und Switches wissen, welche Online sind bzw. wo möglicherweise ein Gerätz ausgefallen ist. Diese Geräte befinden sich aber in den versch. Subnetzen, so dass nicht ein, sondern eine Reihe von nmaps notwendig wäre.

Die Geräteadressen selbst hole ich aus einer Datenbank, so dass ich jedes Gerät gezielt ansprechen kann. Inwischen habe ich die Aufgabe mit Python gelöst, wobei unter Windows zwar überaus häßlich je ping eine eigene cmd.exe-Instanz gestartet wird, diese aber erstaunlich schnell terminieren. Tatsächlich hält da selbst nmap beim Rundum-Ping auf ein beliebiges /24-Teilnetz mit 15 zu 10 Sekunden nicht mehr mit.

Gruss
Schorsch