Что такое статистическое профилирование? Инструмент Tachyon строит картину поведения программы, периодически снимая снапшоты стека вызовов. Вместо того чтобы приборировать каждый вызов функций, как это делают детерминированные профилографы, Tachyon считывает стек регулярно и записывает выполняемый код. В основе метода лежит простая идея: функции, потребляющие много CPU, будут часто встречаться в выборках. Собрав тысячи образцов, инструмент формирует точную статистику того, куда уходит время. Чем больше выборка, тем точнее оценка. Отображаемые в выводе Tachyon значения времени — это оценки на основе подсчёта появления функций в выборках, умноженного на интервал выборки. Например, при частоте 10 кГц за 10 секунд собирается около 100 000 образцов. Если функция появляется в 5 000 из них, она считается ответственной за 5% времени или около 500 миллисекунд. Это статистика, а не прямое измерение, поэтому точность зависит от количества выборки. С 100 000 образцов ошибка составит около ±0.5%, а при 1 000 образках диапазон может расшириться от 3% до 7%. Это значит, что более длительные профили с высокой частотой выборают надежнее. Из-за статистической природы результаты будут немного отличаться при каждом запуске: значение 12% в одном эксперименте может стать 11% или 13% в другом. Это нормально, поэтому стоит смотреть на общую картину, а не на малые вариации.
Статистическая выборка не подходит для всех сценариев. Если скрипт работает меньше секунды, профилограф может не успеть собрать данные. Используйте profiling.tracing для точного подсчёта вызовов или запускайте скрипт в цикле. В отличие от tracing, который приборует код и останавливает процесс на каждом шаге, Tachyon наблюдает программу снаружи, не модифицируя её выполнение. Это позволяет профилировать работающий сервер без его перезагрузки. Команда run запускает скрипт и собирает данные, а attach подключается к уже запущенному процессу по PID, что идеально для решения проблем в продакшене. Команда dump выводит единый снапшот стека, похожий на трейсбэк, и полезна для проверки того, чем занят процесс прямо сейчас. Опции dump включают --all-threads для вывода всех потоков, --native для добавления фреймов для нативного кода и --opcodes для указания инструкций байткода.
Tachyon также поддерживает конвертацию бинарных профилей в другие форматы через replay. При профилировании в продакшене инструмент не накладывает заметной нагрузки на цель, если правильно настроить интервал. По умолчанию интервал составляет 100 микросекунд, что может вызывать замедление при высокой нагрузке. Режим блокирующей выборки (--blocking) полезен только при обнаружении неустойчивых стеков в профилях, особенно в коде с генераторами или корутинами. Для большинства приложений стандартный неблокирующий режим обеспечивает точные результаты без влияния на процесс. Профилограф может добавлять искусственные фреймы для предоставления дополнительного контекста о том, что делает интерпретатор в момент выборки. Опция --native добавляет фреймы , чтобы указать, когда Python вызвал код на C (расширенные модули, встроенные функции или сам интерпретатор). Это помогает отличить время, потраченное на Python, от времени в нативных библиотеках. Без этой опции выполнение нативного кода выглядит как время в функции Python, которая сделала вызов. По умолчанию профилограф включает фреймы при активности сбора мусора. Опция --no-gc отключает их. Если вы видите значительное время в фреймах , стоит изучить паттерны распределения памяти или использовать пулы объектов.
Профилирование на уровне опкодов (--opcodes) включает инструкцию-уровень и показывает, какие инструкции байткода выполняются при каждой выборке. Это позволяет увидеть адаптивную специализацию: например, когда универсальная инструкция LOAD_ATTR превращается в более эффективную LOAD_ATTR_INSTANCE_VALUE. Данные об опкодах доступны в нескольких форматах: flamegraphs (при наведении мыши), heatmaps (раскрываемые панели инструкций), live mode (панель статистики) и gecko format (переходы опкодов как маркеры интервалов). Это особенно полезно для понимания влияния адаптивной специализации, выявления горячих инструкций байткода и отладки проблем на уровне инструкций. Опция --opcodes совместима с --live, --flamegraph, --heatmap и --gecko, но требует дополнительной памяти и может слегка снизить производительность выборки.
Опция --realtime-stats отображает статистику скорости выборки во время профилирования, помогая проверить, что инструмент успевает собирать данные. Если фактическая скорость ниже запрошенной, это может указовать на высокую нагрузку системы или слишком агрессивный интервал. Опция --subprocesses автоматически профилирует подпроцессы, создавая отдельные файлы для каждого ребенка. Детектирование работает путем периодического сканирования новых потомков процесса и проверки, является ли новый процесс Python-приложением. Не-Python подпроцессы (команды оболочки или внешние инструменты) игнорируются. Существует ограничение в 100 одновременных профилографов подпроцессов, чтобы предотвратить истощение ресурсов. Опция --subprocesses несовместима с --live mode, так как интерактивный терминальный интерфейс не может вместить несколько одновременных отображений.
Метрики эффективности выборки (%) помогают оценить качество собранных данных. Низкая эффективность может указывать на то, что профилограф не успевает за запрошенной частотой выборки, часто из-за нагрузки системы или слишком агрессивного интервала. Пропущенные выборки — это процент ожидаемых выбор, которые не были собраны. Малый процент пропущенных выбор нормален и незначительно влияет на статистическую точность профиля. Профилограф сообщает фактическое количество собранных выбор, которое можно использовать для оценки достаточности данных.
Профилограф поддерживает четыре режима, контролируемые флагом --mode: wall (по умолчанию), cpu, gil и exception. Режим wall регистрирует все выборки независимо от состояния потока, что идеально для понимания общего распределения времени. Режим cpu записывает выборки только при выполнении на ядре CPU, фильтруя время ожидания I/O. Сравнивая профили wall-clock и CPU, можно определить, является ли функция вычислительно сложной или ограничена I/O. Режим gil записывает выборки только при удержании глобальной блокирующей примитивой (GIL), помогая выявить функции, монополизирующие интерпретатор. Режим exception записывает выборки только при активном исключении, что полезно для понимания, сколько времени тратится на обработку ошибок, особенно в коде, использующем исключения для управления потоком.
Выходные данные доступны в нескольких форматах: pstats (таблица с цветовым кодированием), flamegraph (визуализация в виде дерева), heatmap (интерактивная карта) и gecko format (для Firefox Profiler). Опции пистов позволяют сортировать результаты, ограничивать количество записей и отключить сводные таблицы.