美文网首页HiBlock区块链社区区块链入门
Go学习之路-代码性能监控pprof

Go学习之路-代码性能监控pprof

作者: 天之皓月 | 来源:发表于2019-05-06 18:20 被阅读67次

本篇文章只是对Go语言中代码性能监控(pprof)简单使用的介绍,希望对您们的学习道路上有所帮助,相互学习,共同帮助

注意:本文在Mac Pro下操作为例,基于Go1.12版本

在软件开发的过程中,项目的上线并不是重点。上线之后,还需对程序进行取样分析运行情况,并重构现有的功能,让程序执行的更高效更稳定。

一:pprof基础介绍

1.1 pprof是什么?

pprof是用于可视化和分析性能,数据的工具
pprof 以 profile.proto读取分析样本的集合,并生成报告以可视化并帮助分析数据(支持文本和图形报告)

profile.proto 是一个 Protocol Buffer v3 的描述文件,它描述了一组 callstack 和 symbolization 信息, 作用是表示统计分析的一组采样的调用栈,是很常见的 stacktrace 配置文件格式

1.2 支持什么使用模式

  • Report generation:报告生成
  • Interactive terminal use:交互式终端使用
  • Web interface:Web 界面

1.3 可以用来干嘛

  • CPU Profiling:CPU 分析,按照一定的频率采集所监听的应用程序 CPU(含寄存器)的使用情况,可确定应用程序在主动消耗 CPU 周期时花费时间的位置
  • Memory Profiling:内存分析,在应用程序进行堆分配时记录堆栈跟踪,用于监视当前和历史内存使用情况,以及检查内存泄漏
  • Block Profiling:阻塞分析,记录 goroutine 阻塞等待同步(包括定时器通道)的位置
  • Mutex Profiling:互斥锁分析,报告互斥锁的竞争情况

1.4 在go中pprof可以干嘛

go的pprof工具可以用来检测进程的运行数据以及监控程序的性能,对内存使用和CPU使用的情况统计信息进行分析

官方提供包及文档:
包:

  • runtime/pprof:用于普通代码的性能分析(采集程序(非Server)的预想数据进行分析)
  • net/http/pprof:用于web服务器的性能分析(采集HTTP Server的运行数据进行分析)
    文档(有的需翻墙):
    pprof
    runtime/pprof
    net/http/pprof

二: 通过简单的例子来进行描述

package main

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

func main() {
    // 开启pprof
    go func() {
        log.Println(http.ListenAndServe("localhost:8087", nil))
    }()
    go hello()
    select {}
}
func hello() {
    for {
        go func() {
            fmt.Println("hello word")
        }()
        time.Sleep(time.Millisecond * 1)
    }
}

运行这个文件
效果截图


效果截图

分析

2.1通过Web服务器监测

当服务开启成功时(别忘记引入监测包),查看当前信息 ,地址栏中输入http://localhost:8087/debug/pprof/

效果图
  • cpu(CPU Profiling)
    访问地址:ip/debug/pprof/profile
    介绍:默认进行 30s 的 CPU Profiling,得到一个分析用的 profile 文件
  • block(Block Profiling)
    访问地址:ip/debug/pprof/block
    介绍:查看导致阻塞同步的堆栈跟踪
  • goroutine
    访问地址: ip/debug/pprof/goroutine
    介绍:查看当前所有运行的 goroutines 堆栈跟踪
  • heap(Memory Profiling)
    访问地址:ip/debug/pprof/heap
    介绍:查看活动对象的内存分配情况
  • mutex(Mutex Profiling)
    访问地址:ip/debug/pprof/mutex
    介绍:查看导致互斥锁的竞争持有者的堆栈跟踪
  • threadcreate
    访问地址:ip/debug/pprof/threadcreate
    介绍:查看创建新OS线程的堆栈跟踪

2.2 通过交互式终端进行使用

2.2.1
命令:go tool pprof http://localhost:8087/debug/pprof/profile\?seconds\=30

执行该命令后,需等待 30 秒(可调整 seconds 的值),pprof 会进行 CPU Profiling。结束后将默认进入 pprof 的交互式命令模式,可以对分析的结果进行查看或导出。具体可执行 pprof help 命令说明

效果图
help命令

top
命令格式: top[n],查看排名前n个数据,默认为10

top命令
解释
flat:给定函数上运行耗时
flat%:同上的 CPU 运行耗时总比例
sum%:给定函数累积使用 CPU 总比例
cum:当前函数加上它之上的调用运行总耗时
cum%:同上的 CPU 运行耗时总比例

其中最后一列为函数名称,在大多数的情况下,我们可以通过这五列得出一个应用程序的运行情况,加以优化😊
tree
命令格式:tree[n],以树状图形显示

tree命令
2.2.2
命令:go tool pprof http://localhost:8087/debug/pprof/heap
效果图
-inuse_space:分析应用程序的常驻内存占用情况
-alloc_objects:分析应用程序的内存临时分配情况

2.3 可视化界面

测试用例可以参照这个
需安装graphviz(谷歌或者百度)
Mac中安装的话
命令:brew install graphviz
启动可视化界面
第一种:go tool pprof -http=:8089 cpu.prof
第二种

$ go tool pprof cpu.prof
$ (pprof) web

若是出现Could not execute dot; may need to install graphviz.,那么需要安装graphviz

查看pprof可视化界面


界面截图
top source peek

小结:本篇文章也是自己根据文档已经别人的文章(站在巨人的肩膀上)进行学习的,目前理解的不是很深,文章中有遗漏的地方,欢迎提出,相互学习,共同进步

三:相关链接

Golang 大杀器之性能剖析
Go pprof的使用

google-pprof

相关文章

网友评论

    本文标题:Go学习之路-代码性能监控pprof

    本文链接:https://www.haomeiwen.com/subject/cocroqtx.html