Как получить разбивку по продолжительности функции в го (профилирование)
Я пытаюсь профилировать сервер на основе 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
, но на практике это не так полезно.
Чтобы попробовать программу, она должна делать то, что вы пытаетесь измерить все время. Выборка в режиме ожидания не показывает ничего полезного. Обычно вы выполняете код, который вы хотите, в тесте или в "горячем цикле", используя как можно больше процессорного времени. После накопления достаточного количества сэмплов во всех функциях должно быть достаточное количество, чтобы пропорционально показать вам, сколько времени затрачивается на каждую функцию.
Смотрите также: