我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Go库性能分析工具pprof

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Go库性能分析工具pprof

场景

我们一般没必要过度优化 Go 程序性能。但是真正需要时,Go 提供的 pprof 工具能帮我们快速定位到问题。比如,我们团队之前有一个服务,在本地和测试环境没问题,一到灰度环境,就报 cpu 负载过高,后经排查,发现某处代码死循环了。我把代码简化成如下:


// 处理某些业务,真实的代码中这个死循环很隐蔽
func retrieveSomeThing() {
	for {}
}
// 处理其他的一些业务,无意义,用于后续做例子
func doSomeThing() {
	do1()
	for i := 0; i < 200000000; i++ {}
	do2()
}
// 无意义
func do1() {
	for i := 0; i < 200000000; i++ {}
}
// 无意义
func do2() {
	for i := 0; i < 200000000; i++ {}
}
func main() {
	go retrieveSomeThing()
  go doSomeThing()
	// 阻塞一下
	time.Sleep(3 * time.Second)
}

解决问题前,先介绍下 pprof。

pprof

pprof 包会输出运行时的分析数据(profiling data),这些数据可以被 pprof 的可视化工具解析。Go 标准库主要提供了两个包:

  • runtime/pprof 通过写入到文件的方式暴露 profile 数据;
  • net/http/pprof 通过 http 服务暴露 profile 数据,适用于守护进程。

生成 profile 文件

CPU 性能分析

runtime/pprof 中,使用StartCPUProfile开启 CPU 性能分析。退出程序前,需要调用StopCPUProfile把采样数据 flush 到输出文件。

采样的频率默认是 100 Hz(每秒 100 次)。

// 输出到标准输出,一般是指定文件
if err := pprof.StartCPUProfile(os.Stdout); err != nil {
    log.Fatal("could not start CPU profile: ", err)
}
defer pprof.StopCPUProfile()

内存性能分析

调用 WriteHeapProfile 开启内存性能分析:

// 输出到标准输出,一般是指定文件
if err := pprof.WriteHeapProfile(os.Stdout); err != nil {
    log.Fatal("could not write memory profile: ", err)
}
}

分析 profile 文件 && 优化代码

以开篇的代码为例,由于是 CPU 过载,我们可以在 main 函数开启 CPU Profile:

// 通过参数指定 cpu profile 输出的文件
var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to `file`")
func main() {
	flag.Parse()
	if *cpuprofile != "" {
		f, err := os.Create(*cpuprofile)
		if err != nil {
			log.Fatal("could not create CPU profile: ", err)
		}
		// 开启 CPU 分析
		if err := pprof.StartCPUProfile(f); err != nil {
			log.Fatal("could not start CPU profile: ", err)
		}
		defer pprof.StopCPUProfile()
	}
	// 业务代码
	go retrieveSomeThing()
  go doSomeThing()
	// 模拟阻塞
	time.Sleep(5 * time.Second)
}

我们执行命令,输出 profile 文件到 cpu.prof。

go run main.go -cpuprofile cpu.prof

go tool pprof

Go 提供性能解析工具:go tool pprof。我们使用 go tool 打开 profile 文件。

> go tool pprof cpu.prof 
Type: cpu
Time: Nov 16, 2022 at 1:40pm (CST)
Duration: 5.17s, Total samples = 4.54s (87.75%)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof) 

这是个交互式的界面,输入help可以查看所有命令。

top 命令

我们使用 topN 命令,查看根据 flat 从大到小排序的前 N 条数据。

(pprof) top10
Showing nodes accounting for 4650ms, 100% of 4650ms total
      flat  flat%   sum%        cum   cum%
    4220ms 90.75% 90.75%     4450ms 95.70%  main.retrieveSomeThing
     230ms  4.95% 95.70%      230ms  4.95%  runtime.asyncPreempt
      80ms  1.72% 97.42%      200ms  4.30%  main.doSomeThing
      70ms  1.51% 98.92%       70ms  1.51%  main.do2 (inline)
      50ms  1.08%   100%       50ms  1.08%  main.do1 (inline)

top 命令返回数据有5个指标:

  • flat : 本函数占用的 CPU 时间,不包括调用函数的时间;
  • flat% : flat 占的百分比;
  • sum% : 前面 flat% 的总和;
  • cum : 累计时间,包括调用的函数的时间;
  • cum% : cum 的百分比。

main.doSomeThing(排第三的函数)为例子,耗时为:

func doSomeThing() {                   // flat: 80ms  cum: 200ms
	do1()                                // 执行时间 50ms
	for i := 0; i < 200000000; i++ {}    // 执行时间 80ms
	do2()                                // 执行时间 70ms
}

doSomeThing 的 flat 的值为:

for i := 0; i < 200000000; i++ {}的执行时间(80ms),不包括do1和do2的时间。

doSomeThing 的 cum 的值为:

cum(200ms) = doSomething的flat(80ms) + do1的flat(50ms) + do2的flat(70ms)

ps: top 可以使用 -cum 参数来指定,根据 cum 排序。

list 命令

明白了 top 的指标的意思,我们关注到,排在 top1 的函数是 retrieveSomeThing。可以使用 list 命令,查看 retrieveSomeThing 耗时:

