[python-nl] Python memory leak?

Gijs Molenaar gijs at looze.net
Wed Feb 22 10:44:55 CET 2006


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 op looze.net
http://gijs.looze.net





-------------- next part --------------
A non-text attachment was scrubbed...
Name: flowmon.py
Type: text/x-python
Size: 24415 bytes
Desc: niet beschikbaar
Url : http://mail.python.org/pipermail/python-nl/attachments/20060222/dfe3a5cf/attachment-0001.py 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: mem.jpg
Type: image/jpeg
Size: 19542 bytes
Desc: niet beschikbaar
Url : http://mail.python.org/pipermail/python-nl/attachments/20060222/dfe3a5cf/attachment-0002.jpg 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: traffic.jpg
Type: image/jpeg
Size: 27225 bytes
Desc: niet beschikbaar
Url : http://mail.python.org/pipermail/python-nl/attachments/20060222/dfe3a5cf/attachment-0003.jpg 


More information about the Python-nl mailing list