Dogslow este Django clasă câine de pază middleware care înregistrează tracebacks de cereri lent.
Instalare:
Instalare dogslow:
Pip instala dogslow
Apoi se adaugă în cazul în care la lista de clase middleware în fișierul settings.py Django:
MIDDLEWARE_CLASSES = (
& Nbsp; "dogslow.WatchdogMiddleware",
& Nbsp; ...
)
Pentru rezultate optime, face unul dintre primele middleware care se rula.
Configurare:
Puteți utiliza următoarele proprietăți de configurare în fișierul settings.py la ton watchdog:
# Watchdog este activată în mod implicit, pentru a dezactiva temporar, setat la fals:
DOGSLOW = True
# Locul în care Watchdog stochează fișierele sale de jurnal:
DOGSLOW_OUTPUT = '/ tmp'
Solicitări # busteni durează mai mult decât 25 secunde:
DOGSLOW_TIMER = 25
# Când ambele specificate, e-mailuri backtrace:
DOGSLOW_EMAIL_TO = 'errors@atlassian.com'
DOGSLOW_EMAIL_FROM = 'no-reply@atlassian.com'
Utilizare:
Fiecare cerere HTTP de intrare devine un al doilea timeout 25 watchdog. În cazul în care o cerere nu se întoarce în acel moment, câinele de pază activează și ia o privire la stivă firul cererea și scrie backtrace (inclusiv toate variabilele stiva locale - stil Django) și un fișier jurnal.
Fiecare cerere de lent este conectat într-un fișier separat, care arată astfel:
Cerere Undead primita la: 16-05-2011 02:10:12 UTC
GET http: // localhost:? 8000 / întârziere = 2
ID Subiect: 140539485042432
Procesul ID: 18010
Părinte PID: 17762
A început: 16-05-2011 02:10:10 UTC
& Nbsp; de fișiere "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/management/commands/runserver.py", linia 107, în inner_run
& Nbsp; centrare (self.addr, int (self.port), handler, IPv6 = self.use_ipv6)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", linia 696, în a alerga
& Nbsp; httpd.serve_forever ()
& Nbsp; Fișier "/usr/lib/python2.7/SocketServer.py", linia 227, în serve_forever
& Nbsp; self._handle_request_noblock ()
& Nbsp; Fișier "/usr/lib/python2.7/SocketServer.py", linia 284, în _handle_request_noblock
& Nbsp; self.process_request (cerere, client_address)
& Nbsp; Fișier "/usr/lib/python2.7/SocketServer.py", linia 310, în process_request
& Nbsp; self.finish_request (cerere, client_address)
& Nbsp; Fișier "/usr/lib/python2.7/SocketServer.py", linia 323, în finish_request
& Nbsp; self.RequestHandlerClass (cerere, client_address, auto)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", linia 570, în __init__
& Nbsp; BaseHTTPRequestHandler .__ init __ (self, * args, ** kwargs)
& Nbsp; Fișier "/usr/lib/python2.7/SocketServer.py", linia 639, în __init__
& Nbsp; self.handle ()
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", linia 615, în mâner
& Nbsp; handler.run (self.server.get_app ())
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", linia 283, în a alerga
& Nbsp; self.result = cerere (self.environ, self.start_response)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/contrib/staticfiles/handlers.py", linia 68, în __call__
& Nbsp; self.application întoarcere (mediului, start_response)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/handlers/wsgi.py", linia 273, în __call__
& Nbsp; răspuns = self.get_response (cerere)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/handlers/base.py", linia 111, în comandă GET_RESPONSE
& Nbsp; răspuns = apel invers (cerere, * callback_args, ** callback_kwargs)
& Nbsp; Fișier "/home/erik/work/middleware/middleware/sleep/views.py", linia 6, în somn
& Nbsp; time.sleep (float (request.GET.get ("întârziere", 1)))
Backtrace completă cu variabile locale:
& Nbsp; de fișiere "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/management/commands/runserver.py", linia 107, în inner_run
& Nbsp; centrare (self.addr, int (self.port), handler, IPv6 = self.use_ipv6)
& Nbsp; ... loturile mai mult ...
Exemplul de mai sus arată că firul cerere a fost blocat în time.sleep () în momentul dogslow luat instantaneu sale.
Solicită ca întorc înainte de expirare dogslow expiră nu te autentificat.
Rețineți că dogslow dureaza doar o privire la stack firul de. Nu întrerupe cererea, sau să influențeze în vreun alt fel. Utilizarea dogslow Prin urmare, este sigur de a utiliza în producție.
Avertismente
Dogslow folosește multithreading. Ea are un singur fond treceți mânerele timeout watchdog și ia tracebacks, astfel încât firele cerere originale nu sunt întrerupte. Acest lucru are unele consecințe.
Multithreading și GIL
În cPython, Gil (Global Interpret Lock) previne mai multe fire de executare cod Python simultan. Numai atunci când un fir de presă în mod explicit de blocare de pe Gil, poate un al doilea alerga fir.
Eliberarea Gil se face automat de fiecare dată când un program de Python face blocarea apelurilor în afara interpretului, de exemplu atunci când faci IO.
Pentru dogslow aceasta înseamnă că poate doar credibil intercepta cererile care sunt lent, deoarece acestea fac IO, de asteptare somn sau ocupat de așteptare pentru a dobândi lacate ei înșiși.
În cele mai multe cazuri, acest lucru este bine. O cauză importantă a cererilor Django lent este o bază de date de interogare scump. Deoarece aceasta este IO, dogslow poate intercepta cele fin. Un scenariu în care GIL cPython este problematic este atunci când firul cererea de spectaculos o buclă infinită în cod Python (sau Python legitim, care este extrem de scump și durează o lungă perioadă de timp pentru a executa), nu eliberarea GIL. Chiar dacă timer watchdog dogslow lui va deveni o cere, ea nu se poate conecta stiva.
Co-rutine și Greenlets
Dogslow este destinat utilizării într-o configurație lucrător sincron. Un server de web care utilizează fire dedicate (sau procese singur fir, lucrătorilor dedicate) pentru a servi cererile. Serverul WSGI built-in Django lui face acest lucru, la fel ca Gunicorn în modul implicit de sincronizare-lucrător.
Atunci când rulează cu un "cadru co-rutine" în cazul în care există mai multe cereri sunt servite simultan de un fir, backtrace ar putea deveni fără sens
Cerințe :.
- Python
- Django
Comentariile nu a fost găsit