Golang中Pprof的CPU采样率如何设置

Golang中Pprof的CPU采样率如何设置 你好,我使用的是 Go 1.9,并尝试对一个基准测试进行 CPU 性能分析,但默认的采样率太低了。

持续时间:4.89秒,总采样时间 = 1.48秒 (30.28%)

如何提高采样率?

谷歌搜索给了我这个: http://golang.org/pkg/runtime/#SetCPUProfileRate,但当我尝试使用它时,我得到了这个错误:BenchmarkProc runtime: cannot set cpu profile rate until previous profile has finished. 我是这样设置的:

func BenchmarkProc(b *testing.B) {
    runtime.SetCPUProfileRate(1000000)
    ...
}

更多关于Golang中Pprof的CPU采样率如何设置的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中Pprof的CPU采样率如何设置的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go 1.9中,SetCPUProfileRate需要在启动CPU分析之前调用,不能在基准测试函数内部设置。正确的做法是在测试初始化时或main函数开始时设置采样率。

示例代码:

import (
    "os"
    "runtime"
    "runtime/pprof"
    "testing"
)

func init() {
    // 在程序初始化时设置CPU采样率
    // 默认是100Hz,这里设置为1000Hz(每秒1000个样本)
    runtime.SetCPUProfileRate(1000)
}

func BenchmarkProc(b *testing.B) {
    // 创建CPU分析文件
    f, err := os.Create("cpu.prof")
    if err != nil {
        b.Fatal(err)
    }
    defer f.Close()
    
    // 启动CPU分析
    if err := pprof.StartCPUProfile(f); err != nil {
        b.Fatal(err)
    }
    defer pprof.StopCPUProfile()
    
    // 基准测试代码
    for i := 0; i < b.N; i++ {
        // 你的测试代码
    }
}

或者使用TestMain进行全局设置:

func TestMain(m *testing.M) {
    // 设置更高的CPU采样率
    runtime.SetCPUProfileRate(5000) // 5000Hz
    
    // 运行测试
    code := m.Run()
    os.Exit(code)
}

对于基准测试,更常见的做法是通过命令行参数控制:

var cpuProfileRate = flag.Int("cpuprofilerate", 1000, "CPU profile rate")

func TestMain(m *testing.M) {
    flag.Parse()
    runtime.SetCPUProfileRate(*cpuProfileRate)
    os.Exit(m.Run())
}

运行基准测试时指定采样率:

go test -bench=. -cpuprofilerate=5000

注意:SetCPUProfileRate的参数是Hz(每秒采样次数),1000表示每秒采集1000个样本。更高的采样率会增加性能开销,但能提供更精确的分析结果。

回到顶部