Bottle speicherverwaltung Probleme mit lecks

Django, Flask, Bottle, WSGI, CGI…
Antworten
ZSchneidi
User
Beiträge: 9
Registriert: Montag 25. Juni 2012, 12:21

Hi, ich nutze derzeit Python in verbindung mit Bottle für ein Embedded Projekt.

Beim testen auf dem Target-System stellte sich heraus, dass der Python prozess, der
über FastCGI gestartet wird, relativ schnell viel Speicher belegt.

Grob gesagt startet der Prozess bei ca. 4 MB und bereits bei einem Request, der weitere Requests
mit anstößt belegt der prozess schnell an die 10 MB. Das kann ich noch nachvollziehen.

Wenn ich jetzt den gleichen Request noch mal schicke liege ich bei ca 15 - 16 MB, obwohl sich
der Datenbestand zwischenzeitlich nicht geändert hat. Und mit jedem weiteren Request kommen etwa
5 - 6 MB Speicherbedarf hinzu.

Jetzt bin ich etwas ratlos, wo hier das speicherleck sein kann.
Ich hatte zwischenzeitlich schon versucht das ganze auf ein Minimum zu reduzieren und quasi nur eine
einfache Route zu definieren.

Wie etwas in diesem Beispiel:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-
import bottle
import os
from bottle import route, run, view

@route('/')
@view('index')
def index():
    return dict(hello='Hello World')

APP_ROOT = os.path.abspath(os.path.dirname(__file__))
bottle.TEMPLATE_PATH.append(os.path.join(APP_ROOT, 'templates'))
app = bottle.default_app()

if __name__ == '__main__':
    from flup.server.fcgi import WSGIServer
    WSGIServer(app).run()
Und auch hier kommem mit jedem Aufruf der index route ca 20 KB hinzu.
Habt ihr eine Idee, was das verursachen kann. Liegt die Ursache möglicherweise auch im Flup Server ?

Habt ihr ähnliches schon mal beobachtet ?
Ich lasse den FastCGI Prozess über Lighttpd laufen, ich starte einen Prozess der dann auch längere Zeit laufen muss,
dementsprechend darf sowas nicht auftreten weil schnell schluss ist mit dem verfügbaren speicher.

Danke für jede Hilfe.
deets

Ich wuerde erstmal anfangen alles aus der Gleichung zu nehmen was du nicht brauchst. Was passiert, wenn du bottle direkt ohne FLUP/FCGI/sonstewas benutzt? Zwar bist du dann nur single-threaded, aber dann kannst du mal genau gucken, was bottle selbst mit dem Speicher anstellt. Bitte auch eine ganze Weile lang Requests schicken (per skript/last-test-tool/was-auch-immer), um zu sehen, ob das Verhalten asymptotisch ist.
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Was passiert wenn du bei jedem Aufruf gc.collect() startest?
Bottle: Micro Web Framework + Development Blog
Antworten