Schrift
[thread]6442[/thread]

perl-Script frisst ganzen Speicher?!: Script belegt zuviel Speicher



<< >> 9 Einträge, 1 Seite
Walrus
 2004-07-31 13:44
#85095 #85095
User since
2004-07-31
2 Artikel
BenutzerIn
[default_avatar]
Hallo,

nachdem ich nun wild mit Google und auch hier im Forum nach einer Loesung gesucht, aber nichts passendes gefunden habe, hier nun mein Problem.

Ein perl Script auf einem Server belegt den kompletten Arbeitsspeicher. Sprich, es wird als CGI aufgerufen und nimmt dann rasant den Speicher in beschlag. Beim Start sind es noch ~ 3-4MB dann gehts flott aufwaerts und nach 10s hat es schon 75% des RAMs ~ 1.5GB in Beschlag. Das Ganze geht soweit, dass der Server zu swappen anfaengt und nach ca. 2 Minute quasi nicht mehr erreichbar ist, da ihm das Script das komplette Memory zumuellt.

http://dump.iam3.de/hog.jpg

Ich selbst hab nun von perl gelinde gesagt wenig Ahnung. Das Script lief bisher auf nem anderen Server  (SuSe 7.3 - Perl 5.6.1) einwandfrei. Auf dem neuen Server (SuSE 9.0 - Perl 5.8.1) habe ich oben genanntes Problem. Seltsam ist auch, dass dieses Phaenomen nicht immer sondern nur manchmal auftritt. Der Programmierer des Scripts schiebts auf die Perl-Installation.

- gibt es eine Moeglichkeit zu loggen, welche Funktionsaufrufe derartig viel RAM reservieren?
- kann ich CPU und RAM irgendwie limitieren?
- ist das vielleicht sogar ein bekanntes Problem?

Bin fuer jede Hilfe dankbar!

Gruss
Ronnie
 2004-07-31 14:27
#85096 #85096
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Da hat jemand [s]sehr wahrscheinlich[/s] möglicherweise Mist gebaut. Poste das Skript mal hier, dann können wir schauen ob wir den Memory-Leak finden.

EDIT1: Mal meine Aussage relativiert, womöglich ist es ja doch Installations-/Versions- abhängig.\n\n

<!--EDIT|Ronnie|1091270602-->
Ishka
 2004-07-31 15:43
#85097 #85097
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
du könntest natürlich bei jedem Funktionsaufruf mit system("ps parameter $$ >> log_$funktionsname.dat"); mitloggen (wobei du $funktionsname setzten und parameter unter 'man ps' nachschauen müßtest), wieviel du aktuell an Speicher und Rechenzeit verbrauchst, allerdings wird dadurch das Programm nicht gerade schneller.

Ich weiß, daß es möglich ist Speicher und Rechenzeit zu beschränken, weiß aber nicht wie genau. Wobei für die Rechenzeit dürfte ein system("renice 20 $$") nach einigen Sekunden schon helfen.

Andererseits kannst du natürlich davon ausgehen, daß nach 10 Sekunden die Verbindung längst wegen Zeitüberschreitung abgebrochen ist und dich beenden - allerdings nur dann, wenn das Programm nicht noch irgendwelche daten auf den Server schreiben soll.
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
Strat
 2004-07-31 18:58
#85098 #85098
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
so faelle habe ich gelegentlich, wenn ich sehr viele Warnungen bekomme (z.B. weil ich mich wo vertipppt habe; vorausgesetzt, du arbeitest mit use warnings; bzw. -w)
Um an die Warnungen zu kommen, verwende ich fuer die Entwicklung gerne sowas wie
Code: (dl )
open (STDERR, "> error.log");

am anfang des scriptes; dann werden die Warnungen direkt in diese Datei geschrieben (achtung, script muss schreibrechte in dem verzeichnis haben, in dem die error.log erstellt wird), und brauchen nicht mehr so viel arbeitsspeicher...

Beginnt dein script zufaellig mit
Code: (dl )
1
2
3
4
5
#! /usr/bin/perl
use warnings;
use strict;
use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
use CGI;

?\n\n

<!--EDIT|Strat|1091286029-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
[E|B]
 2004-07-31 19:49
#85099 #85099
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Vielleicht lässt sich der Memory mit Tie::Cache* beschränken?
Habe von den besagten Modulen noch nichts ausprobiert, vielleicht ist hier aber jemand, der schon mal mit ihnen gearbeitet hat?\n\n

<!--EDIT|[E|B]|1091288985-->
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
Walrus
 2004-07-31 21:38
#85100 #85100
User since
2004-07-31
2 Artikel
BenutzerIn
[default_avatar]
Zuerst mal vielen Dank fuer die vielen Antworten und Loesungsansaetze. Ich muss mir vom Programmierer des Scripts die Erlaubnis holen, das Script hier zu posten. Dann liese sich sicher rausfinden was daran schief laeuft.

Header des Scriptes sieht so aus:
Quote
#!/usr/bin/perl
use lib "/home/www/edafe33/html/www.xxxxx.xxx/cgi-bin/lib";
use MIME::Lite; $mailer = '/usr/lib/sendmail -t';

also ohne -w

Gibt es seitens Perl keine Moeglichkeit den max. Speicher und max. Ausfuehrungszeit fuer Scripte systemweit festzulegen? Bei PHP geht sowas durch

max_execution_time = 30
memory_limit = 16M

in der php.ini. Etwas in der Art waere das Beste.
jan
 2004-07-31 21:55
#85101 #85101
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
Crian
 2004-08-02 12:30
#85102 #85102
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
ohne use strict und use warnings? urgs??
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
ptk
 2004-08-02 14:29
#85103 #85103
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Mit Apache 1.3 kann man auch Apache::Resource verwenden (getestet!). Beispieleintrag in der httpd.conf:
Code: (dl )
1
2
PerlModule Apache::Resource
PerlSetEnv PERL_RLIMIT_AS 128
<< >> 9 Einträge, 1 Seite



View all threads created 2004-07-31 13:44.