Dogslow yavaş istekleri tracebacks günlükleri Django Watchdog katman sınıftır.
Kurulum:
Dogslow yükleyin:
dogslow yüklemek pip
Sonra Django settings.py dosyasında katman sınıfların listenize eğer ekleyin:
MIDDLEWARE_CLASSES (=
& Nbsp; 'dogslow.WatchdogMiddleware'
& Nbsp; ...
)
En iyi sonuç için, çalıştırıldığı ilk ara katman biri olun.
Yapılandırma:
Sen ayarlamak Watchdog için settings.py dosyasında aşağıdaki yapılandırma özelliklerini kullanabilirsiniz:
# Watchdog false olarak ayarlanır, geçici devre dışı bırakmak için, varsayılan olarak etkindir:
DOGSLOW = true
Watchdog günlük dosyalarını saklar # Konumu:
DOGSLOW_OUTPUT = '/ tmp'
Uzun 25 saniye alarak # Günlüğü istekleri:
DOGSLOW_TIMER = 25
# Her iki belirtilen e-posta geriye dönük izleme:
DOGSLOW_EMAIL_TO = 'errors@atlassian.com'
DOGSLOW_EMAIL_FROM = 'no-reply@atlassian.com'
Kullanım:
Her gelen HTTP isteği watchdog bir 25 saniye zaman aşımı alır. Bir istek bu süre içinde dönmezse, bekçi aktive ve istek parçacığının yığını bir göz alır ve (tüm yerel yığın değişkenleri dahil - Django tarzı) geri izleme yazan bir günlük dosyasına.
Her yavaş isteği bu gibi görünüyor ayrı bir dosyaya kaydedilir:
16-05-2011 02:10:12 UTC: Undead istek de ele
GET http: // localhost:? 8000 / gecikme = 2
Konu ID: 140539485042432
İşlem Kimliği: 18010
Veli PID: 17.762
Başlatan: 16-05-2011 02:10:10 UTC
& Nbsp; Dosya "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/management/commands/runserver.py", hat 107, inner_run içinde
& Nbsp; koşmak (self.addr, int (self.port), işleyici, ipv6 = self.use_ipv6)
& Nbsp; Dosya "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", satır 696, vadede
& Nbsp; httpd.serve_forever ()
& Nbsp; serve_forever içinde, satır 227, "/usr/lib/python2.7/SocketServer.py" Dosya
& Nbsp; self._handle_request_noblock ()
& Nbsp; _handle_request_noblock içinde, satır 284, "/usr/lib/python2.7/SocketServer.py" Dosya
& Nbsp; self.process_request (istek, client_address)
& Nbsp; process_request içinde, satır 310, "/usr/lib/python2.7/SocketServer.py" Dosya
& Nbsp; self.finish_request (istek, client_address)
& Nbsp; finish_request içinde, satır 323, "/usr/lib/python2.7/SocketServer.py" Dosya
& Nbsp; self.RequestHandlerClass (istek, client_address, kendini)
& Nbsp; Dosya "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", satır 570, __init__
& Nbsp; BaseHTTPRequestHandler .__ init __ (self, * args, ** kwargs)
& Nbsp; __init__, çizgi 639, "/usr/lib/python2.7/SocketServer.py" Dosya
& Nbsp; self.handle ()
& Nbsp; Dosya "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", satır 615, kolu
& Nbsp; handler.run (self.server.get_app ())
& Nbsp; Dosya "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", satır 283, vadede
& Nbsp; self.result = uygulama (self.environ, self.start_response)
& Nbsp; İçerik "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/contrib/staticfiles/handlers.py", satır 68, __call__ içinde
& Nbsp; dönüş self.application (environ, start_response)
& Nbsp; Dosya "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/handlers/wsgi.py", satır 273, __call__ içinde
& Nbsp; tepkisi = self.get_response (istek)
& Nbsp; Dosya "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/handlers/base.py", satır 111, MESAJ_AL içinde
& Nbsp; tepkisi = geri arama (istek, * callback_args, ** callback_kwargs)
& Nbsp; uyku "/home/erik/work/middleware/middleware/sleep/views.py", çizgi 6, Dosya
& Nbsp; time.sleep (şamandıra (request.GET.get ('gecikme', 1)))
Yerel değişkenler tam backtrace:
& Nbsp; Dosya "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/management/commands/runserver.py", hat 107, inner_run içinde
& Nbsp; koşmak (self.addr, int (self.port), işleyici, ipv6 = self.use_ipv6)
& Nbsp; ... yükleri daha fazla ...
Yukarıdaki örnekte istek iplik kendi fotoğrafını aldı dogslow zaman () time.sleep bloke olduğunu göstermektedir.
Dogslow en zaman aşımından önce dönmek istekleri günlüğe alamadım süresi dolmadan.
Bu dogslow sadece parçacığının yığını bir göz alır unutmayın. Bu isteği kesmek, ya da başka bir şekilde bunu etkilemez. Dogslow kullanılması dolayısıyla üretimde kullanmak güvenlidir.
Uyarılar
Dogslow çoklu kullanır. Tek bir arka plan tutacağa izleme zaman aşımı iplik vardır ve orijinal isteği ipler kesilmez böylece, tracebacks alır. Bu, bazı sonuçları vardır.
Çoklu ve GIL
CPython yılında GIL (Küresel Tercüman Kilidi) aynı anda Python kodunu yürütülmesini birden çok iş parçacığı engeller. Sadece bir iş parçacığı açıkça can ikinci iplik çalıştırmak, GIL üzerindeki kilidi serbest bıraktığında.
GIL bir Python programı IO yaparken, örneğin, tercüman dışında aramaları engelleme yapar her otomatik olarak yapılır bırakılması.
Dogslow için bu sadece güvenilir kilitleri kendileri elde etmek için bekleyen, IO yapıyor uyku arayarak veya meşgul çünkü yavaş istekleri kesmek olabilir anlamına gelir.
Çoğu durumda bu gayet iyi. Yavaş Django istekleri önemli bir nedenidir pahalı bir veritabanı sorgu. Bu IO olduğundan, dogslow bu ince kesmek olabilir. Isteğin iş parçacığı asla GIL serbest, Python kodu sonsuz bir döngüye vurur (son derece pahalı ya da meşru Python ve yürütmek için uzun bir zaman alır) ne zaman CPython en GIL sorunlu bir senaryodur. Dogslow en Watchdog zamanlayıcı çalıştırılabilir hale gelmez olsa, bu yığını giriş yapamıyorum.
Ortak rutinleri ve Greenlets
Dogslow bir senkronize çalışan bir yapılandırmada kullanılmak üzere tasarlanmıştır. Özel konuları (veya tek-parçacıklı, özel alt işlemleri) kullanan bir web sunucusu isteklere hizmet için. Varsayılan senkronizasyon işçi modunda Gunicorn yaptığı gibi Django yerleşik WSGI sunucu, bunu yapar.
Birden istekleri bir iş parçacığı tarafından aynı anda servis edilir "co-rutinleri çerçevesinde" ile çalıştırırken, geriye dönük izleme saçma hale gelebilir
Gereksinimler :.
- Python
- Django
Yorum Bulunamadı