2015-06-17 3 views
5

Я ищу простое объяснение того, как работает gperftools. До сих пор это то, чему я научился:Как работает gperftools под капотом?

  • Он запускает пробник-стоп-мир. Другими словами, он периодически останавливает профилированную программу для сбора информации.
  • В библиотеке pprof Golang используется gperftools внизу.

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

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

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

ответ

4

Это пробоотборник для пробоотбора.

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

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

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

+0

+1 Это не очень хорошо понято, насколько на самом деле являются информативные образцы проб, особенно если отдельные исследованы. К сожалению, это отсутствие понимания приводит к общему предположению, что требуется большое количество из них, и поэтому их необходимо суммировать (в периоды самообеспечения, кумулятивного времени, графика вызовов, графики пламени и т. Д.). Это очень легко для больших ускорений, чтобы скрыть в этих резюме, но они не могут скрыться от программиста, просто рассматривая небольшое количество образцов. [* Примеры. *] (Http://stackoverflow.com/a/25870103/23771) –

+0

И SIGPROF генерируется интервальным таймером ['setitimer()') (http://man7.org/linux/man -pages/man2/setitimer.2.html) - https://github.com/gperftools/gperftools/blob/7822b5b0b9fa7e016e1f6b46ea86f26f4691a457/src/profile-handler.cc#L482 'setitimer (timer_type_, & timer, 0);' – osgx

Смежные вопросы