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 | 京东云技术团队

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

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

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

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

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

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

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

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

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

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

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

    2024年02月03日
    浏览(50)
  • 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日
    浏览(32)
  • web 性能优化详解(Lighthouse工具、优化方式、强缓存和协商缓存、代码优化、算法优化)

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

    2024年02月07日
    浏览(45)
  • HTTPS加密协议详解:HTTPS性能与优化

    前文讨论了HTTPS原理与优势:身份验证、信息加密与完整性校验等,且未对TCP和HTTP协议做任何修改。但通过增加新协议以实现更安全的通信必然需要付出代价,HTTPS协议的性能损耗主要体现如下: (1).增加延时 分析前面的握手过程,一次完整的握手至少需要两端依次来回两次

    2024年02月09日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包