Статьи

Ведение журнала Django Performance

Недавно я выполнил базовую работу по профилированию производительности с Ruby on Rails, и одним из инструментов, который я нашел очень полезным, был анализатор журнала запросов . Это относительно простое приложение командной строки, которое вы можете указать на файлы журналов приложения Rails, и оно выводит много информации в совокупности. Таким образом, информация о средней продолжительности запроса или о запросах SQL выполняется. Работая над недавним проектом Django, я хотел, чтобы инструмент делал то же самое, и в итоге написал журнал времени.

Я провел небольшое исследование, чтобы выяснить, смогу ли я найти что-то подобное. Вот несколько других интересных инструментов, которые не совсем то, что я хотел:

  • Django Slow Log — регистрирует такие вещи, как память и средние нагрузки
  • Django Dump Slow — похоже, но предназначен только для регистрации медленных запросов, а не для всего, также необходим бэкэнд Redis
  • Zamboni Middleware — это очень похоже на то, что я хотел, но это не отдельный модуль, и я не нашел ничего, чтобы проанализировать результаты

Timelog очень похож на промежуточное ПО в Zamboni, единственное отличие состоит в том, что я использую новую поддержку журналирования в Django 1.3. Более интересной является команда управления, которая выводит что-то вроде:

+--------------------------+--------+--------+-------+---------+---------+-------+-----------------+
| view                     | method | status | count | minimum | maximum | mean  | stdev           |
+--------------------------+--------+--------+-------+---------+---------+-------+-----------------+
| boxes.viewsBoxDetailView | GET    | 200    | 9430  | 0.14    | 0.28    | 0.21  | 0.0700037118541 |
+--------------------------+--------+--------+-------+---------+---------+-------+-----------------+
| boxes.viewsBoxListView   | GET    | 200    | 66010 | 0.17    | 0.28    | 0.232 | 0.0455415351076 |
+--------------------------+--------+--------+-------+---------+---------+-------+-----------------+
| django.views.staticserve | GET    | 200    | 61295 | 0.00    | 0.02    | 0.007 | 0.0060574669888 |
+--------------------------+--------+--------+-------+---------+---------+-------+-----------------+

В настоящий момент я не проводил никаких реальных тестов или оптимизаций сценария, но он будет просматривать файл журнала размером 300 000 строк (20 МБ) в возрасте до 20 лет на моем устаревшем macbook.

Код для Timelog находится на github на github.com/garethr/django-timelog, и я также загрузил на PyPi на pypi.com/django-timelog . Вы можете установить его с помощью обычных инструментов, таких как pip:

pip install django-timelog

После установки вам нужно сделать небольшую настройку, чтобы все заработало. Сначала добавьте промежуточное программное обеспечение к вашему MIDDLEWARE_CLASSES в вашем файле настроек.

MIDDLEWARE_CLASSES = (
  'timelog.middleware.TimeLogMiddleware',

 
Затем добавьте timelog в ваш список INSTALLED_APPS. Это чисто для обнаружения команды управления.

INSTALLED_APPS = (
  'timelog',

Затем настройте регистратор, который вы хотите использовать. Это действительно зависит от того, что вы хотите сделать, настройка ведения журнала django 1.3 довольно мощная. Вот как я настроил регистрацию в качестве примера:

TIMELOG_LOG = '/path/to/logs/timelog.log'

LOGGING = {
  'version': 1,
  'formatters': {
    'plain': {
      'format': '%(asctime)s %(message)s'},
    },
  'handlers': {
    'timelog': {
      'level': 'DEBUG',
      'class': 'logging.handlers.RotatingFileHandler',
      'filename': TIMELOG_LOG,
      'maxBytes': 1024 * 1024 * 5,  # 5 MB
      'backupCount': 5,
      'formatter': 'plain',
    },
  },
  'loggers': {
    'timelog.middleware': {
      'handlers': ['timelog'],
      'level': 'DEBUG',
      'propogate': False,
     }
  }
}

 
Чтобы скрипт анализатора работал правильно, вам нужно использовать простой форматер и зарегистрировать обработчик для регистратора timelog.middleware.

После того, как все настроено, попробуйте несколько раз нажать ваше приложение Вы должны увидеть файл журнала, созданный в месте, указанном в TIMELOG_LOG. Заполните это несколькими строками, а затем выполните команду управления analysis_timelog:

python manage.py analyze_timelog

Это должно вывести что-то похожее на приведенную выше таблицу, но с вашим временем и представлениями. В настоящее время команда управления позволяет вам указать анализатору другой файл, например, из резервной копии, или файл, который вы извлекли из производства, но хотите выполнить команду локально. Скорее всего, я добавлю несколько фильтров, если позволит время для таких вещей, как не показывать все просмотры или показывать только просмотры между заданным диапазоном дат.

Приведенная выше таблица, показывающая функцию представления, хороша для больших трендов изображения, но если вы хотите углубиться в конкретный путь, вы можете передать аргумент, чтобы не изменить путь:

python manage.py analyze_timelog --noreverse

Это должно дать вам что-то вроде:

+----------------------------------+--------+--------+-------+---------+---------+-------+------------------+
| view                             | method | status | count | minimum | maximum | mean  | stdev            |
+----------------------------------+--------+--------+-------+---------+---------+-------+------------------+
| /assets/css/main.css             | GET    | 200    | 61295 | 0.00    | 0.02    | 0.007 | 0.0060574669888  |
+----------------------------------+--------+--------+-------+---------+---------+-------+------------------+
| / bob                            | GET    | 404    | 4715  | 0.01    | 0.01    | 0.01  | 0.0              |
+----------------------------------+--------+--------+-------+---------+---------+-------+------------------+
| /                                | GET    | 200    | 66010 | 0.17    | 0.28    | 0.232 | 0.0455415351076  |
+----------------------------------+--------+--------+-------+---------+---------+-------+------------------+
| /__debug__/m/css/toolbar.min.css | GET    | 304    | 4715  | 0.00    | 0.00    | 0.0   | 0.0              |
+----------------------------------+--------+--------+-------+---------+---------+-------+------------------+
| /14/                             | GET    | 200    | 9430  | 0.14    | 0.28    | 0.21  | 0.0700037118541  |
+----------------------------------+--------+--------+-------+---------+---------+-------+------------------+

 

 

Источник: http://morethanseven.net/2011/06/09/Logging-django-performance.html