iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Go库性能分析工具pprof
  • 532
分享到

Go库性能分析工具pprof

Gopprof性能分析Gopprof 2022-12-15 12:12:48 532人浏览 八月长安
摘要

目录场景pprof生成 profile 文件CPU 性能分析内存性能分析分析 profile 文件 && 优化代码Go tool pproftop 命令list 命令

场景

我们一般没必要过度优化 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性能分析的资料请关注编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: Go库性能分析工具pprof

本文链接: https://www.lsjlt.com/news/174927.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Go库性能分析工具pprof
    目录场景pprof生成 profile 文件CPU 性能分析内存性能分析分析 profile 文件 && 优化代码go tool pproftop 命令list 命令...
    99+
    2022-12-15
    Go pprof性能分析 Go pprof
  • go性能分析工具pprof的用途及使用详解
    目录pprof的用途利用runtime/pprof包实现cpu分析的步骤利用runtime/pprof包实现内存分析的步骤:利用net/http/pprof包进行性能分析总结&nbs...
    99+
    2023-01-06
    go性能分析工具 go 性能 go pprof 性能分析
  • Go 性能分析神器:揭秘 Go pprof
    go 性能分析神器 pprof 允许开发人员分析程序的性能,并优化 cpu 使用情况。首先安装 pprof 工具,然后通过 --cpu-profile 标志运行程序生成剖析文件。使用 p...
    99+
    2024-04-08
    go 性能分析
  • Golang pprof性能测试与分析讲解
    目录一、性能分析类型1.CPU性能分析2.内存性能分析3.阻塞性能分析二、cpu性能分析1.生成pporf2.分析数据三、内存性能分析四、benchmark 生成 profile一、...
    99+
    2023-05-14
    Go pprof性能测试 Go pprof性能分析
  • Linux性能分析工具有哪些
    Linux性能分析工具有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章。本文也可以作为检验基础知...
    99+
    2023-06-15
  • Android性能分析工具TraceView怎么用
    要使用TraceView进行Android性能分析,可以按照以下步骤进行操作: 在Android Studio中打开项目,并确保...
    99+
    2023-10-23
    Android
  • 性能分析工具Systrace如何使用
    这篇“性能分析工具Systrace如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“性能分析工具Systrace如何使用...
    99+
    2023-07-05
  • Java中有哪些性能分析工具
    今天就跟大家聊聊有关Java中有哪些性能分析工具,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。VisualVMVisualVM是一个资源分析工具,一直从JDK 6更新到7。它默认内存...
    99+
    2023-06-17
  • 使用SQLBooster工具分析Oracle性能问题
    问题现象 下午开发人员反映,一个测试环境数据库访问非常慢,让我帮忙分析原因。 正好刚装了 SQLBooster ,通过它来分析,顺便熟悉一下它的使用。 原因分析 获取等待事件 数据库慢的话首先看等...
    99+
    2024-04-02
  • linux性能分析工具dstat是怎样的
    本篇文章给大家分享的是有关linux性能分析工具dstat是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。linux性能分析图表dsta...
    99+
    2024-04-02
  • MySQL性能分析工具之PROFILE怎么用
    小编给大家分享一下MySQL性能分析工具之PROFILE怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! ...
    99+
    2024-04-02
  • 性能分析工具 之 Perfetto基本使用
            Perfetto是google从Android10开始引入的一个全新的平台级跟踪分析工具。适用于Android、Linux和Chrome的更加通用和复杂的用于性能检测和跟踪分析的生产级开源项目。在android系统中对性能分...
    99+
    2023-09-05
    android 性能优化
  • 性能分析工具Systrace的使用及说明
    目录Systrace介绍Systrace使用方法详解使用命令行捕获Systreace报告文件打开System报告查看报告元素键盘快捷键使用工具帮助定位性能问题检查界面帧和提醒Syst...
    99+
    2023-03-03
    性能分析工具 Systrace的使用 性能分析工具Systrace
  • 常用的Android性能分析工具有哪些
    常用的Android性能分析工具有以下几种: Android Studio Profiler:Android Studio自带的...
    99+
    2023-10-23
    Android
  • Linux各类性能分析工具用法详解
    文章目录 静态性能分析工具文件系统观测工具虚拟文件系统(VFS)分析工具磁盘管理工具进程资源占用监测系统库调用分析工具网络配置防火墙配置多路径配置进程调度系统命令操作查看硬件信息磁盘管理网络端...
    99+
    2023-09-02
    linux 运维 性能优化 自动化 监测
  • PHP 函数的性能分析工具有哪些?
    php 函数性能分析工具有助于识别瓶颈并改进代码。本文介绍了 xhprof(采样剖析)、tideways(商业平台)和 blackfire.io(saas 服务);实战案例展示了使用 x...
    99+
    2024-04-18
    php 性能分析工具
  • Netty分布式高性能工具类FastThreadLocal和Recycler分析
    目录概述第一节:FastThreadLocal的使用和创建首先我们看一个最简单的demo跟到nextVariableIndex方法中我们首先剖析slowGet()方法我们跟进fast...
    99+
    2024-04-02
  • Python性能分析工具pyinstrument提高代码效率
    目录安装简单的使用分析 Flask 代码分析 Django 代码分析异步代码工作原理最后的话天下武功,唯快不破。 编程也不例外,你的代码跑的快,你能快速找出代码慢的原因,你的码功就高...
    99+
    2024-04-02
  • Paddle模型性能分析工具Profiler怎么使用
    本篇内容介绍了“Paddle模型性能分析工具Profiler怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Paddle模型性能分析P...
    99+
    2023-07-05
  • PHP7下安装并使用xhprof性能分析工具
    目录安装 xhprof运行报错随机应变补充该 xhprof 版本是从 https://github.com/longxinH/xhprof 获取 安装 xhprof cd xhpr...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作