go pprof性能调优工具

news2024/11/26 16:38:26

go pprof

  • 一、性能调优原则
  • 二、pprof
    • 1、pprof 功能简介
    • 2、pprof 排查实战
      • 前置工作
      • a、CPU
      • b、Heap
      • c、goroutine
      • d、mutex
      • e、block
    • 3、pprof 的采样过程和原理
      • a、cpu
      • b、heap
      • c、goroutine && threadCreate
      • d、block && mutex
  • 三、调优流程
    • 1、业务优化
      • a、流程
    • 2、基础库优化
    • 3、go语言优化
  • 总结
  • 参考资料

go pprof简介

一、性能调优原则

  1. 依靠数据而不是猜测,分析cpu/memory/网络/磁盘io/goroutine/mutex等具体数据情况,来分析问题。
  2. 重点先行,根据优先级,应该先优化最大的性能瓶颈处,而不是细枝末节。
  3. 不要过早优化,毕竟现在项目开发模式为–小步快走+反复迭代,API容易过时。
  4. 不要过度优化,同样是项目小步快走+反复迭代,该API可能过时,也可能大改,过度优化会增加系统复杂度,且不一定后期能用。

二、pprof

性能调优依靠数据而不是猜测,我们希望应用在什么地方消耗多少cpu/memory等,才能使我们的分析问题更加快速和准确。
go自带的pprof工具不仅可以知道应用在什么地方消耗多少cpu/memory等,而且还能可视化,提高分析速度。

1、pprof 功能简介

在这里插入图片描述

2、pprof 排查实战

前置工作

  • 搭建pprof实践项目,Wolfogre,该项目针对cpu/memory等埋了很多累,可以让性能问题更加明显。
  • 需要1CPU核心+1G内存。

在这里插入图片描述

a、CPU

  • 采样数据,go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10"

1.top,查看函数占用资源的情况。
在这里插入图片描述

指标含义
flat当前函数本身的执行耗时
flat%flat占cpu总时间的比例
sum%上面每一行flat%的累计和
cumflat+调用其它函数的耗时
cum%cum占cpu总时间的比例

可以发现,
Eat耗时最严重,所以重点分析Eat源代码;
当flat == 0时,说明函数中只有调用其它函数的代码;
当flat == cum时,说明该函数没有调用其它函数。

2.list,查找指定函数代码行耗时。
在这里插入图片描述
可以发现,
耗时代码为一个for循环。

3.web,调用关系可视化。
在这里插入图片描述

b、Heap

  • 采样数据,go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/heap",以web的形式展示,而不是终端。
  • top图
    在这里插入图片描述
  • source图
    在这里插入图片描述
  • sample
    在这里插入图片描述
指标含义
alloc_objects累计申请对象数
alloc_space累计申请内存大小
inuse_objects当前持有对象数
inuse_space当前占用内存大小

c、goroutine

  • goroutine泄露会导致内存泄露。
  • 采样数据,go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/goroutine"
    在这里插入图片描述

d、mutex

  • 采样,go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/mutex"
    在这里插入图片描述
    在这里插入图片描述

e、block

  • 采样,go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/block"
    在这里插入图片描述
    在这里插入图片描述

3、pprof 的采样过程和原理

a、cpu

指标内容
采样对象函数调用占用时间
采样时间手动启动到手动结束
采样率100次/秒,固定值

采样简要流程,开始采样 > 设定信号处理函数 > 开启定时器 > 采样 > 停止采样 > 取消信号处理函数 > 关闭定时器 > 结束采样。

doing
os每10s向进程发送一次sigprof信号
进程每接收到sigprof信号就记录调用堆栈
写缓冲每100ms读取记录的调用栈写入输出流

b、heap

依赖内存分配器的记录数据,记录分配/释放的对象数量和内存大小。

指标内容
采样时间从程序开始采样的到当前直至结束整个过程
采样指标alloc_space
alloc_objects
inuse_space
inuse_objects
采样率每分配512kb记录一次,可在运行开头修改,1为每次分配均记录
计算方式inuse = alloc - free

c、goroutine && threadCreate

  • goroutine,记录用户发起且在运行中的goroutine。Stop the world > 遍历allg切片 > 输出创建g的堆栈 > start the world.
  • threadCreate,记录程序创建的所有系统线程的信息。Stop the world > 遍历allm链表 > 输出创建m的堆栈 > start the world.

d、block && mutex

  • block,采样阻塞操作的次数和耗时,阻塞耗时超过阈值的才会被记录,1为每次阻塞均记录。
    在这里插入图片描述
  • mutex,采样争抢锁的次数和耗时,只记录固定比例的锁操作,1为每次加锁均记录。
    在这里插入图片描述

三、调优流程

对逻辑相对复杂的程序如何进行性能调优?优化哪些部分?调优流程如何?

  • 业务服务优化,具体业务,如点赞评论。
  • 基础库优化,如日志库。
  • Go语言优化。

1、业务优化

