0
点赞
收藏
分享

微信扫一扫

Golang性能分析


性能分析的场景主要有CPU、Memory、IO、Goroutine、死锁几种

1、两种类型的应用

(1)服务型应用 _ "net/http/pprof" 包,专用于采集 web 服务

(2)工具型应用 "runtime/pprof" 包,专用于采集 应用程序

2、功能

CPU 分析(profile): 你可以在 url 上用 seconds 参数指定抽样持续时间(默认 30s),你获取到概览文件后可以用 go tool pprof 命令调查这个概览

内存分配(allocs): 所有内存分配的抽样

阻塞(block): 堆栈跟踪导致阻塞的同步原语

命令行调用(cmdline): 命令行调用的程序

goroutine: 当前 goroutine 的堆栈信息

堆(heap): 当前活动对象内存分配的抽样,完全也可以指定 gc 参数在对堆取样前执行 GC

互斥锁(mutex): 堆栈跟踪竞争状态互斥锁的持有者

系统线程的创建(threadcreate): 堆栈跟踪系统新线程的创建

trace: 追踪当前程序的执行状况. 你可以用 seconds 参数指定抽样持续时间. 你获取到 trace 概览后可以用 go tool pprof 命令调查这个 trace

3、命令行工具,即go tool pprof工具

go tool pprof [文件或链接]

go tool pprof http://127.0.0.1:8081/debug/pprof/allocs

go tool pprof http://127.0.0.1:8081/debug/pprof/profile?seconds=60

go tool pprof C:\Users\fourier\Downloads\profile

go tool pprof http://localhost:6060/debug/pprof/heap

(1)top命令

top 5



Golang性能分析_pprof


flat: 在给定函数上运行耗时

flat%: 在给定函数上运行耗时总比例

sum%: 给定函数 累计

cum: 当前函数 以及包含子函数

cum%: 同上的 CPU 运行耗时总比例

最后一列为函数名称

(2)list命令

list [funcName]



Golang性能分析_golang_02


list `*$ 查看所有函数

(3)查看堆情况

$ go tool pprof http://localhost:6060/debug/pprof/heap
Fetching profile over HTTP from http://localhost:6060/debug/pprof/heap
Saved profile in /Users/eddycjy/pprof/pprof.alloc_objects.alloc_space.inuse_objects.inuse_space.008.pb.gz
Type: inuse_space
Entering interactive mode (type "help" for commands, "o" for options)
(pprof) top
Showing nodes accounting for 837.48MB, 100% of 837.48MB total
      flat  flat%   sum%        cum   cum%
  837.48MB   100%   100%   837.48MB   100%  main.main.func1

-inuse_space:分析应用程序的常驻内存占用情况

-alloc_objects:分析应用程序的内存临时分配情况

4、web命令及可视化工具

需安装https://graphviz.gitlab.io/download

(1)web UI

go tool pprof -http :8080 C:\Users\fourier\Downloads\profile

go tool pprof -http=:8080 cpu.prof

访问http://127.0.0.1:8080/ui即可看到如下



Golang性能分析_堆栈_03


-VIEW看各种视图
  -Top:主要看占用内存当排名信息
  -Graph:连接图,主要看调用关系图,并且通过框框的粗细、颜色当深浅、线的实虚、以及数字信息包括执行时间和占比
  -FlameGraph:火焰图,要看宽度和深度,heap中宽度表明内存占用大小,
  -Peek
  -Source
  -Disassemble
-SAMPLE:采样信息,包括申请对象、申请空间、占用对象、占用空间的信息
-REFINE:可以精细化视图中的信息
  -Focus:聚焦在选中元素的上下游元素
  -Ignore:忽略选中当元素,包含其后继元素
  -Hide:隐藏选中当元素,但不会隐藏其后继元素
  -Show:只显示选中的元素,不包含后继元素
  -Showfrom:从选中当某一个元素开始,只列出其后继元素
-CONFIG:能将当前已精细化的页面保存起来

(2)连接图

web [funcName] 查看函数的连接图

go tool pprof -web C:\Users\fourier\Downloads\profile 查看连接图

连接图中的性能问题一般在最红最粗的线。

(3)火焰图

  • 火焰图的Y 轴表示调用栈,调用顺序是从上到下(有些是从下到上,如火焰一般),每一块都是一个函数,越大代表占用 CPU 时间越长。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。
  • 火焰图的X 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长,通常执行频率是 99Hz(每秒99次),如果99次都返回同一个函数名,那就说明 CPU 这一秒钟都在执行同一个函数,可能存在性能问题。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。
  • 一般采样记录信息有三个参数:采样的进程号、采样的频率(每秒采样多少次,通常 99 次)、采样持续时间
  • 火焰图的颜色表示 CPU 的繁忙程度。
  • 火焰图主要看顶层的哪个函数占据的宽度最大。有"平顶"(plateaus)则表示该函数可能存在性能问题。但是直接观察"平顶"(plateaus)往往不能快速定位性能问题,因为顶部记录的大多是对底层库函数的调用情况。要快速定位性能问题,首先应该观察业务函数在火焰图中的宽度,然后再往顶部找到第一个库函数来缩小范围,而不是直接看平顶。
  • 如何读懂火焰图http://www.ruanyifeng.com/blog/2017/09/flame-graph.html

(4)另一种可视化方式

go get -u github.com/google/pprof

pprof -http=:8080 cpu.prof

有待进一步看一下

举报

相关推荐

0 条评论