• Go的pprof使用


    web 服务器

    如果你的go程序是用http包启动的web服务器,你想查看自己的web服务器的状态。这个时候就可以选择net/http/pprof。你只需要引入包_"net/http/pprof",然后就可以在浏览器中使用http://localhost:port/debug/pprof/直接看到当前web服务的状态,包括CPU占用情况和内存使用情况等。具体使用情况你可以看godoc的说明。

    代码中加入

    _ "net/http/pprof"

    在浏览器中我就可以直接看prof信息了

    Image

    生成CPU状态分析图

    下面我们想要生成CPU状态分析图,

    调用go tool pprof http://localhost:3999/debug/pprof/profile

    或者 go tool pprof http://localhost:3999/debug/pprof/profile --text

    就会进入30秒的profile收集时间,在这段事件内猛刷新点击go-tour浏览器上的页面,尽量让cpu占用性能产生数据。

    (pprof) top

    Total: 3 samples

           1 33.3% 33.3% 1 33.3% MHeap_AllocLocked

           1 33.3% 66.7% 1 33.3% os/exec.(*Cmd).closeDescriptors

           1 33.3% 100.0% 1 33.3% runtime.sigprocmask

           0 0.0% 100.0% 1 33.3% MCentral_Grow

           0 0.0% 100.0% 2 66.7% main.Compile

           0 0.0% 100.0% 2 66.7% main.compile

           0 0.0% 100.0% 2 66.7% main.run

           0 0.0% 100.0% 1 33.3% makeslice1

           0 0.0% 100.0% 2 66.7% net/http.(*ServeMux).ServeHTTP

           0 0.0% 100.0% 2 66.7% net/http.(*conn).serve

    (pprof)web

    屏幕快照 2012-12-26 下午10.32.17

     

    服务进程

    如果你的go程序不是web服务器,而是一个服务进程,那么你也可以选择使用net/http/pprof包,同样引入包net/http/pprof,然后在开启另外一个goroutine来开启端口监听。

    比如:

    go func() {
            log.Println(http.ListenAndServe("localhost:8080", nil)) 

    }()

    应用程序

       

    import "runtime/pprof"
    func main() {
        f, _ := os.Create("./profile.prof")
        pprof.StartCPUProfile(f)
        defer pprof.StopCPUProfile()

    .......
    }


    #./geteandata 运行程序 收集信息

    #go tool pprof ./geteandata ./profile.prof 分析生成的文件

    进入到pprof中
    top 可使用top 查看最耗时的function
    web 会在/tmp下生成svg文件,svg文件是可以在浏览器下看的 注:如果报 sh: dot: command not found 则需要安装 graphviz
    #yum install graphviz
    #dot -V 查看 graphviz是否安装成功

    
    

    各字段的含义依次是:

    1. 采样点落在该函数中的次数

    2. 采样点落在该函数中的百分比

    3. 上一项的累积百分比

    4. 采样点落在该函数,以及被它调用的函数中的总次数

    5. 采样点落在该函数,以及被它调用的函数中的总次数百分比

    6. 函数名



    注:本文部分信息转自 http://www.cnblogs.com/yjf512/archive/2012/12/27/2835331.html
  • 相关阅读:
    VS编译错误:#error: Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version
    C++ STL std::copy 详解
    JavaScript:{}、new Object和Object.create的区别
    函数声明和函数表达式的区别
    Java基础重写override
    Java基础多态数组
    Java基础编译类型和运行类型(多态)
    Java基础继承的内存分析
    Java基础访问修饰符
    Java基础继承的使用
  • 原文地址:https://www.cnblogs.com/wangxusummer/p/4037200.html
Copyright © 2020-2023  润新知