基本概念含义
服务能单独部署,承载一定功能的程序
依赖service A的功能实现依赖service B的响应结果,称service A 依赖service B
调用链路能支持一个接口请求的相关服务集合及相互之间的依赖关系
基础库公共的工具包、中间件

在这里插入图片描述

a、流程

  • 建立服务性能评估手段
角度内容
性能评估方式单独的benchmark无法满足复杂的逻辑分析
不同负载情况下表现会有差异
请求流量构造不同请求参数覆盖的逻辑不同
线上真实的流量情况
压测范围单机器压测
集群压测
性能数据采集单机性能数据
集群性能数据
  • 分析数据,定位性能瓶颈
    根据压测报告数据,结合火焰图,来定位性能瓶颈代码处。可能是使用库规范;高并发场景优化不足(无意义的同步操作);
  • 重点优化改造
    以正确性为基础,录制优化前的响应,对比优化后的响应。
  • 优化效果验证
    优化完成后,再次压测,根据压测报告的情况,才能发布上线,并关注线上运行是否有响应的优化效果。关注服务监控 > 逐步放量 > 收集性能数据。

注:进一步优化,则是看一个接口服务的整条链路,分析并优化。

2、基础库优化

  • 统计基础库使用占比
  • 分析基础库核心逻辑和性能瓶颈
  • 内部压测验证
  • 推广业务服务落地验证

3、go语言优化

  • 优化内存分配策略,如gc时的内存分配与回收,根据自己的业务运行统计数据来具体分析。
  • 优化代码编译流程,生成更高效的程序,函数内联,逃逸分析等。
  • 内部压测验证
  • 推广业务服务落地验证

注:go语言优化,接入简单,只需用新sdk编译并运行程序,且通用性强。

总结

  1. 性能优化原则,依靠数据而不是猜测。
  2. pprof工具使用,针对cpu/memory等数据进行采集,基于数据去可靠分析。
  3. 根据pprof采集到的数据,利用top/source/graph等方式灵活分析问题。
  4. pprof采用过程和原理。
  5. 性能调优要保证正确性,且先定位最大性能你瓶颈。

参考资料

[1] pprof实战代码
[2] pprof实战

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/475377.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023.4.17-4.23 AI行业周刊(第146期):创业要趁早

最近有很多外部拓展培训的需求,联盟的共学课程培训,公司视觉软件的培训,行业课程的培训,每一项培训听起来简单,但是其实都需要大量的时间精力。 前两年也准备过一份《30天入门人工智能》的视频课程,总共31…

Ansible自动化部署工具|各个模块的使用

Ansible自动化部署工具|各个模块的使用 一、自动化运维工具—Ansible二、安装Ansible查询webserver组中主机的日期 三 Ansible常用模块(1) ansible命令行模块(2) command模块(3) shell模块(4) cron模块(5) user模块(6) grup模块(7) copy模块(8) file模块(9) ping模块(10) servi…

内网穿透NPS和宝塔Nginx配合使用,开启SSL访问本地局域网网络

并非为了教学,仅供自己记录,方便下次用。所以内容不会刻意花时间写的很细节详细。 1. 服务器NPS配置 NPS install安装后,配置文件会在其他位置,通过是 /etc/nps/nps.conf目录。 找到进行修改,主要修改的是http_proxy_p…

【flask】三种路由和各自的比较配置文件所有的字母必须大写if __name__的作用核心对象循环引用的几种解决方式--难Flask的经典错误

三种路由 方法1:装饰器 python C#, java 都可以用这种方式 from flask import Flask app Flask(__name__)app.route(/hello) def hello():return Hello world!app.run(debugTrue)方法2: 注册路由 php python from flask import Flask app Flask(__name__)//app…

【以太坊 Solidity】管理员读写权限/访问控制/角色控制

摘要 在 Solidity 语言的多继承中,若多个合约共同继承一个父合约,则这多个合约 共享 父合约中的变量和函数。 1.测试的智能合约 合约继承路线如下: #mermaid-svg-DtimeTjOch5CJh50 {font-family:"trebuchet ms",verdana,arial,s…

应用,auto,内联函数

6.引用&#xff1a; //指针 int main() {int a 0;int& b a;int& c b;int& d c;cout << &a << endl;cout << &b << endl;cout << &c << endl;cout << &d << endl;b;d;cout << a <<…

WEB攻防通用漏洞跨域CORS资源JSONP回调域名接管劫持

目录 一、同源策略&#xff08;SOC&#xff09; 二、跨域资源&#xff08;COSP&#xff09; 三、回调跨域&#xff08;JSOP&#xff09; 四、CORS资源跨域-敏感页面原码获取 五、JSONP 回调跨域-某牙个人信息泄露 六、子域名劫持接管 一、同源策略&#xff08;SOC&#x…

C#手麻系统源码, 基于前端Winform+后端WCF +sqlserver 开发

手麻系统源码&#xff0c;自动生成电子单据 基于C# 前端框架&#xff1a;Winform后端框架&#xff1a;WCF 数据库&#xff1a;sqlserver 开发的手术室麻醉临床信息系统源码&#xff0c;应用于医院手术室、麻醉科室的计算机软件系统。该系统针对整个围术期&#xff0c;对病人…

