Golang 程序性能优化利器 PGO 详解(二):收集样本数据和编译

这篇具有很好参考价值的文章主要介绍了Golang 程序性能优化利器 PGO 详解(二):收集样本数据和编译。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在软件开发过程中,性能优化是不可或缺的一部分。无论是在Web服务、数据处理系统还是实时通信中,良好的性能都是至关重要的。Golang 从1.20版版本开始引入的 Profile Guided Optimization(PGO)机制能够帮助更好地优化 Go 程序的性能。

上篇文章讲解了 Golang PGO 的概念和使用方法,并且使用简单的示例演示了 PGO 的使用方法,本文详细讲解一下 PGO 相关的知识点。

收集 profile 数据

Go 编译器需要一个 CPU pprof 文件作为 PGO 的输入。由 Go 运行时生成的文件(也就是使用 runtime/pprof 和 net/http/pprof 包生成的文件,因为具备采集样本数据开销低、多系统兼容性强、Go 官方标准且被广泛使用等优点)可以直接作为编译器输入(其他性能分析工具例如 Linux perf 等生成的 profile 文件只要按照要求转化为 pprof 格式也是可以使用的)。

为了获得最佳结果,最好直接从生产环境中收集 profile 文件。如果收集的 profile 文件不是真实使用环境的,带来的性能提升可能会比较小。即使是从生产环境收集的 profile 文件,也要注意一定要有代表性,即能反映出生产环境的实际情况,以下几种情况是有问题的:

  • 在采集性能分析数据时服务处于空闲状态,即使这个服务大部分时间都是处于负载状态。
  • 每天不同时段的流量可能会不同,只采集了一个时段的数据。
  • 程序执行耗时比较久的任务的场景,例如,5分钟执行任务 A,然后5分钟执行任务 B。如果采集30秒的数据,可能只涵盖了一种操作类型。
  • 负载不均衡的场景,如果一个实例被分配的请求比较少。

比较好的的策略是在不同时段从不同实例收集多个 profile 文件,然后将多个文件合并为单个文件。Golang 提供的 pprof tool 可以合并多个文件,例如:

$ go tool pprof -proto a.pprof b.pprof > merged.pprof

如果从生产环境中收集 profile 比较困难或者根本就没办法收集(例如,分发给用户的命令行工具),也可以从有代表性基准测试中收集(需要注意的是,构建具有代表性的基准测试通常也是有一定难度的)。

使用 PGO 编译程序

收集到 profile 文件后,Golang 官方推荐的做法是将文件命名为 default.pgo,并且把 default.pgo 文件存放在程序主目录(main 包所在目录)下维护,以方便项目的其他开发者使用 default.pgo 来对程序做性能优化。默认情况下,go build 将检测 default.pgo 文件,如果检测到则启用 PGO。

对于更复杂的场景,可以使用 -pgo 参数来指定 PGO 配置文件的位置,默认为 -pgo=auto(Go 1.20 默认 -pgo=off )。例如:文章来源地址https://www.toymoban.com/news/detail-656133.html

$ go build -pgo=/tmp/foo.pprof。

