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

uWSGI в помощь метрикам

uWSGI в помощь метрикам

Наиль Хунафин (Яндекс) @ Moscow Python Meetup 66
"uWSGI — это многофункциональный сервер веб-приложений, а каждое современное приложение сопровождается метриками. Мы посмотрим, как возможности uWSGI способны помочь нам в сборе метрик".

Видео: http://www.moscowpython.ru/meetup/66/uwsgi-for-metrics/

Moscow Python Meetup
PRO

July 25, 2019
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. 1

    View Slide

  2. uWSGI в помощь метрикам
    Наиль Хунафин, разработчик в Яндекс.Коннекте

    View Slide

  3. О докладе
    73
    › о метриках
    › подходы к получению метрик
    › uWSGI + метрики
    › оптимизация

    View Slide

  4. Пару слов о метриках

    View Slide

  5. Пару слов о метриках
    75
    Человек пароход Приложение

    View Slide

  6. Польза метрик
    76
    › динамика системы
    › выход за нормальные значения
    › аномальное поведение
    › оповещение

    View Slide

  7. Показатели
    77
    › счетчик
    › единичное значение
    › гистограмма

    View Slide

  8. Примеры метрик для WEB-приложения
    78
    › количество запросов по ендпоинту API
    › время запроса в смежный сервис
    › коды ответов смежных сервисов
    › кэш hit/miss
    › распределение времен ответа API
    › время запроса в базу

    View Slide

  9. Сбор метрик

    View Slide

  10. Push
    710

    View Slide

  11. Pull
    711

    View Slide

  12. Логи
    712

    View Slide

  13. Наша инфраструктура
    713
    › своя система сбора метрик
    › стандартизованный ответ для pull ручки
    › внутренне облако
    › инеграция метрик и облака

    View Slide

  14. Наша инфраструктура
    714
    › пример ответа для pull схемы

    View Slide

  15. › оперативность
    › зависимости
    › универсальность
    Критерии сравнения
    715

    View Slide

  16. Сравнение
    716
    оперативность зависимости универсальность
    push
    pull
    logs

    View Slide

  17. Далее про Pull
    717
    › в памяти
    › в стороннем хранилище

    View Slide

  18. Варианты
    718
    локально в памяти
    › только если 1 процесс
    разделяемое хранилище
    › redis
    › memcached
    › DB
    › file

    View Slide

  19. uWSGI
    719
    uWSGI — веб-сервер и сервер веб-приложений,
    реализованный для запуска приложений Python через протокол WSGI.
    WSGI - стандарт взаимодействия между Python-программой,
    выполняющейся на стороне сервера, и самим веб-сервером (PEP 333).

    View Slide

  20. Яндекс.Танк
    720
    Инструмент для проведения нагрузочного тестирования.
    › использует высокопроизводительный асинхронный генератор
    › может генерировать десятки тысяч HTTP-запросов в секунду
    › встроенный мониторинг ресурсов тестируемого сервера
    › расширяется внешними модулями

    View Slide

  21. Эксперименты
    721

    View Slide

  22. 722
    Без метрик

    View Slide

  23. Без метрик
    723

    View Slide

  24. 724
    База данных (PostgreSQL + удаленно)

    View Slide

  25. База данных (PostgreSQL + удаленно)
    725

    View Slide

  26. 726
    Redis (локально + socket)

    View Slide

  27. Redis (локально + socket)
    727

    View Slide

  28. uWSGI
    728
    комбайн
    › mule
    › caching framework
    › cron
    › metrics subsystem
    › alerting
    › и т.д.

    View Slide

  29. uWSGI
    729
    metrics subsystem
    › metric_get(name)
    › metric_set(name, value)
    › metric_inc(name[, delta])
    › metric_dec(name[, delta])
    › metric_mul(name[, delta])
    › metric_div(name[, delta])

    View Slide

  30. uWSGI
    730
    metrics subsystem
    › metric_get(name)
    › metric_set(name, value)
    › metric_inc(name[, delta])
    › metric_dec(name[, delta])
    › metric_mul(name[, delta])
    › metric_div(name[, delta])
    › metric_all_metrics()

    View Slide

  31. uWSGI
    731
    cache subsystem
    › cache_inc(key[,amount=1,expires,cache])
    › cache_dec(key[,amount=1,expires,cache])
    › cache_keys([cache])
    › cache_get(key[,cache])
    › cache_set(key,value[,expires,cache])

    View Slide

  32. uWSGI
    732
    cache subsystem
    › быстрый
    › потокобезопасный
    › ключ-значение

    View Slide

  33. uWSGI cache
    733
    › длина ключа (2048 байт)
    › количество элементов (65 536 элементов)
    › ttl (0)

    View Slide

  34. 734
    uWSGI cache

    View Slide

  35. 735
    uWSGI cache

    View Slide

  36. 736
    Без метрик vs uWSGI
    uWSGI
    Без метрик

    View Slide

  37. Выбор
    737
    Скорость Зависимость RPS %
    database ~16 2.6
    redis ~110 18
    uWSGI ~580 95
    ~610 (100%) rps без метрик

    View Slide

  38. Наша реализация

    View Slide

  39. 739
    Код

    View Slide

  40. 740
    Код

    View Slide

  41. 741
    Код

    View Slide

  42. Наши графики
    742
    99 перцентиль времени доступа к кэшу

    View Slide

  43. Наши графики
    743
    Количество запросов внешнего сервиса в наше API (Календарь)

    View Slide

  44. Оптимизация

    View Slide

  45. Что же было не так
    745
    › росло число метрик
    › падение производительности
    › стали упираться в подсчет метрик

    View Slide

  46. Первая реализация
    746

    View Slide

  47. Что сделали
    747
    › увидели что основное время тратим на pickle
    › отказались от pickle
    › провели новые замеры
    › стало быстрее

    View Slide

  48. Вторая реализация
    748

    View Slide

  49. К чему это вот всё
    749
    › собирайте метрики
    › сравнивайте варианты
    › профилирование это хорошо

    View Slide

  50. Ссылки
    750
    Яндекс.Танк https://github.com/yandex/yandex-tank
    Профилировщик https://github.com/benfred/py-spy
    Про uWSGI https://events.yandex.ru/lib/talks/7550/

    View Slide

  51. Спасибо
    Наиль Хунафин
    Разработчик
    [email protected]
    @khunafin

    View Slide