Рубрики
Без рубрики

Ваше приложение Django медленно? Думайте как ученый для данных, а не инженер

Вместо того, чтобы полагаться на интуицию инженера, что, если мы подошли к исследованию эффективности, как ученый для данных? Tagged DataScience, Python, Django, Performance.

Этот пост первоначально появился на Блог разведчика .

Я инженер по профессии. Я полагаюсь на интуицию При исследовании медленного приложения Django. За эти годы я решал много проблем с производительностью, и короткие сокращения, которые занимается моим мозгом, часто требует работы. Однако Интуиция может потерпеть неудачу Анкет Он может усердно терпеть неудачу в сложных приложениях Django со многими уровнями (например: база данных SQL, база данных NOSQL, Elasticsearch и т. Д.) И множество представлений. Слишком много шума.

Вместо того, чтобы полагаться на интуицию инженера, что, если мы подошли к исследованию эффективности, как ученый для данных? В этом посте я буду рассмотреть вопрос о производительности в качестве ученых данных, а не как инженера. Я поделюсь данными временных рядов из реальной проблемы с производительностью и моей ноутбуке Google Colab, который я использовал для решения этой проблемы.

Проблема, часть I: слишком много шума

Фото предоставлено: pyc Carnoy

Многие проблемы с производительностью вызваны одним из следующих действий:

  1. Медленный слой – Только один из многих слоев (база данных, сервер приложений и т. Д.) Медленно и влияет на многие представления в приложении Django.
  2. Медленный вид – Одно представление генерирует медленные запросы. Это оказывает большое влияние на профиль производительности приложения в целом.
  3. Высокая пропускная способность – Редко использованный взгляд внезапно видит приток трафика и запускает всплеск общего времени отклика приложения.

При расследовании проблемы с производительностью я начинаю с поиска корреляций. Ужигают ли какие -либо показатели хуже в то же время? Это может быть сложно: Скромное приложение Django с 10 слоями и 150 просмотров имеет 3000 уникальных комбинаций наборов данных временных рядов для сравнения! Если моя интуиция не может быстро изолировать эту проблему, то почти невозможно изолировать вещи самостоятельно.

Проблема, часть II: Призрачные корреляции

Определение, связано ли с двумя наборами данных временных рядов Печально известный непостоянный Анкет Например, разве это не похоже на количество фильмов, которые Николас Кейдж появляется в каждом году, и утопление бассейна коррелирует?

Поддельные корреляции это целая книга, связанная с этими, казалось бы, ясными, но не связанными корреляциями! Итак, Почему тенденции, по -видимому, вызывают корреляции при просмотре Время диаграмма?

Вот пример: пять лет назад, моя область Колорадо испытал исторический наводнение Анкет Он выключил один из двух основных маршрутов в Парк Эстес, ворота в Национальный парк Роки Маунтин. Если бы вы посмотрели на квитанции о продажах по многим различным типам предприятий в Эстес -Парке, вы увидите резкое снижение доходов, пока дорога была закрыта и увеличение дохода, когда дорога вновь открылась. Это не означает, что доход среди разных магазинов был коррелирован. Магазины только что повлияли на взаимную зависимость: закрытая дорога!

Один из самых простых способов удалить тенденцию из временного ряда – рассчитать первое различие Анкет Чтобы рассчитать первое разницу, вы вычтите из каждой точки точку, которая была до нее:

y'(t) = y(t) - y(t-1)

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

Введите науку о данных

У нас есть проблема с наукой о данных, а не проблема с производительностью! Мы хотим определить любые тесные метрики временных рядов. Мы хотим видеть прошлые вводящие в заблуждение тенденции. Чтобы решить эту проблему, мы будем использовать следующие инструменты:

  • Google colab , общая среда ноутбука
  • Общие библиотеки Data Science Python, такие как Панды и Scipy
  • Данные о производительности, собранные из Разведчик , продукт мониторинга производительности приложения (APM). Регистрация Для бесплатной пробной версии, если у вас еще нет учетной записи.

Я пойду через Общий ноутбук в Google Colab Анкет Вы можете легко сохранить копию этого ноутбука, ввести свои метрики от Scout и определить наиболее значимые корреляции в вашем приложении Django.

Шаг 1: Посмотреть приложение в скауте

Я вхожу в систему в Scout и вижу следующую обзорную диаграмму:

Время, проведенное в запросах SQL, значительно подскочило с 19:00 до 9:20 вечера. Почему? Это страшно, так как почти каждый вид касается базы данных!

Шаг 2: данные временных рядов загрузки в пандах

Для начала я хочу искать корреляции между слоями (например: SQL, MongoDB, View) и средним временем отклика приложения Django. Слои меньше (10), чем просмотров (150+), так что это более простое место для начала. Я возьму данные этого временного ряда от Scout и инициализацию DataFrame Pandas. Я оставлю эти данные о споре в ноутбуке Анкет