到了这里,关于Golang 程序性能优化利器 PGO 详解(二):收集样本数据和编译的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 极致性能优化:前端SSR渲染利器Qwik.js | 京东云技术团队

    极致性能优化:前端SSR渲染利器Qwik.js | 京东云技术团队

    前端性能已成为网站和应用成功的关键要素之一。用户期望快速加载的页面和流畅的交互,而前端框架的选择对于实现这些目标至关重要。然而,传统的前端框架在某些情况下可能面临性能挑战且存在技术壁垒。 在这个充满挑战的背景下,我们引入了 Qwik.js 框架。Qwik.js 不仅

    2024年02月05日
    浏览(10)
  • Golang 程序漏洞检测利器 govulncheck(一):安装和使用方法

    govulncheck 是一个命令行工具,可以帮助 Golang 开发者快速找到项目代码和依赖的模块中的安全漏洞。该工具可以分析源代码和二进制文件,识别代码中对这些漏洞的任何直接或间接调用。 默认情况下,govulncheck 通过 Go 漏洞数据库 https://vuln.go.dev 提供的接口查询相关的模块是否

    2024年02月10日
    浏览(6)
  • Go RWMutex:高并发读多写少场景下的性能优化利器

    Go RWMutex:高并发读多写少场景下的性能优化利器

    原创文章,如需转载请联系 作者:陈明勇 公众号:Go技术干货 在这篇文章 Go Mutex:保护并发访问共享资源的利器 中,主要介绍了 Go 语言中互斥锁 Mutex 的概念、对应的字段与方法、基本使用和易错场景,最后基于 Mutex 实现一个简单的协程安全的缓存。而本文,我们来看看另

    2023年04月09日
    浏览(15)
  • 腾讯扣叮虚拟仿真实验室机器人自动导航+陨石样本收集

    腾讯扣叮虚拟仿真实验室机器人自动导航+陨石样本收集

    前言 本文为腾讯coding入门教程,具体为以下四步骤 一、自动导航的思路与操作 二、躲避障碍 三、陨石样本收集 四、退出事件 最终效果如下:     首先进入课程练习,找到中学Python的规则解读后点击大展身手进入 此时右侧右侧会出现背景和规则,主要是以下五个任务 本文

    2024年02月02日
    浏览(20)
  • 负样本\正样本对目标检测算法的性能影响

    最近,在做行人检测任务时,对数据进行清洗后,存在一些空标签的样本,所以,想考虑这些空标签的样本对模型的性能究竟有什么样的影响。 负样本:在目标检测任务中,数据集中部分图片没有出现目标,这些图片通常被称为负样本。 正样本:指包含目标的图像。 背景:

    2024年02月12日
    浏览(6)
  • 提升应用性能的关键步骤——UniApp性能优化策略与技巧详解

    提升应用性能的关键步骤——UniApp性能优化策略与技巧详解

    「作者主页」 :雪碧有白泡泡 「个人网站」 :雪碧的个人网站 chatgpt体验地址 描述:代码压缩和混淆是常用的性能优化手段。通过减小JavaScript、CSS和HTML文件的大小,可以降低加载时间和网络传输。 解释: 在构建UniApp应用时,确保开启代码压缩和混淆选项。 使用工具(如

    2024年02月03日
    浏览(48)
  • MySql 性能优化神器之 explain 详解

    MySql 性能优化神器之 explain 详解

    目录 一. 前言 二. explain 详解 2.1. 概念 2.2. 数据准备 2.3. id 2.3.1. id 相同,执行顺序由上至下 2.3.2. id 不同,数字越大优先级越高 2.3.3. id 存在相同的和不同的 2.4. select_type 2.5. table 2.6. partitions 2.7. type 2.7.1. system 2.7.2. const 2.7.3. eq_ref 2.7.4. ref 2.7.5. fulltext 2.7.6. ref_or_null 2.7.7. 

    2024年02月03日
    浏览(11)
  • web 性能优化详解(Lighthouse工具、优化方式、强缓存和协商缓存、代码优化、算法优化)

    web 性能优化详解(Lighthouse工具、优化方式、强缓存和协商缓存、代码优化、算法优化)

    优化性能概念宽泛,可以从信号、系统、计算机原理、操作系统、网络通信、DNS解析、负载均衡、页面渲染。只要结合一个实际例子讲述清楚即可。 Web 性能是客观的衡量标准,是用户对加载时间和运行时的直观体验。 Web 性能指页面加载到可交互和可响应所消耗的时间,以

    2024年02月07日
    浏览(11)
  • 详解视频美颜SDK:算法优化与性能提升

    详解视频美颜SDK:算法优化与性能提升

    众所周知,视频美颜SDK的算法优化和性能提升至关重要。下文小编将与大家深度探讨视频美颜SDK的算法原理,以及近期的性能优化措施。 一、常见用法 视频美颜SDK对人脸进行识别,并附加适当的美颜效果。例如: 1.识别、关键点 2.肤色调整 3.磨皮处理 4.瘦脸大眼 二、性能提

    2024年02月03日
    浏览(6)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包