Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Дмитрий Жильцов (Lamoda) - Профилирование приложений Python в реальном времени

Дмитрий Жильцов (Lamoda) - Профилирование приложений Python в реальном времени

Доклад с Moscow Python Conf 2016 (http://conf.python.ru)
Видео: https://conf.python.ru/profilirovanie-prilozhenij-python-v-realnom-vremeni/

Я в разработке уже 8 лет, прошел тернистый путь от патчеписательства на Assembler под мобильные платформы DB2010/2020 до руководителя группы разработки Python. 5 лет занимаюсь созданием Web-приложений и всего, что с ними связанно, и хочу поделится опытом в профилировании приложений в реальном времени. В докладе я не буду говорить об инструментах профилирования кода (о таких как hotshot или cProfile), а расскажу как замерять производительность отдельных участков приложения в реальном времени и увидеть в каких местах необходимо оптимизировать процесс.
Я уверен, что разработчику всегда хочется видеть реальную картину производительности не только отдельных сервисов, но и отдельных частей и кусков кода этих систем, особенно в условиях динамичной разработки высоконагруженных сервисов. Здесь не обойтись только одной классической системой мониторинга.
Для выявления проблемных программных модулей проекта и замера их производительности необходим профайлинг приложений в реальном времени. И тут возникает куча вопросов и нюансов, я расскажу подробнее про:
- Для чего в принципе необходим профайлинг в реальном времени.
- Как реализовать свой профайлинг Python приложения, не привязываясь к коду проекта и вендорным решениям?
- Какие метрики необходимо снимать, что бы они имели ценность?
- Как визуализировать снятые метрики?
- Какую ценность предоставляет профайлинг бизнес заказчикам?

Moscow Python Meetup

October 12, 2016
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. Что должна уметь система профилирования в реальном времени Сбор метрик

    Минимум изменений Сквозное профилирован ие Инфраструктур ные метрики
  2. Что должна уметь система профилирования в реальном времени Хранение метрик

    Визуализация Динамическое управление Система профайлов
  3. П о ч е м у н е п о

    д х о д я т г о т о в ы е р е ш е н и я ? Дорого Данные в разных местах Нет динамического управления Нет профилей
  4. Почему обычные методы не подходят? from functools import wraps
 from

    time import time 
 
 def timing(f): 
 @wraps(f) 
 def wrap(*args, **kw): 
 ts = time() 
 result = f(*args, **kw) 
 te = time() 
 prof_log.info 'func:%r args:[%r, %r] took: %2.4f sec' % \ 
 (f.__name__, args, kw, te-ts)) return result return wrap • Нет расширяемости • Нет стека вызова • Грязный замер • Код необходимо вставлять везде
  5. Transaction • Хранение StackTree • Принятие решения о профилировании •

    Сохранение и публикация полученных данных • Подсчет статистики (кол-во StackItem в StackTree)
  6. FunctionTrace with FunctionTrace(transaction, _name, group, label, params): return wrapped(*args, **kwargs)

    • __enter__ в момент входа создает StackItem уведомляет Transaction, start_time • __exit__ в момент выхода берет end_time exclusive += duration, уведомляет Transaction, создает StackItem, вызывет process_child • process_child, добавляет себя в свое дерево, exclusive -= child.duration
  7. StackItem • Содержит информацию о себе и childs • Умеет

    серелизовать себя и childs в нужный формат • Реализован на Cython
  8. Как мы подключаем Django
 wsgi.py from lametric.tracer import init 


    if getattr(settings, 'LAMETRIC_ENABLE', False): 
 mercy = getattr(settings, 'LAMETRIC_MERCY', 0) 
 config = dict(app_name=getattr(settings, APPNAME'), prefix=getattr(settings, 'LM_PREFIX'), country=getattr(settings, 'COUNTRY'), mercy=mercy) init(**config)
  9. Mercy Mod 1.Включить/Выключить трассировку(monkey patching остается) 2.Публикация данных в отдельном

    потоке или в основном 3.Работает на одном воркере или сразу на всех(uWSGI specified) 4.Комбинация из п2 и п3
  10. Профайлинг в реальном времени необходим Контроль в реальном времени Проще

    разбор полетов Обнаружение bottleneck Прокачка скилов