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

Быстро найти и исправить проблемы с производительностью, объединив информацию о производительности, отладке и трассировке

Наиболее эффективный способ улучшить производительность кода – создать локальную среду разработчика, которая … помеченная Python, WebDev, Performance, CodeQuality.

Карты кода для улучшения производительности (2 серии деталей)

Наиболее эффективный способ улучшить производительность кода – создать локальную среду разработки, которая подчеркивает ее. Как только вы сможете воспроизвести проблему производительности локально, вы можете использовать все свои инструменты и трюки для решения этой проблемы. Избегание догадков и использования мощности современных редакторов и инструментов кода помогает вам сократить время для ремонта (MTTR) при реагировании на инцидент или билет.

Как только вы сможете собрать необходимые данные о производительности, это кардинальный грех, чтобы начать догадываться о том, где лежит проблема. Не думаю! Соберите данные о производительности вашего кода и используйте его. Основная причина, по которой мы Соблазненный избегать профилировщиков, это то, что у них есть (заслуженная) репутация за то, что они неуклюжи и трудно настроить. В последнее время я работал над способом сбора данных о производительности, которые просто настройки, и на сегодняшний день наш бесплатный инструмент с открытым исходным кодом Appmap сделай это. Appmaps всегда включали данные о времени – и теперь, пользовательский интерфейс Appmap показывает данные о производительности, когда вы открываете Appmap в вашем редакторе кода. Это наверняка сообщает, можете ли вы воспроизвести ошибку производительности локально – и вы можете просверлить дерево выполнения кода, чтобы найти горячие точки производительности. Вы также можете сравнить данные Appmap с сообщенной проблемой, чтобы убедиться, что вы можете определить и воспроизвести проблему производительности.

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

После того, как вы определите основную причину и сделаете свое исправление, сравнение данных AppMap до и после производительности позволяет подтвердить, что вы решаете проблему производительности (в дополнение к любым связанным тестовым случаям). Эти данные до и после того, как можно поделиться в посмертном порядке, чтобы сообщить проблему, привязанную к билету, который описывает исправление, и сохранено в базе знаний (чтобы помочь предотвратить проблему снова!)

Вот краткая демонстрация того, как быстро устранение неполадок и проверки решения проблемы производительности в популярном приложении Python. (К вашему сведению, мы немного изменили это приложение для демонстрационных целей). Если вы предпочитаете читать против Watch, написанная версия демонстрации следует.

Вопросы или отзывы? Мы хотели бы услышать от вас – протянуть руку в Раздор или Twitter !

Демонстрационная стенограмма

  • 00:02 Мое внимание привлекло внимание, что в нашем приложении сообщества списки прошлых встреч (которые недавно были добавлены новой членом команды) чувствуют себя в заметном меньше, чем визуализации будущих встреч, и быстрый взгляд на использование базы данных показывает быстрое увеличение запросов с тех пор, как Новая функция была введена.

  • 00:22 Я использую пользовательский тест, который усилит разницу в производительности между двумя случаями, моделируя извлечение и рендеринг 1000 встреч.

  • Чтобы наблюдать за поведением и измерить различия в производительности, я собираюсь использовать свободную и открытого исходного коэффициента Appmap Анкет

  • 00:39 Теперь позвольте мне запустить тест и записать поведение моего кода с помощью AppMap:

  • Это интересно, потому что будущие встречи взяли .16s В то время как прошлые встречи заняли гораздо больше времени, .42s .

  • 00:54 Давайте просверлимся и сравним потоки кода двух запросов.

  • Это приложение Django, и я вижу, что рендерер взял .14s для будущего и .40S Для прошлых встреч. Я также сразу понял, что у первого поток кода есть четырех детей против 1505 второго.

  • 01:15 Давайте посмотрим на первый поток, сначала.

Я вижу, что три команды SQL были выполнены для запроса на будущие встречи: в первых перечислениях все будущие встречи из таблицы, и две следующие команды SQL предварительно выбирают данные для всех будущих встреч из соответствующих таблиц.

  • 01:33 Давайте свернемся до второго потока, просьба просмотреть все прошлые встречи.

  • Вторая последовательность начинается с получения всех прошлых встреч. Далее следует, хотя очень отличается: ORM запускает три запроса для каждой прошлой встречи в базе данных – это 1500 поездок в общую сумму базы данных для 500 прошлых встреч, созданных в результате теста. Даже в моей среде разработчика без другой нагрузки базы данных разница в производительности между двумя шаблонами команды SQL довольно примечательна.

  • 02:02 Давайте посмотрим, что происходит в коде, который устанавливает объекты данных. Быстрый взгляд в реализации взгляда показывает, что в прошлом встречах не хватает SELECT_RELATED и prefetch_related Метод вызовы, вызывая наблюдаемую проблему N+1.

class FutureMeetingsAll(ListView):
    template_name = "meetings/future_meetings_all.html"
    queryset = Meeting.objects.filter(
        when__gt=datetime.datetime.now() - datetime.timedelta(hours=3)
    ).order_by("when").select_related("where").prefetch_related("topics", "meeting_sponsors")

class PastMeetingsAll(ListView):
    template_name = "meetings/past_meetings_all.html"
    queryset = Meeting.objects.filter(
        when__lt=datetime.datetime.now() - datetime.timedelta(hours=3)
    )
  • Обратите внимание, что, несмотря на очевидную проблему кода, тесты проходили ранее – функционально, существующий код работает – но он вызывает дополнительные затраты и риск и создает ненужную нагрузку на базу данных.

  • 02:34 Давайте снова запустим тест.

class PastMeetingsAll(ListView):
    template_name = "meetings/past_meetings_all.html"
    queryset = Meeting.objects.filter(
        when__lt=datetime.datetime.now() - datetime.timedelta(hours=3)
    ).order_by("when").select_related("where").prefetch_related("topics", "meeting_sponsors")
  • 02:50 И здесь мы видим, что с помощью исправления на месте количество запросов базы данных упало, и производительность прошлых собраний значительно улучшилось.

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

Карты кода для улучшения производительности (2 серии деталей)

Оригинал: “https://dev.to/appland/quickly-find-and-fix-performance-problems-using-open-source-interactive-code-maps-2f0h”