[Vienna-pm] perl und speicher freigeben

Peter J. Holzer hjp-vienna-pm-list at hjp.at
Tue May 16 14:00:18 PDT 2006


On 2006-05-16 08:37:26 +0200, peter pilsl wrote:
> Ich hab ein langlaufendes Programm (ein daemon, der wochen laufen soll) 
> und der nur ganz selten was zu tun hat. Dann aber muss es fleissig 
> rechnen und braucht auch viel Speicher.
> Mein Problem ist nun, dass perl diesen Speicher einfach nicht mehr an 
> das Betriebssystem zurückgibt - auch nicht nach Stunden

So intelligent ist die Perl Garbage Collection nicht - entweder gleich
oder gar nicht.

> und auch nicht, wenn das Betriebssystem vor lauter swappen sonst nix
> mehr tun kann.

Es gibt bei keinem Unix ein Signal "Speicher ist knapp, bitte alles
freigeben, was nicht unbedingt benötigt wird". Die Idee dazu hatte ich
schon vor vielen Jahren, aber ich fürchte, wenn ich es nicht
implementiere, implemnentiert es keiner :-(.


> Ich hab das an einem kleinen Beispielprogramm illustriert:
> 
> -------------------memd_test.pl--------
> use strict;
> use warnings;
> $|=1;
> 
> sub Run  {
>    my @x;
>    foreach (0..200000) {
> push(@x,[33,44,55,66,77,88,99,22,11,33,44,55,66,77,88,99,22,11,33,44,55,66,77,88,99,22,11]);
>    }
> }
> 	
> my $c;
> while (<STDIN>) {
>    print $c++;
>    Run();
> }
> ------------------------
> 
> 
> Nach jeder Tasteneingabe wird Run() gestartet, 

Was tut Run()? Wirklich das, was Du oben angibst?


> dass ein grosses array 
> erzeugt und dann aber eigentlich gleich wieder freigeben soll. Tut es 
> aber nicht.  Wenn man mehrere dieser Prozesse startet  und jeweils 10 
> mal enter drückt, dann sieht das im speicher so aus:
> 
> #top
>   2461 root       9   0  122m 122m 1228 T  0.0  6.0   0:02.78    0 121m 
> memd_test2.pl
>   2492 root       9   0  122m 122m 1228 T  0.0  6.0   0:02.77    0 121m 
> memd_test2.pl
>   2564 root       9   0  122m 122m 1228 T  0.0  6.0   0:00.98    0 121m 
> memd_test2.pl
>   2570 root       9   0  122m 122m 1228 T  0.0  6.0   0:01.87    0 121m 
> memd_test2.pl

Die Prozesse sind alle im Zustand "Stopped" (T). In den Zustand kommt
ein Prozess eigentlich nur, wenn er im Debugger läuft ("T" steht
eigentlich für "trace") oder wenn man ihm ein Stop-Signal geschickt hat.
Und wo kommen die mehreren Prozesse her?
Was machst Du?

> jeder prozess braucht 122mb und gibt sie nie wieder her,obwohl er sie 
> während dem warten gar nicht braucht.  das ist böse !! ;)

C selbst-compiliert oder binary? Die Perl-eigene Malloc-Library gibt
Memory nie frei. Per default wird allerdings auf den meisten Unixen das
standard-malloc verwendet. GNU malloc (Standard unter Linux)
unterscheidet zwischen "kleinen" (< 128 kB) und großen
Speicherbereichen. Große werden sofort an das OS zurückgegeben. Kleine
nur dann, wenn es einen zusammenhängenden freien Bereich am Ende des
Heaps gibt, der "groß genug ist, dass es sich auszahlt". Das ist bei
perl (viele kleine Speicherbereiche in vollkommen chaotischer
Reihenfolge) u.U. nie der Fall.

> Das Programm muss als daemon laufen, weil es erstens eine sehr lange 
> startzeit hat (einlesen und initialisieren von daten) und zweitens 
> fallweise auch mal viele Anfragen parallel reinkommen.

"forking daemon", wie Nino schon vorgeschlagen hat.

	hp

-- 
   _  | Peter J. Holzer    | Ich sehe nun ein, dass Computer wenig
|_|_) | Sysadmin WSR       | geeignet sind, um sich was zu merken.
| |   | hjp at hjp.at         |
__/   | http://www.hjp.at/ |	-- Holger Lembke in dan-am
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://mail.pm.org/pipermail/vienna-pm/attachments/20060516/c4720a57/attachment.bin 


More information about the Vienna-pm mailing list