Как профилировать тесты с помощью инструмента pprof?

Я хочу профилировать свои тесты, сгенерированные go test -c, но go tool pprof нужен файл профиля, который обычно создается внутри основной функции, например это:

func main() {
    flag.Parse()
    if *cpuprofile != "" {
        f, err := os.Create(*cpuprofile)
        if err != nil {
            log.Fatal(err)
        }
        pprof.StartCPUProfile(f)
        defer pprof.StopCPUProfile()
    }

Как я могу создать файл профиля в своих тестах?


person Salah Eddine Taouririt    schedule 13.04.2014    source источник


Ответы (3)


Как описано в http://golang.org/cmd/go/#hdr-Description_of_testing_flags, вы можете указать файл профиля с использованием флага -cpuprofile.

Например

go test -cpuprofile cpu.out
person simon    schedule 13.04.2014
comment
дополнительная часть, которая сначала не была очевидна для меня, заключается в том, что для вас создается файл ‹package name›.test для передачи в pprof - person neonstalwart; 05.05.2015

Используйте флаг -cpuprofile для go test, как описано на странице http://golang.org/cmd/go/#hdr-Description_of_testing_flags

person Evan    schedule 13.04.2014

В этом посте объясняется, как профилировать тесты на примере: Профилирование тестов с помощью pprof .

Следующий тест имитирует некоторую работу процессора.

package main

import (
    "math/rand"
    "testing"
)

func BenchmarkRand(b *testing.B) {
    for n := 0; n < b.N; n++ {
        rand.Int63()
    }
}

Чтобы сгенерировать профиль ЦП для эталонного теста, запустите:

go test -bench=BenchmarkRand -benchmem -cpuprofile profile.out

Флаги -memprofile и -blockprofile можно использовать для создания профилей выделения памяти и блокировки вызовов.

Для анализа профиля используйте инструмент Go:

go tool pprof profile.out
(pprof) top
Showing nodes accounting for 1.16s, 100% of 1.16s total
Showing top 10 nodes out of 22
      flat  flat%   sum%        cum   cum%
     0.41s 35.34% 35.34%      0.41s 35.34%  sync.(*Mutex).Unlock
     0.37s 31.90% 67.24%      0.37s 31.90%  sync.(*Mutex).Lock
     0.12s 10.34% 77.59%      1.03s 88.79%  math/rand.(*lockedSource).Int63
     0.08s  6.90% 84.48%      0.08s  6.90%  math/rand.(*rngSource).Uint64 (inline)
     0.06s  5.17% 89.66%      1.11s 95.69%  math/rand.Int63
     0.05s  4.31% 93.97%      0.13s 11.21%  math/rand.(*rngSource).Int63
     0.04s  3.45% 97.41%      1.15s 99.14%  benchtest.BenchmarkRand
     0.02s  1.72% 99.14%      1.05s 90.52%  math/rand.(*Rand).Int63
     0.01s  0.86%   100%      0.01s  0.86%  runtime.futex
         0     0%   100%      0.01s  0.86%  runtime.allocm

Узким местом в этом случае является мьютекс, вызванный синхронизацией источника по умолчанию в math/rand.

Также возможны другие представления профиля и форматы вывода, например. tree. Введите help, чтобы получить дополнительные параметры.

Обратите внимание, что любой код инициализации перед циклом тестирования также будет профилирован.

person logix    schedule 27.03.2018