Как получить разбивку по продолжительности функции в го (профилирование)

Я пытаюсь профилировать сервер на основе go martini, который я написал, я хочу профилировать один запрос и получить полную разбивку функции с их продолжительностью выполнения. Я пытался поиграть с обоими runtime/pprof а также net/http/pprof но вывод выглядит так:

Total: 3 samples
       1  33.3%  33.3%        1  33.3% ExternalCode
       1  33.3%  66.7%        1  33.3% runtime.futex
       1  33.3% 100.0%        2  66.7% syscall.Syscall

Веб-просмотр также не очень полезен.

Мы регулярно профилируем другую программу, и мне кажется, что мне нужен результат:

20ms of 20ms total (  100%)
      flat  flat%  sum%        cum  cum%
      10ms 50.00% 50.00%     10ms 50.00%  runtime.duffcopy
      10ms 50.00%   100%     10ms 50.00%  runtime.fastrand1
         0     0%   100%     20ms   100%  main.func·004
         0     0%   100%     20ms   100%  main.pruneAlerts
         0     0%   100%     20ms   100%  runtime.memclr

Я не могу сказать, откуда разница.

1 ответ

Решение

pprof это профилировщик выборки на основе таймера, первоначально из набора gperftools. Позже Рус Кокс портировал инструменты pprof на Go: http://research.swtch.com/pprof.

Этот профилировщик на основе таймера работает с использованием системного таймера профилирования и записи статистики всякий раз, когда он получает SIGPROF, На ходу это в настоящее время установлено постоянным 100 Гц. С pprof.go:

// The runtime routines allow a variable profiling rate,
// but in practice operating systems cannot trigger signals
// at more than about 500 Hz, and our processing of the
// signal is not cheap (mostly getting the stack trace).
// 100 Hz is a reasonable choice: it is frequent enough to
// produce useful data, rare enough not to bog down the
// system, and a nice round number to make it easy to
// convert sample counts to seconds.  Instead of requiring
// each client to specify the frequency, we hard code it.
const hz = 100

Вы можете установить эту частоту, позвонив runtime.SetCPUProfileRate и писать вывод профиля самостоятельно, и Gperftools позволяет вам установить эту частоту с CPUPROFILE_FREQUENCY, но на практике это не так полезно.

Чтобы попробовать программу, она должна делать то, что вы пытаетесь измерить все время. Выборка в режиме ожидания не показывает ничего полезного. Обычно вы выполняете код, который вы хотите, в тесте или в "горячем цикле", используя как можно больше процессорного времени. После накопления достаточного количества сэмплов во всех функциях должно быть достаточное количество, чтобы пропорционально показать вам, сколько времени затрачивается на каждую функцию.

Смотрите также:

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