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
PRO

October 12, 2016
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. Профилирование приложений Python в реальном
    времени
    Дмитрий Жильцов
    lamoda.ru

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  5. Почему обычные методы не подходят?
    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
    • Нет расширяемости
    • Нет стека вызова
    • Грязный замер
    • Код необходимо вставлять везде

    View Slide

  6. View Slide

  7. Ошибки версии 1.0
    Медленный
    bootstrap
    Perfomance Нет сквозного
    профилирован
    ия

    View Slide

  8. Wrapt
    def instrument_redis_connection(module):
    wrap_function_wrapper(module, ‘Connection.send_command’,
    conn_send_command_wrapper_)


    def patch():
    wrapt.register_post_import_hook(instrument_redis_connection,
    'redis.connection')

    View Slide

  9. Версия 2.0

    View Slide

  10. Transaction

    View Slide

  11. Transaction
    • Хранение StackTree
    • Принятие решения о профилировании
    • Сохранение и публикация полученных
    данных
    • Подсчет статистики (кол-во StackItem в
    StackTree)

    View Slide

  12. 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

    View Slide

  13. StackItem
    • Содержит информацию о себе и childs
    • Умеет серелизовать себя и childs в нужный
    формат
    • Реализован на Cython

    View Slide

  14. Как мы подключаем 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)

    View Slide

  15. Overhead
    Профайлы
    Активация на
    части серверов
    Mercy Mod

    View Slide

  16. Профайлы
    •Заранее определенные планы траcсировки (модули, функции)
    •Переключаются в рантайме по возможности
    •Требуют перезагрузки для чистоты данных

    View Slide

  17. Mercy Mod
    1.Включить/Выключить трассировку(monkey patching остается)
    2.Публикация данных в отдельном потоке или в основном
    3.Работает на одном воркере или сразу на всех(uWSGI specified)
    4.Комбинация из п2 и п3

    View Slide

  18. Сбор метрик
    Syslog HTTP
    Statsd
    (OkMeter,
    Telegraf)

    View Slide

  19. Визуализация
    DIY
    Okmeter
    Grafana

    View Slide

  20. View Slide

  21. View Slide

  22. View Slide

  23. View Slide

  24. View Slide

  25. View Slide

  26. На что тратили время на рефакторинге?
    -50ms +50ms 0ms

    View Slide

  27. Профайлинг в реальном времени необходим
    Контроль в
    реальном
    времени
    Проще разбор
    полетов
    Обнаружение
    bottleneck
    Прокачка
    скилов

    View Slide

  28. Ссылки
    • https://www.python.org/dev/peps/pep-0369/
    • http://blog.dscpl.com.au/
    • https://pypi.python.org/pypi/wrapt
    • https://okmeter.io

    View Slide

  29. С п а с и б о
    e-mail
    github.com
    [email protected]
    https://github.com/zaabjuda

    View Slide