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时间越长.注意.横轴不代表时间.而是所有的调用栈合并后.按字母顺序排列.

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

语雀地址www.yuque.com/itbosunmian...?

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

相关推荐
IT策士11 小时前
Django 从 0 到 1 打造完整电商平台:个人中心与用户信息修改
后端·python·django
小明同学0111 小时前
C++后端项目:统一大模型接入 SDK(五)
服务器·c++·后端·计算机网络·语言模型
SimonKing11 小时前
IP定位库的完美替代品:ip2region,开源、免费!
java·后端·程序员
XiYang-DING11 小时前
【Spring】Lombok
java·后端·spring
ZC跨境爬虫11 小时前
模块化烹饪小程序开发日记 Day5:(后端Flask接口开发与AI智能解析菜谱的实现)
前端·人工智能·后端·python·ui·flask
Yeats_Liao11 小时前
物联网接入层技术剖析(一):从select到epoll
java·linux·后端·物联网·struts
小钻风336611 小时前
Spring Boot WebSocket 两种集成方式深度解析
spring boot·后端·websocket
IT_陈寒11 小时前
Vite热更新失效?我在这坑里卡了一下午
前端·人工智能·后端
云烟成雨TD12 小时前
Spring AI Alibaba 1.x 系列【55】Interrupts 中断机制:静态中断源码分析
人工智能·后端·spring