https://github.com/yandex/perforator
Главные фичи:
> Efficient and high-quality collection of kernel + userspace stacks via eBPF
> Scalable storage for storing profiles and binaries
> Support of unwinding without frame pointers and debug symbols on host
> Convenient query language and UI to inspect CPU usage of applications via flamegraphs
> Support for C++, C, Go, and Rust, with experimental support for Java and Python
> Generation of sPGO profiles for building applications with Profile Guided Optimization (PGO) via AutoFDO
Но самое главное – у Perforator есть режим Continuous Profiling, где на сервак ставится агент, который передает информацию о производительности всех сервисов. На что тратит всего около 1% CPU.
Очень полезный и полный пост с анонсом на хабре.
Важное ограничение: пока работает только на x86_64 Linux, ARM поддержка планируется в ближайшем будущем.
Профилируем код на Python
Нас конечно же больше всего интересует, как данная штука умеет профилировать код на питоне.
Пока что работают только версии после 3.12, потому что нативная поддержка
perf появилась именно там: https://docs.python.org/3/howto/perf_profiling.html Смотрим доку, как профилировать питон: https://perforator.tech/docs/en/tutorials/python-profiling
Сначала собираем при помощи
docker в пару строк: https://perforator.tech/docs/en/guides/build#containerПрямо в примере в доке есть код, который будет работать неоптимально. Запустим его:
» python server.py
My pid is 53000
Serving on port 9007
И запускаем профилировщик:
sudo perforator record --pid $YOUR_PID --duration 1m --serve ":9006"На
http://localhost:9006 вас будет ждать flamegraph работы скрипта.Перед тем, как его смотреть, нагрузим наш сервак простейшим скриптом:
import requests
import random
while True:
user_id = random.randint(1, 1000000)
requests.get(f"http://localhost:9007/search_user?user_id={user_id}")
Получится вот такой замечательный flamegraph.
Но! Пример из документации не заканчивается просто созданием графика, пример показывает, как его анализировать. Что очень важно. Далее нам предлагают найти узкое место в коде: https://perforator.tech/docs/en/tutorials/python-profiling#optimizing-the-bottleneck
После оптимизации получится так. Потребление CPU упадет с 96% до 26%
Чего хочется?
- Хочется поддержки macos для локального профилирования
- Хочется попробовать в реальном проде :)
- Хочется понять, насколько такие данные помогут средней компании писать более производительные сервисы
Обсуждение: как у вас в компаниях дела с Continuous Profiling?
Про Perforator я узнал благодаря своему старому и доброму товарищу – Евгению Антонову, он ведет канал про важные навыки для тимлидов и два подкаста: КодаКода – про менеджмент и харды, "Три тимлида заходят в бар" – про разные тимлидские штуки, которые будут безусловно полезны для тех, кто решил развиваться в данную ветку карьеры. Советую!
Хотите рассказать про свой опенсорс проект? Пишите в наш чат :)
| Поддержать | YouTube | GitHub | Чат |