Как работает gperftools под капотом?
Я ищу простое объяснение того, как работает gperftools. Итак, вот что я узнал:
- Он запускает сэмплер "Останови мир". Другими словами, он периодически останавливает профилирование программы для сбора информации.
- Библиотека pprof Голанга использует внизу gperftools.
Помимо общего обзора, вот некоторые конкретные вопросы, на которые я бы хотел ответить:
- Является ли gperftools " профилировщиком на основе событий" или " профилировщиком инструментов". Из того, что я понимаю, эти профилировщики изменяют способ работы программы и собирают образцы с помощью этих модификаций.
- На каком "уровне" в ОС работает профиль gperftools? Профилирует ли он кернал как SystemTap или perf?
- Безопасно ли запускать gperftools на высокопроизводительном сервере?
Я задаю этот вопрос в качестве причины накладных расходов, связанных с использованием pprof на сервере Go.
1 ответ
Это профилировщик выборки.
По сути, существует два типа профилирования: либо вы отслеживаете все, что делает программа (ведение счета каждого вызова, завершение каждой функции в таймере, иными словами, пропитывание кода вашими инструментами), либо вы позволяете запустить его самому. но просто кратко проверьте это время от времени (взятие образцов).
Проблема с инструментарием в том, что он меняет способ работы программы. Это замедляет программу, что также искажает результаты. (Например, рабочий код может тратить слишком много времени на ожидание ввода-вывода, но инструментальный код может не демонстрировать это.) Он также собирает гораздо больше данных, чем статистически необходимо (если в конечном итоге все, что вам нужно, - это определить, где больше всего времени провел).
Запустив strace, вы увидите, что Google-perftools работает с использованием сигналов SIGPROF (как и HPCToolkit и Open|SpeedShop). Предположительно, он просто устанавливает обработчик событий, затем задерживается в памяти, не потребляя циклов ЦП, пока аппаратное обеспечение / ОС не прерывает вашу программу (что может быть так редко, как вам нравится), а затем, предположительно, просто сохраняет копию стека вызовов. (и планирует следующее прерывание), прежде чем позволить элементу управления вернуться в вашу программу. В стеке вызовов указывается, до какой функции работала ваша программа (и какая родительская функция вызывала ее и т. Д., Как работают операторы return).