[python-nl] Python memory leak?

Arjan Molenaar arjanmolenaar at hetnet.nl
Wed Feb 22 14:31:31 CET 2006


Beste Gijs,

Zijn er geen bibliotheken die je importeerd?

Wat doet memsize precies? Als je aan het OS je geheugen opvraagt zal dit
ongetwijfeld toenemen. Het OS neemt in principe geen geheugen terug. Het
geheugen zal wel hergebruikt worden door je applicatie, waardoor het op een
gegeven moment constant zal blijven.

De "del" statements halen volgens mij niets uit, als de variabelen die je
verwijderd zijn aangemaakt binnen de context van je functie. De 
objecten worden
automatisch verwijderd als de "reference count" op 0 komt (bij het 
verlaten van
de functie dus). De garbage collector welke onderdeel is van Python dient
alleen om cyclische referenties op te ruimen.

Zitten er cyclische referenties in je applicatie?


gr.

Arjan Molenaar

Quoting Gijs Molenaar <gijs at looze.net>:

>
> Gegroet Pythoniërs,
>
> Ik ben momenteel voor SURFnet een python applicatie aan het 
> ontwikkelen die hun verkeer met de wereld in kaart brengt. Mijn 
> applicatie groeit alleen in stapjes in het geheugen gebruik. Dit is 
> niet handig, want hij draait als een daemon en ik moet hem nu 
> regelmatig herstarten.
>
> maar eerst zal ik jullie wat meer over de situatie uitleggen.
>
> In mijn geval gaat het om de routers aan de rand van het netwerk van 
> SURFnet. Deze exporteren netflow gegevens. Dit zijn in principe niets 
> meer dan meetgegevens van het verkeer dat door de router heen gaat. 
> Deze gegevens worden opgeslagen op een machine, en wachten hier op 
> verwerking. De meetgegevens worden opgeslagen door een collector 
> (flowd in dit geval) en om de 5 minuten weggeschreven naar een 
> flowlog file.
>
> hier komt FLOWmon, mijn applicatie, in het plaatje. Deze opent stuk 
> voor stuk de flowlogs, en analyseert de meetgegevens. FLowmon telt al 
> het in en uit gaande verkeer per aangesloten surfnet klant, per TCP 
> poort, per UDP poort, per IP protocol en per AS nummer bij elkaar op. 
> Deze cumulatieve gegevens worden vervolgens in RRD bestanden 
> opgeslagen (en een beetje SQL).
>
> Het gaat hier om veel gegevens. Een logfile van 5 minuten is al snel 
> 60 MB, en in deze 5 minuten moet de applicatie rond de 500.000 flows 
> analyseren (het verkeer is gesampled met een rate van 100). 
> Vervolgens worden er rond de 5.000 RRD files weggeschreven.
>
> nu gaat er ergens iets mis. het geheugen verbruik van de applicatie 
> wordt groter, maar dit alleen op het moment dat er meer flows 
> verschijnen (tussen 7 en 12 wordt het drukker). Op het moment dat de 
> applicatie het minder druk krijgt, valt deze expansie in geheugen 
> niet terug. Dit levert een leuk plaatje (zie mem.jpg en traffic.jpg).
>
> In het plaatje mem.jpg staan max in min. Max is het geheugen verbruik 
> nadat de logfile is geanalyseert. Min is het verbruik aan het begin 
> van een nieuwe run (en nadat de objecten handmatig zijn verwijderd)
>
> In het begin dacht ik dat een van de C modules een foutje had en elke 
> keer dat deze aangeroepen wordt een klein stukje geheugen lekt. Dit 
> gebeurt echter niet. In principe krijgen de c modules niet meer 
> gegevens per loop te verwerken, er staan alleen andere (grotere) 
> getallen in de meetgegevens.
>
> ik heb ook de C modules in aparte code een tijdje in een oneindige 
> loop gegevens laten wegschrijven en uitlezen, maar hier blijft het 
> geheugen verbruik constant. ik ben nog een ramp in C, hopelijk 
> veranderd dat binnen een korte tijd. :)
>
> de modules die ik gebruik zijn flowd python module (laatste snapshot 
> release):
> http://www.mindrot.org/flowd.html
>
> en py-rrdtool (debian package)
> http://www.nongnu.org/py-rrdtool/
>
>
> Bijgevoegd een deel van de source. Hij doet hij het zo niet, maar 
> zonder flows heb je er toch niets aan. Het handmatig verwijderen van 
> de objecten helpt ook niet.
>
> ik kwam nog op een interessant stukje:
> http://evanjones.ca/python-memory.html
>
> Dit gaat over dat Python geen geheugen terug geeft aan het systeem 
> nadat het gebruikt is. Dit is, uit mijn ervaring, niet zo als je 
> handmatig de objecten verwijderd (of ik heb het niet goed begrepen). 
> maar dit artikeltje verklaart niet waarom het geheugen zou blijven 
> groeien (het geheugen dat niet gebruikt wordt maar wel is 
> gereserveerd door python zou opnieuw worden gebruikt).
>
>
> Wie o wie, heeft er een idee?
>
>
>
> Met vriendelijke groet,
>
> Gijs Molenaar
> gijs at looze.net
> http://gijs.looze.net
>
>
>
>
>
>




More information about the Python-nl mailing list