三.高质量编程与性能调优实战3 | 青训营笔记

40 阅读2分钟

三.高质量编程与性能调优实战3

性能调优原则:

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

性能分析工具 pprof

应用此工具可以知道在什么地方耗费了多少CPU, Memory

同时, 此工具也可以用于可视化和分析性能分析数据

实战:

1.搭建 pprof 实践项目

代码:

 func main() {
     log.SetFlags(log.Lshortfile | log.lstdFlags)
     log.SetOutput(os.Stdout)
     
     runtime.GOMAXPROCS(1) // 限制CPU使用树
     runtime.SetMutexprofileFraction(1) // 开启锁调用跟踪
     runtime.SetBlockProfileRate(1) // 开启阻塞调用跟踪
     
     go func() {
         // 启动 http server
         if err := http/ListenAndServe(":6060", nil); err != nil {
             log.Fatal(err)
         }
         os.Exit(0)
     }()
 }

注意:

要提前下载项目代码, 能够编译运行

同时会占用1CPU核心和超过1GB的内存

常用命令:

CPU

  • topn
  • 作用: 查看占用资源最多的函数

flat 当前函数本身的执行耗时

flat% flat占CPU总时间的比例

sum% 上面每一行的 flat% 总和

cum 指当前函数本身加上其调用函数的总耗时

cum% cum 占 CPU 总时间的比例

  • list
  • 作用: 根据指定的正则表达式查找代码行
  • web
  • 作用: 调用关系可视化

goroutine 协程

注意: goroutine泄露也会导致内存泄漏

采样过程和原理

CPU

  • 采样对象: 函数调用和它们占用的时间
  • 采样率: 100次/秒, 固定值
  • 采样时间: 从手动启动到手动结束

开始采样 -> 设定信号处理函数 -> 开启定时器

停止采样 -> 取消信号处理函数 -> 关闭定时器

Heap 堆内存

  • 采样程序通过内存分配器子啊堆上分配和释放的内存, 记录分配/释放的大小和数量
  • 采样率: 每分配512KB记录一次, 可在运行开头修改, 1为每次分配君记录
  • 采样时间: 从程序运行开始到采样时
  • 采样指标: alloc_space, alloc_objects, inuse_space, inuse_objects
  • 计算方式: inuse = alloc - free