golang---查看程序运行时状态

Posted double12gzh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang---查看程序运行时状态相关的知识,希望对你有一定的参考价值。

## 1. 介绍

对于生产环境中运行的进程,可以用 Go 内置的性能分析工具 pprof 窥测进程的当前状况。

Profiling Go Programs 很好地演示了用 pprof 找到性能瓶颈的过程,这里只演示简单用法。

2. 启用实时的pprof

2.1 启用实时的 pprof

非常简单,只需要引入 "net/http/pprof",然后启动 http server 就可以了:

import (
    "fmt"
    "log"
    "net/http"
    _ "net/http/pprof"
    "time"
)

func Write(num int, c chan int) {
    for {
        c <- num
    }
}

func main() {
    go func() {
        log.Println(http.ListenAndServe("localhost:6060", nil))
    }()

    c := make(chan int)
    go Write(10, c)
    go Write(20, c)

    for {
        select {
        case v := <-c:
            fmt.Printf("receive %d
", v)
            time.Sleep(2 * time.Second)
        }
    }
}

直接用浏览器打开 http://127.0.0.1:6060/debug/pprof/ 查看:
技术图片

其中 debug/pprof/profile 是 cpu 采样文件,访问时触发,用 seonds 参数控制采集持续时间:

# 默认是 30 秒
http://localhost:6060/debug/pprof/profile?seconds=30

2.2 对于非常驻环境

对于非常驻运行的 Go 语言程序,可以在程序添加代码,经 pprof 信息写入文件中:

var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")

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

3. 如何使用pprof

如何使用 pprof 才是重点,除了 profiletrace ,其它 url 可以直接在浏览器中查看,
profiletrace 是两个采样文件要分别用 pproftrace 工具查看。

对于离线文件:

$ go tool pprof havlak1 havlak1.prof
Welcome to pprof!  For help, type 'help'.
(pprof)

对于在线地址,以 cpu 采样为例(为了采集到数据把上面程序中的 sleep 时间调整为 0):

$ go tool pprof http://localhost:6060/debug/pprof/profile   # 30-second CPU profile

技术图片

web 命令绘制采样图并用浏览器打开 ,如果遇到下面错误,安装 graphviz:

(pprof) web
failed to execute dot. Is Graphviz installed? Error: exec: "dot": executable file not found in $PATH

MACOS上:

brew install graphviz

技术图片

3. trace查看

技术图片

以上是关于golang---查看程序运行时状态的主要内容,如果未能解决你的问题,请参考以下文章

golang 转到片段以观察运行时行为和内存分配

在 Golang 中运行 exec.Command 时如何调试“退出状态 1”错误

对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 错误解决一例。(代码片段

golang goroutine例子[golang并发代码片段]

尝试使用片段保存夜间模式状态

golang代码片段(摘抄)