Golang性能分析

[TOC]

Golang性能分析

pprof

web查看必备工具

brew install graphviz
sudo apt install graphviz
sudo yum install graphviz

# 验证是否安装成功
dot -version

http://localhost:2385/debug/pprof/

执行时间分析

net/http/pprof

package main

import (
    "log"
    "net/http"
    _ "net/http/pprof" //在初始化导包的时候,pprof 包会自动注册 handler
    "time"
)

func main() {

    go func() {
        for {
            log.Println("this is pprof http demo: ", time.Now())
            time.Sleep(time.Second * 10)
        }
    }()
    http.ListenAndServe("0.0.0.0:2385", nil)
}

而后通过浏览器访问即可查看,注:如果用了框架的话也没有关系,监听不同的端口,通过不同的端口访问即可.

  1. 直接访问总列表,该内容是原始数据,展示效果不太友好
http://localhost:2385/debug/pprof/

报告类型

allocs 和 heap 采样的信息类似,不过前者是所有对象的内存分配,而 heap 则是活跃对象的内存分配

序号 报告类型 备注
1 allocs 过去所有内存分配的样本
2 block 导致同步原语阻塞的堆栈跟踪
3 cmdline 当前程序的命令行调用
4 goroutine 所有当前goroutine的堆栈痕迹
5 heap 活动对象的内存分配抽样。您可以指定gc GET参数,以便在获取堆样本之前运行gc。
6 mutex 争用互斥锁持有者的堆栈跟踪
7 profile CPU配置文件。可以以秒为单位指定持续时间。获得概要文件后,使用go工具pprof命令来研究概要文件。
8 threadcreate 导致创建新的操作系统线程的堆栈跟踪
9 trace 当前程序的执行轨迹。可以以秒为单位指定持续时间。获得跟踪文件后,使用go工具跟踪命令来调查跟踪。

通过web访问,展示格式更丰富,选项更多,还有火焰图等 [推荐]

go tool pprof URL 会将文件自动下载下来,默认到~/pprof/目录下每请求一次生成一个gz文件.

后续可以使用go tool pprof ./fileName进入命令行来继续使用,也可对比不同的文件分析两次的差异.

# 每秒将远程的信息下载到本地,并且提供一个本地的8080端口以供web访问,同时会自动打开浏览器访问
go tool pprof --http=0.0.0.0:8081 --seconds=1 http://IP:PORT/debug/pprof/heap
# 同上,但是不会自动刷新数据
go tool pprof --http=0.0.0.0:8081 localhost:8080/debug/pprof/heap
# 同上,不过是访问本地的数据
go tool pprof --http=0.0.0.0:8081 ./pprof.main.alloc_objects.alloc_space.inuse_objects.inuse_space.049.pb.gz
  1. 命令行访问
go tool pprof http://localhost:2385/debug/pprof/heap

wget -O trace.out localhost:8080/debug/pprof/trace
go tool trace --http=:8081 trace.out

命令行标题含义

lat--- 该函数占时
flat% --- 该函数相对于总耗时的百分比
sum% --- 前面累计每一行flat 占比
cum --- 该函数以及该函数调用的其他函数总耗时
cum% --- 对应的百分比

pprof常用参数

-http在主机:在本地提供一个web服务用来查看。如上面的--http=0.0.0.0:8081
    Host是可选的,默认为'localhost'。
    端口是可选的,默认情况下是随机可用的端口。
-no_browser跳过为交互式web UI打开浏览器。
-tools对象工具的搜索路径

-inuse_space同-sample_index=inuse_space   查看正在使用的内存
-inuse_objects同-sample_index=inuse_objects
-alloc_space同-sample_index=alloc_space  查看全部历史内存分配统计,可以通过这个指标确定大量内存用在哪些地方
-alloc_objects同-sample_index=alloc_objects
-total_delay同-sample_index=delay
-contentions同-sample_index=contentions
-mean_delay同-mean -sample_index=delay

-diff_base source基本配置文件的源文件,用于比较
-base source用于减形的基本轮廓源
-seconds基于时间的配置文件收集时间

pprof命令行命令

进入命令行后可通过以下参数进行输出不同的格式

常用展示格式
top N
本地取样计数排名列表: 在默认情况下,top命令会输出以本地取样计数为顺序的列表, 默认是10个

web
生成一个svg文件,然后自动调用本地工具打开(一般是浏览器)

png
生成一个png文件,自动保存到当前目录下.

list 函数名
结合top,可以直接定位到消耗资源的代码处

traces 
列出函数的调用栈

一般首先通过profile,定位cpu消耗暂时较大的函数,然后通过heap定位内存占用较大的函数逻辑。


其他展示格式
-callgrind以callgrind格式输出图形
-comments输出所有配置文件注释
-disasm输出带有示例注释的程序集清单
-dot以DOT格式输出图形
-eog通过eog可视化图形
-evince通过evince可视化图形
-gif输出GIF格式的图形图像
-gv通过gv可视化图形
-kcachegrind在KCachegrind可视化报告
-list输出与regexp匹配的带注释的函数源
-pdf以PDF格式输出图形
-peek匹配regexp的函数的输出调用者/调用者
-png输出PNG格式的图形图像
-proto以压缩的protobuf格式输出配置文件
-ps输出PS格式的图形
-raw输出原始配置文件的文本表示形式
-svg以SVG格式输出图形
-tags输出配置文件中的所有标记
-text以文本形式输出顶部条目
-top以文本形式输出top条目
-topproto以压缩的protobuf格式输出top项
-trace以文本形式输出所有概要文件示例(列出函数的调用栈)
-tree输出调用图的文本呈现
-web通过web浏览器可视化图形
-weblist在浏览器中显示带注释的源代码

参数的选项

粒度
-functions在函数级聚合。
-filefunctions在函数级聚合。
-files在文件级进行聚合。
-lines在源代码行级别聚合。
-address在地址级进行聚合。
排序
-cum根据累积权重对条目进行排序
-flat根据自己的权重对条目进行排序

runtime/pprof

package main

import (
    "log"
    "os"
    "runtime/pprof"
)

func main() {
    fc, err := os.OpenFile("./cpu.pprof", os.O_RDWR|os.O_CREATE, 0755)
    if err != nil {
        log.Fatal(err)
    }
  fm, err := os.OpenFile("./mem.pprof", os.O_RDWR|os.O_CREATE, 0755)
    if err != nil {
        log.Fatal(err)
    }
  pprof.StartCPUProfile(fc)
  //内存消耗分析
  pprof.WriteHeapProfile(fm)
  


    pprof.StopCPUProfile()
    fc.Close()
}

进入命令行

 go tool pprof ./cpu.prof

之后的命令行操作与上面的一样,这里就不再赘述了

对比

  1. go tool pprof XXX间隔一段时间采集文件, 对比是否存在明显的增加.
  2. go tool pprof -base file1 file2 对比两个文件,top或web获取对比.
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,692评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,482评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,995评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,223评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,245评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,208评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,091评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,929评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,346评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,570评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,739评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,437评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,037评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,677评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,833评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,760评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,647评论 2 354

推荐阅读更多精彩内容