Dogslow is Django waghond middleware klas wat logs tracebacks stadige versoeke.
Installasie:
Installeer dogslow:
PIP installeer dogslow
Voeg dan as aan jou lys van middleware klasse in jou Django settings.py lêer:
MIDDLEWARE_CLASSES = (
& Nbsp; 'dogslow.WatchdogMiddleware',
& Nbsp; ...
)
Vir die beste resultate, maak dit een van die eerste middlewares wat bedryf word.
Konfigurasie:
Jy kan die volgende konfigurasie eienskappe in jou settings.py lêer te stem die waghond gebruik:
# Waghond is geaktiveer deur verstek, tydelik afskakel, stel vals:
DOGSLOW = True
# Plek waar Waghond slaan sy log lêers:
DOGSLOW_OUTPUT = '/ tmp "
# Meld versoeke neem langer as 25 sekondes:
DOGSLOW_TIMER = 25
# Wanneer beide gespesifiseer, e-pos terugsoektogte:
DOGSLOW_EMAIL_TO = 'errors@atlassian.com'
DOGSLOW_EMAIL_FROM = 'no-reply@atlassian.com'
Gebruik:
Elke inkomende HTTP-versoek kry 'n 25 sekonde timeout in die waghond. Indien 'n versoek nie terug te keer binne daardie tyd, die waghond aktiveer en neem 'n blik op die versoek draad se stapel en skryf die terugsoektog (insluitend alle plaaslike stapel veranderlikes - Django styl) na 'n log-lêer.
Elke stadige versoek aangemeld in 'n aparte lêer wat lyk soos hierdie:
Undead versoek onderskep by: 16-05-2011 02:10:12 UTC
AOO http: // localhost: 8000 / vertraging = 2
Draad ID: 140539485042432
Proses ID: 18010
Ouer PID: 17.762
Begin: 16-05-2011 02:10:10 UTC
& Nbsp; Lêer "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/management/commands/runserver.py", lyn 107, in inner_run
& Nbsp; run (self.addr, int (self.port), hanteerder, IPv6 = self.use_ipv6)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", lyn 696, in aanloop
& Nbsp; httpd.serve_forever ()
& Nbsp; File "/usr/lib/python2.7/SocketServer.py", lyn 227, in serve_forever
& Nbsp; self._handle_request_noblock ()
& Nbsp; File "/usr/lib/python2.7/SocketServer.py", lyn 284, in _handle_request_noblock
& Nbsp; self.process_request (versoek client_address)
& Nbsp; File "/usr/lib/python2.7/SocketServer.py", lyn 310, in process_request
& Nbsp; self.finish_request (versoek client_address)
& Nbsp; File "/usr/lib/python2.7/SocketServer.py", lyn 323, in finish_request
& Nbsp; self.RequestHandlerClass (versoek client_address, self)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", lyn 570, in __init__
& Nbsp; BaseHTTPRequestHandler .__ init __ (self, * argumente, ** kwargs)
& Nbsp; File "/usr/lib/python2.7/SocketServer.py", lyn 639, in __init__
& Nbsp; self.handle ()
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", lyn 615, in handvatsel
& Nbsp; handler.run (self.server.get_app ())
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", lyn 283, in aanloop
& Nbsp; self.result = aansoek (self.environ, self.start_response)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/contrib/staticfiles/handlers.py", lyn 68, in __call__
& Nbsp; terugkeer self.application (omge, start_response)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/handlers/wsgi.py", lyn 273, in __call__
& Nbsp; reaksie = self.get_response (versoek)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/handlers/base.py", lyn 111, in get_response
& Nbsp; reaksie = terugbel (versoek * callback_args, ** callback_kwargs)
& Nbsp; File "/home/erik/work/middleware/middleware/sleep/views.py", reël 6, in die slaap
& Nbsp; time.sleep (float (request.GET.get (vertraging "1)))
Volle terugsoektog met plaaslike veranderlikes:
& Nbsp; Lêer "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/management/commands/runserver.py", lyn 107, in inner_run
& Nbsp; run (self.addr, int (self.port), hanteerder, IPv6 = self.use_ipv6)
& Nbsp; ... vele meer ...
Die voorbeeld hierbo toon dat die versoek draad is geblokkeer in time.sleep () by die tyd dogslow het sy blik.
Versoeke wat terugkeer voordat dogslow se timeout verval nie aangemeld raak.
Let daarop dat dogslow neem net 'n blik op die draad se stapel. Dit maak nie die versoek onderbreek, of op enige ander wyse beïnvloed. Met behulp van dogslow is dus veilig om te gebruik in die produksie.
Valkuilen
Dogslow gebruik multithreading. Dit het 'n enkele agtergrond ryg die handvatsels van die waghond outs en neem die tracebacks, sodat die oorspronklike versoek drade is nie onderbreek. Dit het 'n paar gevolge.
Multi en die GIL
In cPython, die GIL (Global Interpreter Lock) verhoed verskeie drade uit te voer Python kode gelyktydig. Slegs wanneer 'n draad uitdruklik stel sy slot op die GIL, kan 'n tweede draad hardloop.
Die vrystelling van die GIL word outomaties gedoen wanneer 'n Python program maak blokkeer oproepe buite die tolk, byvoorbeeld wanneer doen IO.
Vir dogslow dit beteken dat dit kan net betroubaar afsnit versoeke wat stadig omdat hulle doen IO, roep slaap of besig wag slotte hulself aan te skaf.
In die meeste gevalle is dit fine. 'N belangrike oorsaak van stadige Django versoeke is 'n duur databasis navraag. Aangesien dit IO, kan dogslow onderskep diegene fyn. 'N scenario waar cPython se GIL is problematies is wanneer die versoek se draad treffers 'n oneindige lus in Python kode (of wettige Python wat uiters duur en neem 'n lang tyd om uit te voer), nooit die vrystelling van die GIL. Selfs al dogslow se waghond timer beteken geword uitvoerbare, kan dit nie die stapel te meld.
Co-roetines en Greenlets
Dogslow is bedoel vir gebruik in 'n sinkrone werker opset. A webbediener wat gebruik toegewyde drade (of enkel-stringe, toegewyde werker prosesse) versoeke te dien. Django se ingeboude wsgi bediener doen dit, net soos Gunicorn in sy verstek sync-werker af.
Toe hardloop met 'n "mede-roetines raamwerk" waar verskeie versoeke gelyktydig met een draad gedien het, kan terugsoektogte nonsens geword
Vereistes :.
- Python
- Django
Kommentaar nie gevind