年前土拨鼠分享了一篇鸟窝老师写的 Pyroscope: 简单易用的持续分析 (Continuous profiling)服务器。今天土拨鼠带来一篇官方更生动的实例文章。本篇文章翻译自 Continuous Profiling for Go Applications[1]。翻译不当之处烦请指出。

源码地址:https://github.com/pyroscope-io/pyroscope/tree/main/examples/golang-push。

使用Pyroscope — 一个开源的持续分析平台

img

使用Pyroscope分析Golang Rideshare应用程序

在这个例子中,展示了一个基本的用例,即如何使用Pyroscope[2](一个开源的分析库)来加速Golang应用程序使用持续分析。

我们模拟了一家"拼车"公司,该公司在 main.go 中有三个路径endpoint(这里endpoint翻译参考 阮一峰[3] 写的RESTful API 设计指南[4]中的翻译):

  • /bike :调用 OrderBike(searchRadius) 函数来订购一辆自行车

  • /car :调用 OrderCar(searchRadius) 函数订购一辆汽车

  • /scooter :调用 OrderScooter(searchRadius) 函数来订购一辆踏板车

我还模拟在3个不同的区域运行3个不同的服务器(通过docker-compose.yml[5])

  • 美国东部-1

  • 美国西部-1

  • 欧洲西部-1

Pyroscope 最有用的功能之一是能够以对你有意义的方式标记数据。在本例中,我们有两个自然划分,因此我们"标记"我们的数据来表示它们:

  • 区域region:静态地标记运行代码的服务器的区域

  • 车辆vehicle:动态地标记路径(类似于标记控制器轨道的方式)

对区域进行静态标记

标记静态内容(如region)可以在 main() 函数的初始化代码中完成:

pyroscope.Start(pyroscope.Config{ApplicationName: "ride-sharing-app",ServerAddress:   serverAddress,Logger:          pyroscope.StandardLogger,Tags:            map[string]string{"region": os.Getenv("REGION")},})

在函数内进行动态标记

像我们为车辆vehicle标记的那样,可以在我们的实用函数FindNearestVehicle()中使用pyroscope.TagWrapper() 来动态地标记一些东西。

