性能优化工具pprof|青训营笔记

77 阅读3分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 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的了解。

引用参考

github.com/google/ppro…