Go pprof性能剖析

在Go语言中.如果想要进行性能优化.则可以使用Go语言自带的性能分析工具--pprof.pprof是一个强大的性能分析工具.可以捕捉到多维度的运行状态数据,它也是一个CPU分析器.是gperftools工具的一个组件.由谷歌工程师为分析多线程的程序所开发.pprof是Go语言分析的利器.其使用方式有如下两种.

runtime/pprof:

采集程序的运行数据进行分析.

net/http/pprof:

采集Http服务器的运行数据进行分析.

pprof作用:

CPU分析:

按照一定的频率采集监听的应用程序CPU使用情况.可确定应用程序在主动消耗CPU周期时花费的时间,

内存分析:

在应用程序堆栈分配时记录跟踪.用于监视当前和历史内存使用情况.检查内存泄漏情况.

阻塞分析:

记录goroutine阻塞等待同步的位置.

互斥锁分析:

报告互斥锁的竞争情况.

pprof使用方式:

一般情况下.获取profile数据主要有两种形式:Web形式与profile文件生成形式.

Web形式:

Go 复制代码
package main

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

func main() {
    //性能分析.
    go func() {
       log.Println(http.ListenAndServe("localhost:6060", nil))
    }()

    //实际业务代码.
    for {
       Sum("This is a test")
    }
}

func Sum(s string) string {
    data := []byte(s)
    sData := string(data)

    var sum = 0
    for i := 0; i < 10000; i++ {
       sum += i
    }
    return sData
}

执行代码后,net/http/pprof包的init函数中注册了以下路由到Http服务中.然后用浏览器访问http://localhost:6060/debug/pprof/.即可使用pprof提供的功能.

allocs:

内存分配情况的采集信息.

blocks:

阻塞操作情况的采集信息.

cmdline:

显示程序启动明令及参数.

goroutine:

当前所有协程的的堆栈信息.

heap:

堆上内存使用情况的采集信息.

mutex:

锁争用情况的采集信息.

profile:

CPU占用情况的采集信息.

threadcreate:

系统线程创建情况的采集信息.

trace:

程序运行跟踪信息.

profile交互式终端文件形式:

不管是工具型应用还是服务型应用.使用相应的pprof库获取数据之后.下一步就是对数据进行分析.可以使用go tool pprof命令行工具进行分析.

go tool pprof binary source

lbinary:应用的二进制文件.用来解析各种符号.

lsource:表示profile数据的来源.可以是本地文件.也可以是Http地址.

Go 复制代码
package main

import (
    "flag"
    "log"
    _ "net/http/pprof"
    "os"
    "runtime"
    "runtime/pprof"
)

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

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

    if *memprofile != "" {
       f, err := os.Create(*memprofile)
       if err != nil {
          log.Fatal(err)
       }
       runtime.GC()
       if err := pprof.WriteHeapProfile(f); err != nil {
          log.Fatal(err)
       }
       defer f.Close()
    }
}

对以上代码执行go run main.go -cpuprofile cpu.out -memprofile mem.out

go tool pprof cpu.out

go tool pprof mem.out

上面两个命令就可以进行分析.

lflat:

给定函数上的运行耗时.

lflat%:

给定函数上的CPU运行耗时占比.

lsum%:

给定函数累计使用CPU的总比例.

lcum:

当前函数加上它之前的调用运行总耗时.

cum%:

当前函数加上它之前的调用CPU运行耗时占比.

pprof是进行Go程序性能分析的有力工具.它通过采样 收集运行中的Go程序性能相关的数据生成profile文件.之后.提供三种不同的展现形式.得到性能数据后.可以使用top web list等命令行工具迅速定位到相应的代码处.并进行优化.

火焰图分析:

使用火焰图分析需要手动安装pprof原生工具.这是Google公司提供的一个工具.安装命令如下.

go get -u github.com/goole/pprof

启动火焰图可视化工具.

pprof -http= :8080 profile 文件名

访问web地址localhost:8080.如果上面的命令不加 -http =: 8080.则默认进入交互式控制台.输入命令web.生成一个文件自动启动浏览器.

火焰图竖轴表示调用栈.每一层都是一个函数.调用栈越深火焰越高.最底部是是正在执行的函数.上面是它的父函数.横轴表示这个函数的抽样数.一个函数在横轴占得越宽.代表抽样数越高.执行CPU时间越长.注意.横轴不代表时间.而是所有的调用栈合并后.按字母顺序排列.

火焰图就是看顶层的哪个函数占据的宽度最大.只要"平顶"就表示该函数可能存在性能问题.

语雀地址https://www.yuque.com/itbosunmianyi/xg8vfe?

《Go.》 密码:xbkk 欢迎大家访问.提意见.

相关推荐
evans在进步6 分钟前
Java 常用设计模式(二):装饰器、适配器、责任链、模板方法、策略与观察者
java·开发语言·设计模式
半个落月11 分钟前
React JWT 登录鉴权实战:Mock、Zustand、Axios 与路由守卫全流程
后端·react.js
XingXingXxx15 分钟前
Skill 能自己变强吗?从轨迹归纳到文本空间优化的进化之路
后端
jvmind_dev28 分钟前
频繁 new JedisCluster 之后,对象池为什么回不去了?
java·后端
掘金者阿豪29 分钟前
给你的AI龙虾打造一间像素办公室!Star Office UI部署+公网访问完整教程
后端
小雨笙笙35 分钟前
C语言:指针
c语言·开发语言
学长毕业设计39 分钟前
基于SpringBoot的咖啡馆管理系统的设计与实现(源码+文档+讲解视频)
java·spring boot·后端
骇客野人42 分钟前
SpringBoot业财一体化系统设计和落地实施方案
java·spring boot·后端
学长毕业设计1 小时前
基于SpringBoot的教学资源推荐系统的设计与实现(源码+文档+讲解视频)
java·spring boot·后端
用户850869276151 小时前
一次线上文件上传 Bug 引发的区块链分布式存储深度排查
后端