Code.1 pprof 分析测试用例

渐行渐远 · · 446 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

测试pprof查看cpu占用

首先,我们声明一个耗时函数。传递一个time.Duration的数据类型,表示函数执行的时间。注意,这里不能使用time.Sleep,它得不到cpu的执行。函数如下:

// 耗时函数
func consumer(ctx context.Context, s time.Duration) {
    subCtx, _ := context.WithTimeout(ctx, s)
    i := 0

    for {
        select {
        case <-subCtx.Done():
            fmt.Println(i)
            return
        default:
            i = i + 2
        }
    }
}

我们再声明一个冗余的函数,这个函数调用consumer,同时Copy一份consumer的逻辑

// 间接耗时4s
func indirectConsumer(ctx context.Context, s time.Duration) {
    consumer(ctx, s)
    
    // copy同一份代码
    subCtx, _ := context.WithTimeout(ctx, s)
    i := 0

    for {
        select {
        case <-subCtx.Done():
            fmt.Println(i)
            return
        default:
            i = i + 2
        }
    }
}

最后,我们写一个Test,来生成cpu_profile文件。

// 生成CPU Profile文件
func TestConsumer(t *testing.T) {
    pf, err := os.OpenFile("cpu_profile", os.O_RDWR|os.O_CREATE, 0644)
    if err != nil {
        t.Fatal(err)
    }
    defer pf.Close()

    pprof.StartCPUProfile(pf)
    defer pprof.StopCPUProfile()

    ctx := context.Background()

    // 耗时2s
    consumer(ctx, time.Second*2)

    // 耗时4s
    indirectConsumer(ctx, time.Second*2)
}

查看我们生成的pprof文件,这里我们使用web的方式来查看。在命令行执行:

 go tool pprof -http=:1888 cpu_profile

页面直接跳转到浏览器,并提供了很多菜单选项。我们看一下我机器上Top的情况:

图片描述
关注一下local/one-case.indirectConsumerlocal/one-case.consumer,他们的占比基本是相同的,这也跟我们的预期是相同的。

通过查看Graph我们可以清楚的看到调用的流程。Test内部直接调用了consumer函数,而indirectConsumer也调用了consumer函数。

图片描述

通过Source我们可以看到具体的代码的耗时占比。它明确的表示了flatcum占用的时长。从某种意义上来说,这才是所谓的cpu的直接调用和间接调用关系。我们使用indirectConsumer为例:

图片描述

如果觉得Graph图拉的很长,我们可以选择Flame Graph来查看。我们也展示一下:

图片描述


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:渐行渐远

查看原文:Code.1 pprof 分析测试用例

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

446 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传