Перейти профилировщик (pprof) несоответствие времени
Когда я измеряю время выполнения моей программы Go с Linux time
утилита, я получаю следующий вывод:
real 1m9.177s
user 7m1.788s
sys 0m39.016s
Когда я смотрю на результат того же самого точного выполнения программы в профилировщике CPU pprof Go, я получаю следующий вывод:
Entering interactive mode (type "help" for commands)
(pprof) top
143.32s of 176s total (81.43%)
Откуда у pprof эта цифра 176-х? Это не время и не время процессора. Я запускаю эту программу с GOMAXPROCS
установить на 8, и я чувствую, что это как-то связано с этим. Как именно pprof измеряет время выполнения и почему он отличается от Linux? time
?
2 ответа
time
утилита и pprof
Инструмент работает по-разному и должен использоваться по-разному. Не пытайтесь их примирить. time
измеряет точное время для программы; pprof
измеряет относительное время для функций и методов. pprof
является навязчивой статистической выборкой. Когда профилирование ЦП включено, программа Go останавливается примерно 100 раз в секунду и записывает образец, состоящий из счетчиков программ, в стеке выполняемой в данный момент программы. Выборка имеет свою стоимость, а результаты представляют собой оценки фактической численности населения.
использование time
для измерения общего фактического времени процессора для программы, то есть абсолютного времени. использование pprof
оценить, где большая часть времени была потрачена на функции и методы, используя относительные проценты времени. pprof
определяет узкие места. Для фактического времени процессора используйте Go testing
тесты пакетов.
Например, см. Программы Profiling Go:
Используя инструменты профилирования Go для выявления и устранения определенных узких мест, мы можем заставить программу поиска циклов Go работать на порядок быстрее и использовать в 6 раз меньше памяти.
Это похоже на какую-то ошибку. Возможно, какая-то известная ошибка. Для вывода 176 с pprof умножает известный период выборки на количество выборок. И оно должно быть достаточно точным по отношению к общему времени, затраченному процессами (система + пользователь).
Есть ли вероятность, что ваша программа порождает какую-то работу через подпроцессы? Это может быть одним из способов объяснить разницу.