(pprof) list retrieveSomeThing
Total: 4.65s
ROUTINE ======================== main.retrieveSomeThing in /xxxx/pprof_note/pprof/main.go
     4.22s      4.45s (flat, cum) 95.70% of Total
      10ms       10ms      1:package main
         .          .      2:
         .          .      3:import (
         .          .      4:   "flag"
         .          .      5:   "log"
         .          .      6:   "os"
         .          .      7:   "runtime/pprof"
         .          .      8:   "time"
         .          .      9:)
         .          .     10:
         .          .     11:// 处理某些业务,真实的代码中这个死循环很隐蔽
         .          .     12:func retrieveSomeThing() {
     4.21s      4.44s     13:   for {
         .          .     14:   }
         .          .     15:}
         .          .     16:
         .          .     17:// 处理其他的一些业务,无意义,用于后续做例子
         .          .     18:func doSomeThing() {

我们定位到13行需要优化。

总结

pprof 还有很多玩法,包括其他的性能指标,go tool 的其他命令,profile 文件的可视化等。这个留给读者自行扩展阅读。

本文主要参考了 Russ Cox 大神的文章:《Profiling Go Programs》 (go.dev/blog/pprof)… 文章为反驳 "Go性能不如其他语言"的观点,借助 pprof 大幅度优化了程序的运行时间和内存。

以上就是Go 库性能分析工具pprof的详细内容,更多关于Go pprof性能分析的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Go库性能分析工具pprof

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Go库性能分析工具pprof

这篇文章主要为大家介绍了Go库性能分析工具pprof,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-12-15

go性能分析工具pprof的用途及使用详解

刚开始接触go就遇到了一个内存问题,在进行内存分析的时候发现了一下比较好的工具,在此留下记录,下面这篇文章主要给大家介绍了关于go性能分析工具pprof的用途及使用的相关资料,需要的朋友可以参考下
2023-01-06

Go 性能分析神器:揭秘 Go pprof

go 性能分析神器 pprof 允许开发人员分析程序的性能,并优化 cpu 使用情况。首先安装 pprof 工具,然后通过 --cpu-profile 标志运行程序生成剖析文件。使用 pprof 命令分析剖析文件,常见的命令包括显示命令行界
Go 性能分析神器:揭秘 Go pprof
2024-04-08

Golang pprof性能测试与分析讲解

刚开始接触go就遇到了一个内存问题,在进行内存分析的时候发现了一下比较好的工具,在此留下记录,下面这篇文章主要给大家介绍了关于go性能分析工具pprof的性能测试,需要的朋友可以参考下
2023-05-14

OpenHarmony性能分析工具Bytrace

bytrace是开发人员用于追踪进程轨迹、查看性能的一种工具,主要对内核ftrace进行了封装和扩展,来支持用户态的打点。

OpenHarmony性能分析工具之Hiperf

本篇给大家介绍OpenHarmony性能分析工具hiperf的相关知识。希望能够帮助到你!

Linux 性能分析工具汇总

本文档主要是结合Linux 大牛,Netflix 高级性能架构师 Brendan Gregg 更新 Linux 性能调优工具的博文,搜集Linux系统性能优化相关文章整理后的一篇综合性文章,主要是结合博文对涉及到的原理和性能测试的工具展开说
Linux工具2024-12-01

MySQL ORM框架的数据库性能分析工具

MySQL ORM框架的数据库性能分析工具主要用于监控和评估数据库的性能。以下是一些建议的工具:MySQL Workbench:这是一个官方的MySQL管理工具,它集成了数据库设计、管理、查询、开发等功能。其中,Performance Da
MySQL ORM框架的数据库性能分析工具
2024-10-05

使用数据库工具分析数据库性能,你会吗?

我们可以利用Visual Studio的性能探测工具来分析和优化EF生成的SQL语句。这个工具可以提供更深入的洞察和优化建议,以帮助我们提高应用程序的性能。

Linux性能分析工具有哪些

Linux性能分析工具有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章。本文也可以作为检验基础知
2023-06-15

Java中有哪些性能分析工具

今天就跟大家聊聊有关Java中有哪些性能分析工具,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。VisualVMVisualVM是一个资源分析工具,一直从JDK 6更新到7。它默认内存
2023-06-17

性能分析工具Systrace如何使用

这篇“性能分析工具Systrace如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“性能分析工具Systrace如何使用
2023-07-05

Linux主机性能瓶颈分析工具

在Linux系统中,性能瓶颈分析是一个重要的任务,它可以帮助我们了解系统的运行状态,找出并解决性能问题。以下是一些常用的Linux性能瓶颈分析工具:perf简介:perf是一个强大的Linux性能分析工具,它能够进行函数级和指令级的热点查
Linux主机性能瓶颈分析工具
2024-09-27

Android性能分析工具TraceView怎么用

要使用TraceView进行Android性能分析,可以按照以下步骤进行操作:在Android Studio中打开项目,并确保已经连接到要分析的设备或模拟器。在项目的代码中选择要进行性能分析的方法或代码段,插入以下代码:Debug.star
2023-10-23

8 种用于前端性能分析工具

即使在最差的网络带宽上,也需要确保页面尽快加载。但这个说起来容易做起来难。为了能帮助更好的实现这一目标,这里推荐了几个性能分析工具。

Lighthouse —— 优秀的网页性能分析工具

Lighthouse可以直接集成到Chrome开发者工具中,也可以在Node.js环境中使用。在使用Lighthouse时,用户可以选择要分析的页面、设备类型(桌面或移动)以及要分析的方面(性能、可访问性、最佳实践等)。

Kubernetes Pod应用性能分析工具 Kubectl Flame

在Kubernetes集群中运行的应用程序上执行分析时,甚至更加困难。需要部署一个包含配置文件修改的新容器映像,而不是当前正在运行的容器。此外,当应用程序重新启动时,某些性能问题可能会消失,这使调试变得困难。

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录