这是我参与「第五届青训营」伴学笔记创作活动的第 7 天
前言
基准测试可以度量某个函数或方法的性能,适用于已知程序性能瓶颈情况下的针对性性能测试,但不适用于未知程序。针对未知程序的性能测试可以用pprof进行,本文将介绍pprof在go语言中的应用。
pprof简介
pprof包含编译到程序中的runtime/pprof包、基于HTTP Server运行的net/http/pprof包和性能剖析工具go tool pprof(是用于可视化和性能分析的工具)。
pprof 以 profile.proto读取分析样本的集合,并生成报告以可视化并帮助分析数据。
profile.proto 是一个 Protocol Buffer v3 的描述文件,它描述了一组 callstack 和 symbolization 信息, 作用是表示统计分析的一组采样的调用栈,是很常见的 stacktrace 配置文件格式。
应用pprof可以进行CPU 分析、内存分析、阻塞分析和互斥锁分析。
性能分析类型
CPU性能分析: 启动CPU分析时,运行时隔10ms中断一次,记录此时正在运行的协程的堆栈信息。程序运行结束后,可以分析记录的数据找到最热代码路径。
内存性能分析:记录堆内存分配时的堆栈信息,忽略栈内存分配信息。内存性能分析启用时按一定频率采样。
阻塞性能分析:阻塞性能分析是go特有的,用来记录一个协程等待一个共享资源花费的时间,在判断程序的并发瓶颈时有用。常见的阻塞场景包括:
- 在没有缓冲区的信道上发送或接收数据。
- 从空的信道上接收数据,或发送数据到满的信道上。
- 尝试获得一个已经被其他写成锁住的排它锁。
锁性能分析:与阻塞分析类似,但专注于因为锁竞争导致的等待或延时。
pprof使用
通过浏览器访问
在import 中添加 _ "net/http/pprof" 的引用,并在main函数中运行HTTP Server,就可以在对应url的/debug/pprof路径下查看总览页面,并进入具体目录访问对应内容,主要包括内存分配样本信息、导致阻塞同步的堆栈跟踪、活动对象的内存分配情况、导致互斥锁的竞争持有者的堆栈跟踪等。
通过交互式终端使用
可以直接通过命令行完成对正在运行的应用程序pprof的抓取和分析,主要用go tool pprof进行,具体性能分析的命令在此不加赘述,可自行检索相关文档。
可视化界面
指定端口号运行
$ go tool pprof -http=:6001 profile
通过web命令以svg的文件格式写入图形,然后在web浏览器中打开
$ go tool pprof profile
Type: cpu
Time: Feb 1, 2020 at 12:09pm (CST)
Duration: 30s, Total samples = 60ms ( 0.2%)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof) web
总结
本文从基本概念、功能和使用方式三方面出发对go语言的性能分析工具pprof作了简要的介绍。pprof作为go语言性能分析的重要工具值得每一个go语言开发者去了解和使用,希望后续能在实践过程中不断加深对pprof的了解。