Buffer Pool介绍

Buffer Pool基本概念 Buffer Pool&#xff1a;缓冲池&#xff0c;简称BP。其作用是用来缓存表数据与索引数据&#xff0c;减少磁盘IO操作&#xff0c;提升效率 Buffer Pool由 缓存数据页(Page) 和 对缓存数据页进行描述的控制块 组成, 控制块中存储着对应缓存页的所属的 表空…

English Learning - L3 综合练习 1 VOA-Color 2023.04.26 周三

English Learning - L3 综合练习 1 VOA-Color 2023.04.26 周三 主题整体听一遍精听句子 1扩展 way of doing | way to do sth 句子 2扩展 Expression扩展 base 句子 3句子 4扩展 red-hot 句子 5句子 6扩展 fiery 句子 7句子 8句子 9句子 10句子 11扩展 born 句子 12句子 13句子…

Haar特征和级联分类器目标检测介绍及应用

文章目录 Haar特征和级联分类器目标检测介绍及应用1. Haar特征2. 级联分类器3. 实现步骤4.尝试训练自己的级联分类器4. 应用示例 Haar特征和级联分类器目标检测介绍及应用 Haar特征和级联分类器是一种经典的目标检测算法&#xff0c;适用于检测物体在图像中的位置、大小和姿态…

卷积神经网络算法解读

神经网络算法解读 机器学习流程&#xff1a; 数据获取特征工程建立模型评估与应用 图像数据是一个矩阵300 * 100 * 3 线性函数分类方法&#xff1a;分类&#xff08;wxb线性回归&#xff09; 损失函数&#xff1a;预测值与实际值之间的差异值 softmax分类器&#xff1a; 神…

(Python)Jupyter Notebook无法运行代码,且提示error和自动保存失败时如何操作?无法链接内核?

目录 一、报错情形 1、运行代码时跳转下一行&#xff0c;无法执行代码。 2、在修改文件名是提示失败&#xff0c;出现“error”字样。 二、深层原因 三、解决方案 四.建议使用原环境 Anaconda的Jupyter Notebook作为优秀的网页编辑器&#xff0c;非常适用于编写Python程序…

ubuntu16.04升级到20.04后报错 By not providing “FindEigen.cmake“

编译问题&#xff1a; CMake Error at modules/perception/lidar/CMakeLists.txt:14 (find_package): By not providing "FindEigen.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "Eigen&…

黑马Redis入门到实战(基础篇)

Redis基础篇 Redis的类型和常见命令以及客户端使用 目录 1 .初识Redis 1 .1 .认识NoSQL 1 .1 .1 .结构化与非结构化 1 .1 .2 .关联和非关联 1 .1 .3 .查询方式 1 .1 .4 .事务 1 .1 .5 .总结 1 .2 .认识Redis 1 .3 .安装Redis 1 .3 .1 .依赖库 1 .3 .2 .上传安装包并解压 1 .3 .…

音视频八股文(8)-- h264 AnnexB三层结构

NALU(Network Abstract Layer Unit) ⾳视频编码在流媒体和⽹络领域占有重要地位&#xff1b;流媒体编解码流程⼤致如下图所示&#xff1a; H264简介 H.264从1999年开始&#xff0c;到2003年形成草案&#xff0c;最后在2007年定稿有待核实。在ITU的标准⾥称为H.264&#xff0c…

使用QtInstallerFramework制作安装包总结

一、linux下使用QtInstallerFramework制作安装包 4.0.1版本的QtInstallerFramework-linux-x64.run在linux中运行报错&#xff1a; libdbus-1.so.3 no version information availabe 换成3.0.4版本的就好了&#xff1a;https://download.qt.io/official_releases/qt-installer-…

GEE:MODIS计算遥感指数(NDVI、BSI、NDSI、EVI、LSWI、SIPI、EBI等)

作者:_养乐多_ 本文将介绍如何使用Google Earth Engine(GEE)进行遥感影像分析,具体地,使用MODIS数据集计算和可视化几种植被指数,以评估植被生长的状况,或者作为随机森林分类器训练需要的特征变量。 主要包括,NDVI、BSI、NDSI、EVI、LSWI、SIPI、EBI等。 NDVI(Normal…

【PCIE体系结构六】TLP路由

&#x1f449;个人主页&#xff1a;highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 参考书籍&#xff1a;PCI_Express体系结构导读 目录 TLP路由 地址路由 ID路由 隐式路…

介绍一款idea神级插件【Bito-ChatGPT】而且免费!

什么是Bito&#xff1f; Bito是一款在IntelliJ IDEA编辑器中的插件&#xff0c;Bito插件是由ChatGPT团队开发的&#xff0c;它是ChatGPT团队为了提高开发效率而开发的一款工具。ChatGPT团队是一支专注于自然语言处理技术的团队&#xff0c;他们开发了一款基于GPT的自然语言处理…