Перейти профилировщик (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 умножает известный период выборки на количество выборок. И оно должно быть достаточно точным по отношению к общему времени, затраченному процессами (система + пользователь).

Есть ли вероятность, что ваша программа порождает какую-то работу через подпроцессы? Это может быть одним из способов объяснить разницу.

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