func FindNearestVehicle(search_radius int64, vehicle string) {pyroscope.TagWrapper(context.Background(), pyroscope.Labels("vehicle", vehicle), func(ctx context.Context) {// 模拟找到一辆车 Mock "doing work" to find a vehicle var i int64 = 0start_time := time.Now().Unix()for (time.Now().Unix() - start_time) < search_radius {i++}})
}

这块的功能是:

  1. 它添加了标签pyroscope.Labels("vehicle", vehicle)

  2. 它执行 FindNearestVehicle() 函数

  3. 在块结束之前,它(在幕后)从应用程序中移除了pyroscope.Labels("vehicle", vehicle),因为该块已经执行完成。

使用火焰图显示性能瓶颈

img

在分析应用程序的配置文件输出时,第一步是注意最大的节点,即应用程序消耗最多资源的地方。在本例中,它恰好是 OrderCar() 函数。

使用Pyroscope包的好处是,现在我们可以进一步研究为什么OrderCar()函数会有问题。标记regionvehicle使我们可以对两个很好的假设进行测试:

  • /car 路径的代码有问题

  • 我们的某个地区region有问题

要对此进行分析,我们可以从"Select Tag"下拉列表中选择一个或多个标签:

img

使用标签缩小性能问题的范围

知道 OrderCar() 函数存在问题后,我们会自动选择该标签。然后,在检查多个region标签后,通过查看时间线可以清楚地看出 us-west-1 区域存在问题,它在高 CPU 时间和低 CPU 时间之间交替。

我们还可以看到,mutexLock() 函数消耗了近 70% 的 CPU 资源。

img

比较两个时间段

使用Pyroscope的"比较视图-comparison view",我们可以从时间轴中选择两个不同的时间范围来比较生成的火焰图。左侧时间轴上的粉红色部分生成左侧火焰图,右侧的蓝色部分表示右侧火焰图。

当我们选择低 CPU 使用率周期和高 CPU 使用率周期时,我们可以看到 mutexLock() 函数中存在不同的行为 ,其中它在低 CPU 时间占用 33% 的 CPU,在高 CPU 时间占用 71% 的 CPU。

img

可视化两个火焰图之间约有 112% 的性能差异

虽然在这种情况下,差异是很显而易见的,但有时两个火焰图之间的差异最好通过相互叠加才能更好地可视化。无需更改任何参数,我们只需选择**(Diff View)差异视图选项卡**,即可查看颜色编码的差异火焰图中表示的差异。

img

更多用例

无论你是从事副业的开发人员,还是一个想知道"如何加快我的Go应用程序"的DevOps工程师,Pyroscope都有许多用例,可以轻松了解如何分析您的应用程序。下面是一些示例:

  • 标记 Kubernetes 属性

  • 标记控制器

  • 标记区域

  • 标记队列中的任务

  • 标记提交

  • 标记生产环境

  • 标记测试套件的不同部分

未来路线图

如果你想尝试此示例,并查看如何将其调整到您的Go应用程序,请单击github上此示例[6]的链接。持续分析已成为监视和调试性能问题(可以说是可观察性的第四个支柱)的日益流行的工具。

如果您对Pyroscope[7]如何改进有想法,请随时在GitHub页面上提交你的问题!感谢您的阅读。

参考资料

[1]

Continuous Profiling for Go Applications: https://betterprogramming.pub/continuous-profiling-go-applications-8cdbdfdfc5ab

[2]

Pyroscope: https://github.com/pyroscope-io/pyroscope

[3]

阮一峰: https://www.ruanyifeng.com/

[4]

RESTful API 设计指南: https://www.ruanyifeng.com/blog/2014/05/restful_api.html

[5]

docker-compose.yml: https://github.com/pyroscope-io/pyroscope/blob/main/examples/golang-push/rideshare/docker-compose.yml

[6]

github上此示例: https://github.com/pyroscope-io/pyroscope/blob/main/examples/golang-push/README.md

[7]

Pyroscope: https://pyroscope.io/


欢迎关注Go招聘公众号,获取Go专题大厂内推面经简历股文等相关资料可回复和点击导航查阅。

推荐一款不错的 Go 持续分析工具相关推荐

  1. 【转载】推荐5款超实用的.NET性能分析工具

    来源:http://www.csdn.net/article/2012-11-23/2812174-5-Good-and-useful-.NET-Profilers 虽然.NET框架号称永远不会发生内 ...

  2. 推荐一款快速上手的可视化分析工具:网易有数

    最近发现一款可视化分析工具叫网易有数. 虽然功能没有现在主流的tableua和finebi的丰富.但是操作简单暴力,可以称的上15分钟上手的BI工具.称得上真正意义上的敏捷工具. 这是网易有数制作的3 ...

  3. 全光谱护眼灯有哪些?推荐几款不错的全光谱灯

    全光谱护眼灯是近几年兴起的一个产品种类,主打的就是类太阳光的全光谱照明,使灯光下的物体色彩真实.自然,无限接近太阳光,从而达到使眼睛更舒适.保护眼睛的目的. 所谓全光谱,就是指灯光的色谱成分无限接近太 ...

  4. 推荐一款好用的redis客户端工具

    为什么80%的码农都做不了架构师?>>> 推荐一款好用的redis客户端工具 redis官方客户端(redis-cli)每次都要指定连接IP与端口,连接成功后还要执行auth命令进行 ...

  5. 一款全面高效的日志分析工具,操作更简单

    一款全面高效的日志分析工具,操作更简单     Eventlog Analyzer是用来分析和审计系统及事件日志的管理软件,能够对全网范围内的主机.服务器.网络设备.数据库以及各种应用服务系统等产生的 ...

  6. 推荐一款非常强大的扒站工具

    在平时的开发或者学习的过程中,我们难免会看到一些让人心动的网站,于是自己想把它弄下来,自己手工一个文件一个文件把它保存下来不太可能,那得累死你,下面我推荐一款扒站的神器,可以把你所喜欢的目标网站整个网 ...

  7. 推荐一款制作H5页面的可视化工具

    推荐一款制作H5页面的可视化工具 无需写代码,可视化H5页面制作编辑器.使用JS写的,直接谷歌浏览器打开即可使用. 无需写代码,可视化H5页面制作编辑器.使用JS写的,直接谷歌浏览器打开即可使用. 下 ...

  8. 推荐一款好用的CopyTranslator 翻译工具

    这次作为一个搬运工,推荐一款非常好用的翻译工具,相信这将是阅读文档的好帮手. 简介 前言 科研人员总少不了阅读大量文献,理解文献内容就成了科研生活常态,而我们平时复制PDF内容黏贴到网页翻译的时候可能 ...

  9. 【网络安全】一款针对Flutter的逆向工程分析工具

    关于reFlutter reFlutter是一款功能强大的逆向工程分析工具,该工具主要针对的是Flutter应用程序.该框架使用了已编译且重新封装的Flutter库来帮助广大研究人员对Flutter应 ...

最新文章

  1. openssl创建CA、申请证书及其给web服务颁发证书
  2. 五分钟了解先验概率和后验概率
  3. 1_STM32cubeIDE_黑色主题修改图标,vscode代码模板制作,GPIO(通用输入输出)
  4. 12月25号 Category类别
  5. pytorch保存和加载模型state_dict
  6. win10软件拒绝访问删不掉_Win10右键菜单添加“获取文件管理员权限”选项
  7. 【晒出你的第83行代码】剑指星辰,两位开发者贴出了小试牛刀的毕设代码
  8. C++实现二维码扫码登录
  9. 计算机四级笔试1,9月全国计算机等级考试四级网络工程师笔试试卷(1)
  10. regsvr32 命令小集注册OCX控件,注册控件
  11. matlab 平滑曲线连接_MATLAB数字图像处理-识别广告牌上的文字
  12. 天和流量王v4.69官方版-2011最新绿色版(增加网站流量工具)
  13. 2021年山东省职业院校技能大赛中职组网络安全赛项竞赛样题
  14. LANDESK桌面管理软件
  15. 初代网红绿茶餐厅闯关IPO:翻台率萎靡、上市难回春
  16. 2021-04-29 微信登录简易版
  17. 在Devil的软件三角中管理成功; 项目,项目经理和开发人员
  18. 装饰者(Decorator)模式
  19. 计算机 实验室安全准入制度,实验室安全准入制度
  20. 面对未来,我在黑夜中努力奔跑.

热门文章

  1. 基于webrtc的小型直播平台
  2. 【H - Pots】
  3. Unity触摸屏TouchPhase多点触碰旋转放大缩小
  4. Pinia全新一代状态管理工具Pinia-Vue3全家桶
  5. JS中的arguements到底是个啥?
  6. 计算机word题如何设置加宽,职称计算机考试Word习题16
  7. 西门子200与计算机通讯,S7 200与电脑通讯不上-工业支持中心-西门子中国
  8. Xbox One的Unity在这里!
  9. 高性能web平台【OpenResty入门与实战】
  10. Node.js中LTS和Current的两种版本有啥区别?