[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