Thread gnu-grep braucht ewig unter Perl (system)
(7 answers)
Opened by equinox at 2010-11-01 12:37
Guten morgen,
also ich hab mal Deinen letzten Vorschlag ausprobiert. Leider ist die Performance da noch schlechter (Analysezeit über 2 Minuten) als mit einem einzelnen grep via systemcall (ca. 1,5 Minuten). Mir ging es ja auch vorrangig darum herauszufinden, warum der grep-Systemcall so lange braucht während der in einer Shellumgebung zur Ausführung gerademal 3 Sekunden benötigt. Vielleicht hab ich das in meinem Eröffnungsthread aber auch nicht genau genug angedeutet? Ich hab dann noch folgendes ausprobiert (mit überflüssigem ersten if-Block): Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 sub init { my ($self) = shift; $self->setWanted($self->{args}->{docroot}."/logs/access.log*"); } sub run { my ($self) = shift; my $args = $self->{args}; # default method strings my $post_method = "POST"; my $get_method = "GET .*=(htt|ft|ph)p(:|%3[aA])(/|%2[fF])"; my $method_string = '\"('.$post_method.' |'.$get_method.')'; # redefine method string if it is given from the client if ( (defined $args->{method}) && ($#{$args->{method}} + 1 == 1) ) { if (grep lc($_) eq "post", @{$args->{method}}) { $method_string = '\"'.$post_method; } elsif (grep lc($_) eq "get", @{$args->{method}}) { $method_string = '\"('.$get_method.')'; } } # we fork several processes here to have the results faster. somehow grep takes a looooooooooooooong time to have a look over the logfiles. FIXME? foreach (keys %{$self->{files}}) { my $pid = fork(); # parent if ($pid) { $result->{$pid} = (); # child } elsif ($pid == 0) { my $cmd = '/bin/zgrep -E " '.$method_string.'.* HTTP/[0-9]\.[0-9]\" [23][0-9]{2}" '.$_." 2>/dev/null"; print `$cmd`; exit(0); } else { main::error("Could not fork: $!"); exit(1); } } foreach (keys %$result) { waitpid($_, 0); } return; } Damit dauert das ganze jetzt nur noch 28 Sekunden, ist aber im Vergleich zur Shell immernoch 9-10mal langsamer. Irgendwo werden intern (perl) scheinbar irgendwelche limits gesetzt, wenn ein Systemcall gemacht wird. Allerdings sind die ulimits in der Shell die gleichen wie unter Perl. Somit hab ich jetzt immernoch das gleiche Problem wie vorher und komm einfach nicht weiter :( Grüße PS: Der erste if-Block ist natürlich völliger Käse, das ist mir jetzt dann auch mal so richtig aufgefallen ;) Last edited: 2010-11-03 09:23:35 +0100 (CET) |