Как работает gperftools под капотом?

Я ищу простое объяснение того, как работает gperftools. Итак, вот что я узнал:

  • Он запускает сэмплер "Останови мир". Другими словами, он периодически останавливает профилирование программы для сбора информации.
  • Библиотека pprof Голанга использует внизу gperftools.

Помимо общего обзора, вот некоторые конкретные вопросы, на которые я бы хотел ответить:

  • Является ли gperftools " профилировщиком на основе событий" или " профилировщиком инструментов". Из того, что я понимаю, эти профилировщики изменяют способ работы программы и собирают образцы с помощью этих модификаций.
  • На каком "уровне" в ОС работает профиль gperftools? Профилирует ли он кернал как SystemTap или perf?
  • Безопасно ли запускать gperftools на высокопроизводительном сервере?

Я задаю этот вопрос в качестве причины накладных расходов, связанных с использованием pprof на сервере Go.

1 ответ

Решение

Это профилировщик выборки.

По сути, существует два типа профилирования: либо вы отслеживаете все, что делает программа (ведение счета каждого вызова, завершение каждой функции в таймере, иными словами, пропитывание кода вашими инструментами), либо вы позволяете запустить его самому. но просто кратко проверьте это время от времени (взятие образцов).

Проблема с инструментарием в том, что он меняет способ работы программы. Это замедляет программу, что также искажает результаты. (Например, рабочий код может тратить слишком много времени на ожидание ввода-вывода, но инструментальный код может не демонстрировать это.) Он также собирает гораздо больше данных, чем статистически необходимо (если в конечном итоге все, что вам нужно, - это определить, где больше всего времени провел).

Запустив strace, вы увидите, что Google-perftools работает с использованием сигналов SIGPROF (как и HPCToolkit и Open|SpeedShop). Предположительно, он просто устанавливает обработчик событий, затем задерживается в памяти, не потребляя циклов ЦП, пока аппаратное обеспечение / ОС не прерывает вашу программу (что может быть так редко, как вам нравится), а затем, предположительно, просто сохраняет копию стека вызовов. (и планирует следующее прерывание), прежде чем позволить элементу управления вернуться в вашу программу. В стеке вызовов указывается, до какой функции работала ваша программа (и какая родительская функция вызывала ее и т. Д., Как работают операторы return).

Другие вопросы по тегам