Dogslow

Logiciel capture d'écran:
Dogslow
Détails logiciels:
Version: 0.9.5
Date de transfert: 14 Apr 15
Développeur: Erik van Zijst
Licence: Gratuit
Popularité: 1

Rating: nan/5 (Total Votes: 0)

Dogslow est Django classe chien de garde de middleware qui enregistre tracebacks de demandes lents.
Installation:
Installez dogslow:
pip installer dogslow
Puis ajouter si à votre liste de classes de middleware dans votre fichier settings.py Django:
MIDDLEWARE_CLASSES = (
& Nbsp; »dogslow.WatchdogMiddleware ',
& Nbsp; ...
)
Pour de meilleurs résultats, en faire l'un des premiers middlewares qui courent.
Configuration:
Vous pouvez utiliser les propriétés de configuration suivantes dans votre fichier de settings.py pour régler le chien de garde:
# Watchdog est activé par défaut, de désactiver temporairement, la valeur False:
DOGSLOW = True
# Endroit où Watchdog stocke ses fichiers journaux:
DOGSLOW_OUTPUT = '/ tmp'
Demandes # Log prenant plus de 25 secondes:
DOGSLOW_TIMER = 25
# Quand les deux spécifiées, e-mails backtraces:
DOGSLOW_EMAIL_TO = 'errors@atlassian.com'
DOGSLOW_EMAIL_FROM = 'no-reply@atlassian.com'
Utilisation:
Chaque requête HTTP entrant obtient un deuxième temps d'arrêt 25 dans le chien de garde. Si une demande ne retourne pas dans ce délai, le chien de garde active et prend un coup d'oeil à la pile du thread de requête et écrit la trace (y compris toutes les variables de pile locales - style Django) à un fichier journal.
Chaque demande est lente connecté dans un fichier séparé qui ressemble à ceci:
Demande Undead intercepté à: 16-05-2011 2:10:12 UTC
GET http: // localhost: 8000 / delay = 2
ID de thread: 140539485042432
Processus ID: 18010
Parent PID: 17762
Commencé 16-05-2011 2:10:10 UTC
& Nbsp; Fichier "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/management/commands/runserver.py", ligne 107, dans inner_run
& Nbsp; run (self.addr, int (self.port), gestionnaire, ipv6 = self.use_ipv6)
& Nbsp; Fichier "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", ligne 696, en run
& Nbsp; httpd.serve_forever ()
& Nbsp; Fichier "/usr/lib/python2.7/SocketServer.py", ligne 227, dans serve_forever
& Nbsp; self._handle_request_noblock ()
& Nbsp; Fichier "/usr/lib/python2.7/SocketServer.py", ligne 284, dans _handle_request_noblock
& Nbsp; self.process_request (demande, adresse_client)
& Nbsp; Fichier "/usr/lib/python2.7/SocketServer.py", ligne 310, en process_request
& Nbsp; self.finish_request (demande, adresse_client)
& Nbsp; Fichier "/usr/lib/python2.7/SocketServer.py", la ligne 323, dans finish_request
& Nbsp; self.RequestHandlerClass (demande, adresse_client, auto)
& Nbsp; Fichier "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", la ligne 570, dans __init__
& Nbsp; BaseHTTPRequestHandler .__ init __ (self, * args, ** kwargs)
& Nbsp; Fichier "/usr/lib/python2.7/SocketServer.py", ligne 639, dans __init__
& Nbsp; self.handle ()
& Nbsp; Fichier "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", ligne 615, dans la poignée
& Nbsp; handler.run (self.server.get_app ())
& Nbsp; Fichier "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", ligne 283, en run
& Nbsp; self.result = application (self.environ, self.start_response)
& Nbsp; Fichier "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/contrib/staticfiles/handlers.py", ligne 68, dans __call__
& Nbsp; retour self.application (environ, start_response)
& Nbsp; Fichier "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/handlers/wsgi.py", ligne 273, dans __call__
& Nbsp; la réponse = self.get_response (demande)
& Nbsp; Fichier "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/handlers/base.py", la ligne 111, dans GET_RESPONSE
& Nbsp; la réponse = rappel (demande, * callback_args, callback_kwargs **)
& Nbsp; Fichier "/home/erik/work/middleware/middleware/sleep/views.py", ligne 6, dans le sommeil
& Nbsp; time.sleep (float (request.GET.get («retard», 1)))
Trace complète avec des variables locales:
& Nbsp; Fichier "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/management/commands/runserver.py", ligne 107, dans inner_run
& Nbsp; run (self.addr, int (self.port), gestionnaire, ipv6 = self.use_ipv6)
& Nbsp; ... charges plus ...
L'exemple ci-dessus montre que le fil de demande a été bloquée dans time.sleep () au moment dogslow a pris son cliché.
Demande que de revenir avant la temporisation de dogslow fait expirer ne sont pas enregistrés.
Notez que dogslow suffit d'un coup d'œil à la pile du thread. Il ne interrompt pas la demande, ou l'influencer d'une autre manière. Utilisation dogslow est donc sûr à utiliser dans la production.
Mises en garde
Dogslow utilise le multithreading. Il a un seul fond visser les poignées les délais d'attente de surveillance et prend les tracebacks, de sorte que les fils originaux de demande ne sont pas interrompues. Cela a des conséquences.
Multithreading et GIL
Dans CPython, le GIL (interprète de verrouillage global) empêche plusieurs threads d'exécuter du code Python simultanément. Seulement quand un thread libère explicitement son verrou sur la GIL, peut une deuxième manche de fil.
Publie la GIL est fait automatiquement chaque fois qu'un programme Python fait bloquer les appels en dehors de l'interprète, par exemple lorsque vous faites IO.
Pour dogslow cela signifie qu'il ne peut de manière fiable intercepter les demandes qui sont lents parce qu'ils font IO, appelant le sommeil ou occupé attendant d'acquérir serrures eux-mêmes.
Dans la plupart des cas, ce est très bien. Une cause importante de demandes Django lents est une requête de base de données coûteux. Puisque ce est IO, dogslow peut intercepter ceux bien. Un scénario où GIL de CPython est problématique, ce est quand le fil de la demande frappe une boucle infinie dans le code Python (ou Python légitime qui est extrêmement coûteux et prend beaucoup de temps pour exécuter), ne jamais relâcher la GIL. Même si la minuterie de chien de garde dogslow ne devient exécutable, il ne peut pas ouvrir la pile.
Co-routines et greenlets
Dogslow est destiné à être utilisé dans une configuration de travail synchrone. Un serveur web qui utilise des threads dédiés (ou processus monothread, dévoués travailleurs) pour servir les demandes. Le serveur de wsgi intégré de Django fait cela, comme le fait Gunicorn dans son mode par défaut de synchronisation de travail.
Lors de l'exécution d'un «cadre co-routines" où de multiples demandes sont servis simultanément par un fil, backtraces pourraient devenir absurde

Exigences :.

  • Python
  • Django

D'autres logiciels de développeur Erik van Zijst

interruptingcow
interruptingcow

14 Apr 15

Commentaires à Dogslow

Commentaires non trouvées
Ajouter un commentaire
Tourner sur les images!