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

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

Дмитрий Жильцов (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 приложения, не привязываясь к коду проекта и вендорным решениям?
- Какие метрики необходимо снимать, что бы они имели ценность?
- Как визуализировать снятые метрики?
- Какую ценность предоставляет профайлинг бизнес заказчикам?

Avatar for Moscow Python Meetup

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 Прокачка скилов