高质量编程与性能调优(三)|zo的笔记|青训营笔记

110 阅读3分钟

这是我参与「第五届青训营 」笔记创作活动的第4天。注:笔记大部分图片内容及代码段为青训营课程视频提供,仅交流,不得做个人使用

一、本节主要内容

性能优化分析工具

二、本节详细内容

本节主要介绍性能调优原则和pprof工具的功能说明、实践应用以及采样过程和原理。

简介

性能调优原则

要依靠数据不是猜测
要定位最大瓶颈而不是细枝末节
不要过早优化
不要过度优化

性能分析工具pprof

  • 说明 希望知道应用在什么地方耗费了多少CPU、Memory。 pprof是用于可视化和分析性能分析数据的工具

pprof功能简介 | pprof排查实战 | pprof的采样过程和原理

pprof功能简介

image.png

pprof排查实战
  • 搭建pprof实践项目
GitHub(来自Wolfogre) 
https: //github.com/wolfogre/go-pprof-practice 
项目提前埋入了一些炸弹代码,产生可观测的性能问题

image.png

image.png

  • 浏览器查看指标

image.png

默认情况不容易分辩内容,需要一些方向方便排查 image.png 主要针对学习这几个方面 image.png 可先通过任务管理器查看运行情况

image.png

pprof提供命令采集数据

go tool pprof "http:/localhost:6060/debug/pprof/profile?seconds=10" //设置10s时间情况下

image.png

当运行完成后,可使用topN命令 查看占用资源最多的函数

image.png

思考? image.png

Flat ==Cum,函数中没有调用其他函数| Flat==0,函数中只有其他函数的调用

使用list命令 根据指定的正则表达式查找代码行

image.png

可通过web命令,将调用关系在网页中打开可视化关系图

image.png

“解决”掉占用cpu的代码后,可以见到任务管理器中的变化。接下来我们针对内存消耗进行优化。

image.png

  • Heap堆内存 go tool pprof -http=: 8080 "http://localhost:6060/debug/pprof/heap" 使用时加上-http=: 8080参数以及/heap后缀可以得到直观的示意图 image.png VIEW工具栏提供多种不同的显示方式,可根据我们的需求选择。

Top视图 image.png Source视图 image.png

“解决”了占用内存过大的代码后 image.png

Sample工具栏提供各种类型占用查看 image.png

Source视图查看alloc space分配内存状况,发现待优化目标 image.png

  • goroutine 协程 goroutine泄露也会导致内存泄露

image.png

go tool pprof -http=: 8080 "http: //localhost:6060/debug/pprof/goroutine' 后缀改成goroutine 逻辑图 image.png flane火焰图 image.png

由上到下表示调用顺序
每一块代表一个函数,越长代表占用CPU的时间更长
火焰图是动态的,支持点击块进行分析

在Source视图下搜索woft协程,发现问题 image.png

注释问题代码后的携程数 image.png

  • mutex-锁 命令go tool pprof -http=:8080 "http:/localhost:6060/debug/pprof/mutex" graph和source视图结果 image.png 注释出问题的mutex后,mutex变为0 image.png 我们接下来继续解决block

  • Block-阻塞 命令go tool pprof -http=: 8080 "http://localhost:6060/debug/pprof/block" source视图 image.png

排查时的2个block,为什么此时只显示了一个 image.png pprof会自动默认过滤一些占比不重要的部分

若需要查看,可通过点击block按钮进入详细界面 image.png

  • 小结

重要部分 image.png