После загрузки данных в DataFrame Pandas мы можем Построить эти слои :

Шаг 3: Корреляции слоя

Теперь давайте посмотрим, связаны ли какие -либо слои с общим средним временем ответа приложения Django. Прежде чем сравнивать каждый временной ряд слоев со временем отклика, мы хотим рассчитать первое различие каждого временного ряда. С пандами мы можем сделать это очень легко через diff () Функция:

df.diff()

После расчета первой разницы мы сможем найти корреляции Между каждым временем через corr () функция Корреляционное значение колеблется от -1 до +1, где ± 1 указывает на максимально сильное согласие и 0 наиболее сильнее возможное разногласия.

Мой блокнот генерирует Следующий результат :

SQL По -видимому, коррелирует с общим временем отклика приложения Django. Безусловно, давайте определим коэффициент Пирсона P-значение. Низкое значение (<0,05) указывает на то, что общее время отклика весьма вероятно коррелировать с слоем SQL:

df_diff = df.diff().dropna()
p_value = scipy.stats.pearsonr(df_diff.total.values, df_diff[top_layer_correl].values)[1]
print("first order series p-value:", p_value)

P-значение просто 1.1E-54 . Я очень уверен, что медленные запросы SQL связаны с общим медленным приложением Django. Это всегда база данных, верно?

Слои – это всего лишь одно измерение, которое мы должны оценить. Другой – время отклика взглядов Джанго.

Шаг 4: промыть+повтор для джанго просмотра времени отклика

Общее время отклика приложения может увеличиться, если представление начнет реагировать медленно. Мы можем видеть, происходит ли это, ища корреляции в нашем времени отклика по сравнению с общим временем отклика приложения. Мы используем тот же процесс, что и мы использовали для слоев, просто заменяя слои для данных временных рядов из каждого из наших взглядов в приложении Django:

После расчета первого различия в каждой серии, приложения/данные Похоже, коррелирует с общим временем отклика приложения. С p-значением Just 1.64E-46 , приложения/данные Скорее всего, будет коррелировать с общим временем отклика приложения.

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

Шаг 5: промыть+повтор для просмотра просмотра Django

Мало использованный, дорогой взгляд может повредить общему времени отклика приложения, если пропускная способность внезапно увеличится. Например, это может произойти, если пользователь пишет сценарий, который быстро перезагружает дорогостоящий представление. Чтобы определить корреляции, мы будем использовать тот же процесс, что и раньше, просто замените данные временных рядов пропускной способности для каждого представления Django:

Конечные точки/Sparkline Похоже, имеет небольшую корреляцию. P-значение 0,004 , что означает, что есть шанс 4 на 1000, что там не Корреляция между трафиком с Конечные точки/Sparkline и общее время отклика приложения. Итак, кажется, что трафик к Конечные точки/Sparkline Просмотреть триггеры медленнее общее время отклика приложения, но это менее точно, чем два других наших теста.

Вывод

Используя Data Science, мы смогли разобраться в гораздо больше метрик временных рядов, чем мы когда -либо могли с интуицией. Мы также смогли сделать наши расчеты без вводящих в заблуждение тенденций, заманивая воды.

Мы знаем, что наше время ответа на приложение Django:

  • сильно коррелировал с производительностью нашей базы данных SQL.
  • сильно связан с временем ответа нашего приложения/данные Посмотреть.
  • коррелирует с Конечные точки/Sparkline движение. Хотя мы уверены в этой корреляции, учитывая низкое значение p, оно не так сильное, как две предыдущие корреляции.

Теперь пришло время для инженера! С этими пониманиями в руках я:

  • Изучите, влияет ли на сервер базы данных что -то вне приложения. Например, если у нас есть только один сервер базы данных, процесс резервного копирования может замедлить все запросы.
  • Исследовать, если состав запросов в приложения/данные Вид изменился. Например, начал ли клиент с большим количеством данных, который больше нажимает на этот представление? Разведчика Trace Explorer может помочь исследовать эти высокомерные данные.
  • Держите исследование производительности Конечные точки/Sparkline Поскольку его корреляция с общим временем отклика приложения не было таким сильным.

Важно понимать, когда весь этот с трудом заработанный опыт не работает. Мой мозг просто не может проанализировать тысячи данных временных рядов так, как могут наши инструменты науки данных. Это нормально, чтобы достичь другого инструмента.

Если вы хотите пройти эту проблему самостоятельно, проверьте мой общий ноутбук Google Colab Я использовал при исследовании этой проблемы. Просто импортируйте свои собственные данные из Разведчик В следующий раз, когда у вас возникнет проблема с производительностью, и позвольте записной книжке сделать работу за вас!

Оригинал: “https://dev.to/scoutapm/is-your-django-app-slow-think-like-a-data-scientist-not-an-engineer-5bnb”