高质量编程与性能调优实战(2)|青训营笔记

108 阅读3分钟

这是我参与「第五届青训营 」笔记创作活动的第3天

性能分析工具 pprof

可以帮助我们知道应用在什么地方耗费了多少CPU、内存

同时它也是一个用于可视化和分析性能分析数据的工具

image.png

项目实战 pprof-排查实战

编译运行ing

image.png

可用的程序运行采样数据,直接在url后加上就行

image.png

实际运行效果

image.png

直接点击对应链接即可查看相应数据

image.png

具体排查——CPU

直接在终端使用以下命令来查看CPU使用情况(采集10s)

go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10"

输入命令后,进入了(pprof)终端,如图:

image.png

top命令:查看占用资源最多的函数

image.png

  • flat:当前函数本身执行耗时
  • flat%:flat占CPU总时间的比例
  • sum%:上面一行的flat%总和
  • cum:指当前函数本身加上其调用函数的总耗时
  • cum%cum占CPU总时间的比例

ps注意两个关键点

Flat == Cum:函数中没有其他调用,消耗都来自于自身函数逻辑

Flat == 0:函数中只有其他函数调用

命令:LIST + 函数

根据指定正则表达式查找代码行

效果:可以看到存在一个啥也不干的循环,所以我们直接去注释掉它

image.png 注释之后,再次用top命令查看,如图,显然耗费时间要少多了

image.png

命令:web

实现调用关系可视化

如图:邮电问题(。。

具体排查——堆内存

可视化貌似邮电问题,推荐第二条命令,与CPU类似,我们直接继续使用top命令来查看内存使用情况,然后再用list+函数,如图:

go tool pprof -http=:8080 "http//localhost:6060/debug/pprof/heap"//可视化
go tool pprof http://localhost:6060/debug/pprof/heap

image.png

将对应代码注释掉,就可以优化占用内存的问题

具体排查——协程、锁(mutex)

命令与CPU和内存类似 只要将命令后缀换一下就行

——————————————分割线

1.16课程复习——作业

项目需求:

  1. 实现一个展示话题(标题,文字描述)和回帖列表的后端http接口;
  2. 本地文件存储数据

Web框架

Gin

link.juejin.cn/?target=htt…

go Web框架的简单使用

详细请参考官方说明文档,还有简体中文版,太棒了

记录搭建一个简单的Demo

注意创建新的go文件时,要创建go.mod文件

package main
​
import "github.com/gin-gonic/gin"func main() {
    r := gin.Default()
    r.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "pong",
        })
    })
    r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}

快速入门 | Gin Web Framework (gin-gonic.com)

image.png

分层模型设计

数据层 数据Model,外部数据的增删改查,对service层透明

逻辑层 业务Entity,处理核心业务逻辑输出

视图层 视图view,外部和外部的交互逻辑

课后作业——暂时搁置,项目还用了数据库,但是课程里用的是文件。。再学学吧