Документация

Документация/Продакшен

Profiler: профилирование

Как снять профиль сервиса под нагрузкой, найти горячие места и сравнить профили «до» и «после». Если агент говорит «стало быстрее», он должен подкрепить это таким сравнением.

Profiler снимает профиль сервиса или программы под нагрузкой и показывает, на что уходят время процессора и память: в сводке словами, на flame graph и в сравнении двух профилей. На flame graph каждая полоса — функция, а ширина полосы — доля этой функции в профиле.

Своего профилировщика у Profiler нет: измеряет профилировщик того языка или платформы, на которой работает ваш сервис. Модуль запускает его и приводит результат к общему виду. Какой это профилировщик и что для него установить, смотрите в таблице «Что поддерживается» ниже.

Главное делает агент. С модулем «Profiler» он сам проходит цикл «профиль → горячее место → правка → профиль → сравнение». Просто сказать «стало быстрее» агент не может: для этого нужно сравнение профилей.

Как включить

  1. Откройте «Настройки → Модули» и включите «Profiler». Настраивать ничего не нужно.
  2. Изменение действует в новых чатах.

Вид «Profiler» открывается из полосы заголовка («Другие инструменты» → «Profiler») или слэш-командой /profile. Вид работает даже без модуля и не тратит токенов. Его можно открепить в отдельное окно.

Что поддерживается

Язык или платформаЧем измеряетсяЧто установить
Gonet/http/pprof сервисаничего; сервис должен отдавать pprof
Node.js, Bunпрофилировщик V8ничего; процесс запускает сам модуль
Pythonpy-spypy-spy
JVMasync-profiler, иначе Flight RecorderJDK с jcmd и jfr или asprof
C, C++, RustLinux — perf, macOS — sampleLinux — perf; нужна отладочная информация
Страница в браузерепрофилировщик V8 в браузере без окнаChrome, Chromium, Яндекс Браузер или Edge
Любая программапрограмма сама пишет профиль в файл—

Время процессора измеряется везде. Память — у Go, Node.js и Bun, у JVM — выделения памяти, а у Python, нативного кода и браузера — только процессор. Если нужной программы нет, модуль скажет, чего не хватает и как это поставить.

То, что профилируют, называется целью (команда запуска сервиса, адрес готовности, адрес pprof или страницы), а нагрузка — сценарием. Сценарием может быть встроенный генератор HTTP-запросов, повторяемая команда или скрипт для страницы. У генератора по умолчанию 8 клиентов, он считает запросы, ошибки и p50/p95/p99 времени ответа. Перед записью модуль прогревает сервис. Запись длится от 1 до 600 секунд, по умолчанию 10. Сервис, запущенный профилировщиком, учётных данных DevMachine не получает.

Как пользоваться

  1. Попросите агента: «Ускорь обработку /orders». Агент снимет профиль «до», найдёт горячие места, поправит код, снимет профиль «после» и сравнит. Цель и сценарий он сохранит при первом удачном запуске.
  2. В виде «Profiler» слева — форма «Снять профиль»: «Цель», «Сценарий» и длительность 5, 10, 30 или 60 секунд. Сами вы можете профилировать цели, которые уже сохранил агент: в списках «Цель» и «Сценарий» есть только сохранённые цели и сценарии, а завести новую цель в форме нельзя. Пока сохранённых целей нет, вместо формы стоит подсказка. Первую цель агент сохраняет сам, когда впервые снимает профиль. Кнопка формы снимает профиль процессора.
  3. Ниже формы — список профилей. Выберите профиль, и справа появится сводка «На что уходит» — до пяти строк вроде «32 % времени CPU уходит на сериализацию JSON в …». «Потолок выигрыша» — доля этой траты в профиле: столько самое большее можно выиграть, если убрать трату целиком.
  4. Включите «Flame» или «Icicle». «Flame» рисует вызывающие функции внизу, а самые горячие — наверху; «Icicle» показывает ту же картину вверх ногами. Щелчок выбирает функцию, двойной щелчок приближает, «Весь профиль» сбрасывает приближение. Поиск «Функция или файл» показывает, какая доля профиля приходится на найденное. Чтобы убрать библиотеки, выберите «Показывать» → «Только код проекта».
  5. В карточке функции есть «Открыть файл:строка». Там же видно, кто менял функцию последним: агент и его сессия или последний коммит. Сессия — это чат, в котором работал агент.
  6. Чтобы сравнить, выберите профиль в «Сравнить с». Вердикт будет один из трёх: «Стало дешевле», «Стало дороже» или «Без изменений». Под ним — функции, которые подорожали и подешевели. Рост подсвечен красным, снижение — зелёным.

Как читать сравнение

  • Если оба прогона посчитали операции (HTTP-сценарий или команда с числом операций), сравнивается стоимость одной операции. Иначе сравниваются суммы; если записи разной длины, появится предупреждение.
  • Разница меньше 3 % — «Без изменений». Если профили одного и того же кода раньше расходились сильнее, порог поднимается до этого шума.
  • Два профиля одного и того же кода всегда дают «Без изменений».
  • Предупреждения говорят, когда сравнению верить нельзя: профили измеряют разное, сняты с разных целей или часть запросов завершилась ошибкой.

Что может агент

Агент снимает профиль, находит горячие места и сравнивает два профиля. Перед тем как запустить сервис или команду нагрузки, он спрашивает разрешения так же, как перед любой командой в терминале: по правилам вашего режима.

Правило: ускорение — только с профилями до и после

Когда модуль включён, каждое заявление агента об ускорении («в 6 раз быстрее», «1322 → 8248 ops/s») получает пометку:

  • ✓ Проверено профилями: … — в этой сессии есть сравнение с улучшением, и профиль «после» снят после последней правки;
  • ⚠ Не проверено: заявление об ускорении не подкреплено сравнением профилей «до» и «после»;
  • ⚠ Не проверено: код менялся после последнего сравнения профилей;
  • ⚠ Не подтверждается профилями: … — сравнение улучшения не показывает.

Если такое заявление попадает в сообщение коммита или в текст запроса на слияние, от агента требуют его подкрепить или убрать. Пометка ничего не блокирует, но говорит, можно ли верить цифре. Она учитывает только сравнение, которое агент сделал сам в том же чате, а ваше сравнение в виде «Profiler» не считается. Если вы сравнили профили сами, попросите агента сравнить те же профили — тогда пометка учтёт его сравнение.

Ограничения

  • macOS: sample измеряет нативный код приближённо; py-spy требует прав суперпользователя.
  • Linux: для perf может понадобиться kernel.perf_event_paranoid=1, для py-spy при ограниченном ptrace — kernel.yama.ptrace_scope=0.
  • Windows: C, C++ и Rust не поддерживаются.
  • Проект на сервере по SSH: сервис, профилировщик и профили — на сервере.
  • На каждый проект хранится до 200 профилей, старые удаляются. Всё, что запущено для профилирования, останавливается после прогона и при аварийной остановке.

Какие данные куда уходят

Профили хранятся на этом компьютере, вне проекта. Модуль ходит только к вашим целям и ничего не отправляет на серверы DevMachine. Результаты, которые читает агент, — это имена функций, пути файлов в проекте и числа. Они становятся частью запроса к модели и идут к ней через сервер DevMachine; маскировать в них модулю нечего. Подробнее — на странице «Данные и приватность».

Что дальше

Обновлено · Нашли неточность? Напишите на support@devmachine.ai или в Telegram.