Dogslow

Software screenshot:
Dogslow
Dettagli del software:
Versione: 0.9.5
Data di caricamento: 14 Apr 15
Sviluppatore: Erik van Zijst
Licenza: Libero
Popolarità: 62

Rating: 3.5/5 (Total Votes: 2)

Dogslow è Django classe watchdog middleware che registra traceback di richieste lenti.
Installazione:
Installare dogslow:
pip installare dogslow
Quindi aggiungere se nell'elenco delle classi di middleware nel file settings.py Django:
MIDDLEWARE_CLASSES = (
& Nbsp; 'dogslow.WatchdogMiddleware',
& Nbsp; ...
)
Per ottenere i migliori risultati, lo rendono uno dei primi middleware che si corrono.
Configurazione:
È possibile utilizzare le seguenti proprietà di configurazione nel file settings.py per sintonizzare il cane da guardia:
# Watchdog è abilitata di default, per disabilitare temporaneamente, impostato su False:
DOGSLOW = True
# Posizione dove Watchdog memorizza i file di registro:
DOGSLOW_OUTPUT = '/ tmp'
Richieste # registro richiede più di 25 secondi:
DOGSLOW_TIMER = 25
# Quando entrambi specificati, email backtrace:
DOGSLOW_EMAIL_TO = 'errors@atlassian.com'
DOGSLOW_EMAIL_FROM = 'no-reply@atlassian.com'
Utilizzo:
Ogni richiesta HTTP in ingresso ottiene un secondo timeout 25 nella watchdog. Se una richiesta non restituisce entro tale termine, il cane da guardia attiva e prende una sbirciatina al stack del thread richiesta e scrive il backtrace (comprese tutte le variabili di stack locali - in stile Django) in un file di log.
Ogni richiesta lenta viene registrato in un file separato che assomiglia a questo:
Richiesta Undead intercettato a: 16-05-2011 02:10:12 UTC
GET http: // localhost: 8000 / delay = 2
ID Discussione: 140539485042432
ID di processo: 18010
Parent PID: 17762
Iniziata: 16-05-2011 02:10:10 UTC
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/management/commands/runserver.py", linea 107, in inner_run
& Nbsp; run (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", la linea 696, in corsa
& Nbsp; httpd.serve_forever ()
& Nbsp; File "/usr/lib/python2.7/SocketServer.py", la linea 227, in serve_forever
& Nbsp; self._handle_request_noblock ()
& Nbsp; File "/usr/lib/python2.7/SocketServer.py", la linea 284, in _handle_request_noblock
& Nbsp; self.process_request (richiesta, client_address)
& Nbsp; File "/usr/lib/python2.7/SocketServer.py", la linea 310, in process_request
& Nbsp; self.finish_request (richiesta, client_address)
& Nbsp; File "/usr/lib/python2.7/SocketServer.py", la linea 323, in finish_request
& Nbsp; self.RequestHandlerClass (richiesta, client_address, auto)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", la linea 570, in __init__
& Nbsp; BaseHTTPRequestHandler .__ init __ (self, * args, ** kwargs)
& Nbsp; File "/usr/lib/python2.7/SocketServer.py", la linea 639, in __init__
& Nbsp; self.handle ()
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", la linea 615, in maniglia
& Nbsp; handler.run (self.server.get_app ())
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", la linea 283, in corsa
& Nbsp; self.result = applicazione (self.environ, self.start_response)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/contrib/staticfiles/handlers.py", linea 68, in __call__
& Nbsp; ritorno self.application (environ, start_response)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/handlers/wsgi.py", la linea 273, in __call__
& Nbsp; di risposta = self.get_response (richiesta)
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/handlers/base.py", la linea 111, in GET_RESPONSE
& Nbsp; di risposta = callback (richiesta, * callback_args, ** callback_kwargs)
& Nbsp; File "/home/erik/work/middleware/middleware/sleep/views.py", linea 6, nel sonno
& Nbsp; time.sleep (float (request.GET.get ('ritardo', 1)))
Backtrace completo con variabili locali:
& Nbsp; File "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/management/commands/runserver.py", linea 107, in inner_run
& Nbsp; run (self.addr, int (self.port), handler, ipv6 = self.use_ipv6)
& Nbsp; ... carichi di più ...
L'esempio sopra mostra che il thread richiesta è stata bloccata in time.sleep () al momento dogslow preso il snapshot.
Le richieste che restituiscono prima del timeout di dogslow QVZ non vengono registrati.
Si noti che dogslow richiede solo una sbirciatina al stack del thread. Esso non interrompe la richiesta, o influenzare in altro modo. Utilizzando dogslow è quindi sicuro da usare in produzione.
Avvertenze
Dogslow utilizza multithreading. Ha uno sfondo unico filo le maniglie i timeout watchdog e prende le traceback, in modo che i fili di richiesta originali non vengono interrotti. Questo ha delle conseguenze.
Multithreading e la GIL
In CPython, la GIL (Global Interpreter Lock) impedisce più thread di eseguire codice Python contemporaneamente. Solo quando un thread rilascia esplicitamente la sua serratura della GIL, può un secondo run thread.
Rilasciando il GIL viene fatto automaticamente ogni volta che un programma Python fa bloccare le chiamate esterne dell'interprete, ad esempio, quando si fa IO.
Per dogslow questo significa che può solo affidabile intercettare le richieste che sono lenti perché stanno facendo IO, chiamando dormire o occupato in attesa di acquisire blocchi stessi.
Nella maggior parte dei casi questo va bene. Una causa importante di lenti richieste Django è una query di database costoso. Poiché si tratta di IO, dogslow può intercettare coloro bene. Uno scenario in cui GIL di CPython è problematico è quando il filo della richiesta colpisce un ciclo infinito nel codice Python (o legittima Python che è estremamente costoso e richiede molto tempo per l'esecuzione), non rilasciare il GIL. Anche se il timer watchdog del dogslow fa diventare eseguibile, non può accedere alla pila.
Co-routine e Greenlets
Dogslow è destinato all'uso in una configurazione lavoratore sincrona. Un webserver che utilizza i thread dedicati (o, processi a thread singolo lavoratore dedicati) per servire le richieste. WSGI server built-in di Django fa questo, come fa Gunicorn in modalità predefinita sync-lavoratore.
Durante l'esecuzione di un "quadro di co-routine" in cui più richieste sono serviti contemporaneamente da un thread, backtrace potrebbero diventare assurdo

Requisiti :.

  • Python
  • Django

Altri software di sviluppo Erik van Zijst

interruptingcow
interruptingcow

14 Apr 15

Commenti a Dogslow

I commenti non trovato
Aggiungi commento
Accendere le immagini!