Dogslow является Джанго сторожевой промежуточного класса, который регистрирует tracebacks медленных запросов.
Установка
Установите dogslow:
пункт установить dogslow
Затем добавьте, если в ваш список промежуточного классов в вашем файле settings.py Django:
MIDDLEWARE_CLASSES = (
& NBSP; 'dogslow.WatchdogMiddleware ",
& NBSP; ...
)
Для получения наилучших результатов, делают его одним из первых промежуточное программное что работают.
Конфигурация:
Вы можете использовать следующие свойства конфигурации в вашем файле settings.py для настройки сторожевого:
# Сторожевой таймер включен по умолчанию, чтобы временно отключить, установите значение False:
DOGSLOW = True
Место, где # Сторожевой хранит свои лог-файлы:
DOGSLOW_OUTPUT = '/ TMP'
Запросы # Вход больше времени, чем 25 секунд:
DOGSLOW_TIMER = 25
# Когда оба указанные сообщения электронной почты, цепочек вызовов:
DOGSLOW_EMAIL_TO = 'errors@atlassian.com "
DOGSLOW_EMAIL_FROM = 'no-reply@atlassian.com "
Применение:
Каждый входящий запрос HTTP получает вторую тайм-аут в сторожевой 25. Если запрос не возвращает в течение этого времени, сторожевой таймер активируется и принимает взглянуть на стек запрос потока и записывает трассировку (в том числе всех локальных переменных стека - Джанго стиль) в файл журнала.
Каждый медленно запрос заносится в отдельный файл, который выглядит следующим образом:
Нежить запрос перехватывается на: 16.05.2011 2:10:12 UTC
GET HTTP: // локальный: 8000 / задержка = 2
Тема ID: 140539485042432
Процесс ID: 18010
Родитель PID: 17762
Создана 16.05.2011 2:10:10 UTC
& NBSP; файла "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/management/commands/runserver.py", Линия 107, в inner_run
& NBSP; Run (self.addr, INT (self.port), обработчик, IPv6 = self.use_ipv6)
& NBSP; Файл "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", линия 696, в перспективе
& NBSP; httpd.serve_forever ()
& NBSP; Файл "/usr/lib/python2.7/SocketServer.py", линия 227, в serve_forever
& NBSP; self._handle_request_noblock ()
& NBSP; Файл "/usr/lib/python2.7/SocketServer.py", линия 284, в _handle_request_noblock
& NBSP; self.process_request (запрос, client_address)
& NBSP; Файл "/usr/lib/python2.7/SocketServer.py", линия 310, в process_request
& NBSP; self.finish_request (запрос, client_address)
& NBSP; Файл "/usr/lib/python2.7/SocketServer.py", линия 323, в finish_request
& NBSP; self.RequestHandlerClass (запрос, client_address, само)
& NBSP; Файл "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", линия 570, в __init__
& NBSP; BaseHTTPRequestHandler .__ инициализации __ (сам, * Args, ** kwargs)
& NBSP; Файл "/usr/lib/python2.7/SocketServer.py", линия 639, в __init__
& NBSP; self.handle ()
& NBSP; Файл "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", линия 615, в ручке
& NBSP; handler.run (self.server.get_app ())
& NBSP; Файл "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/servers/basehttp.py", линия 283, в перспективе
& NBSP; self.result = приложение (self.environ, self.start_response)
& NBSP; Файл "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/contrib/staticfiles/handlers.py", линия 68, в __call__
& NBSP; возвращение self.application (среда, start_response)
& NBSP; Файл "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/handlers/wsgi.py", линия 273, в __call__
& NBSP; ответ = self.get_response (запрос)
& NBSP; Файл "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/handlers/base.py", линия 111, в get_response
& NBSP; ответ = обратный вызов (запрос, * callback_args, ** callback_kwargs)
& NBSP; Файл "/home/erik/work/middleware/middleware/sleep/views.py", линия 6, во сне
& NBSP; time.sleep (поплавок (request.GET.get ('задержка', 1)))
Полное трассировку с локальными переменными:
& NBSP; файла "/home/erik/work/virtualenv/bit/lib/python2.7/site-packages/django/core/management/commands/runserver.py", Линия 107, в inner_run
& NBSP; Run (self.addr, INT (self.port), обработчик, IPv6 = self.use_ipv6)
& NBSP; ... подробнее ... нагрузки
В приведенном выше примере показывает, что запрос нить блокируется в time.sleep () в то время dogslow взял его снимок.
Просит тайм-аут, прежде чем вернуться dogslow истекает не нужно регистрироваться.
Обратите внимание, что dogslow принимает только взглянуть на стек потока. Это не прерывает запрос, или влиять на его любым другим способом. Использование dogslow поэтому безопасны для использования в производстве.
Предостережения
Dogslow использует многопоточность. Он имеет один фоновый поток ручки сторожевой таймер тайм-ауты и принимает tracebacks, так что оригинальные темы запроса не прерывается. Это имеет некоторые последствия.
Многопоточность и ГИЛ
В CPython, то GIL (Global Interpreter Lock) предотвращает многочисленные темы от выполнения Python код одновременно. Только тогда, когда нить явно выпускает свой замок на GIL, может второй поток выполнения.
Освобождение ГИЛ делается автоматически, когда программа Python делает блокировку вызовов за пределами интерпретатора, например, когда делают IO.
Для dogslow это означает, что он может только надежно перехватывать запросы, которые медленно, потому что они делают IO, называя сон или занят ждать, чтобы приобрести сами замки.
В большинстве случаев это нормально. Важным причиной медленных запросов Django является дорогим запрос к базе данных. Так как это И.О., dogslow может перехватить тех, отлично. Сценарий, где ГИЛ CPython является проблематичным, когда нить просьбе хитов бесконечный цикл в Python кода (или законного Python, что является чрезвычайно дорого и отнимает много времени, чтобы выполнить), никогда не отпуская GIL. Даже если сторожевой таймер dogslow в действительно становится работоспособным, он не может войти в стек.
Co-процедуры и Greenlets
Dogslow предназначен для использования в синхронной конфигурации рабочего. Веб-сервер, который использует специальные темы (или однопоточных, выделенные рабочие процессы), чтобы обслуживать запросы. Встроенный сервер WSGI Джанго делает это, как делает Gunicorn в режиме синхронизации, рабочий по умолчанию.
При работе с "рамки сопрограммам", где несколько запросов подаются одновременно одним потоком, цепочек вызовов может стать бессмысленным
Требования :.
- Python
- Джанго
Комментарии не найдены