性能调优指南(上)|青训营笔记

119 阅读3分钟

性能调优指南

今天是我参加青训营的第五天

性能调优原则

要依靠数据不是猜测

要定位最大瓶颈而不是细枝末节

不要过早优化

不要过度优化

性能分析工具pprof

pprof功能简介

Pprof是golang内置的性能分析工具,在进行性能问题分析时使用,我们在进行golang开发时,可以经常用它来调试应用的性能。
当程序性能不加时,我们希望知道应用在什么地方,消耗了多少CPU,memory等资源,golang是非常注重性能的语言,它内置的Pprof就是为了分析调优程序运行性能而生。

Pprof主要模块介绍

CPU profile: 当前程序的CPU使用情况,pprof按照一定频率去采集应用程序在CPU和寄存器上面的数据

Memory Profile(Heap Profile): 当前程序的内存使用情况,可查看heap和alloc的情况

> Block Profiling: 程序当前goroutines不在运行状态的情况,可以用来分析和查找死锁等性能瓶颈

Goroutine Profiling: 程序当前goroutines的使用情况,查看所有goroutine,产看调用关系,可发现未释放的go进程

pprof 引入

这里介绍最常用的一种方法 HTTPSever程序,通过Web界面可以查看指标

 
import (
   "fmt"
   "net/http"
   _ "net/http/pprof"
)
 
func main() {
   go func() {
      for {
         do("hello,world")
      }
   }()
 
   fmt.Println("启动服务器...")
   err := http.ListenAndServe(":8080", nil)
   if err != nil {
      panic(err)
   }
}
 
func do(s string) {
   s1 := make([]string, 0)
   for i := 0; i < 100; i++ {
      s1 = append(s1, s)
   }
}

运行上面的代码,访问 http://localhost:8080/debug/pprof/ ,就可以看到监控页面了

image.png

名词解释:

allocs: 过去所有内存分配的采样

block: 导致同步原语阻塞的堆栈跟踪

cmdline: 当前程序的命令行调用

goroutine: 所有当前goroutine的堆栈跟踪

heap: 活动对象的内存分配的采样。在获取堆样本之前,可以指定gc GET参数来运行gc。

metux: 争用互斥锁持有者的堆栈跟踪

profile: CPU配置文件。您可以在seconds GET参数中指定持续时间。获取配置文件后,使用go tool pprof命令调查配置文件

threadcreate: 导致创建新操作系统线程的堆栈跟踪

trace: 当前程序的执行轨迹。您可以在seconds GET参数中指定持续时间。获取跟踪文件后,使用go tool trace命令调查跟踪

小tips-什么是火焰图

火焰图(Flame Graph)是由 Linux 性能优化大师 Brendan Gregg 发明的,和所有其他的 profiling 方法不同的是,火焰图以一个全局的视野来看待时间分布,它从底部往顶部,列出所有可能导致性能瓶颈的调用栈。

火焰图整个图形看起来就像一个跳动的火焰,这就是它名字的由来:

  • 每一列代表一个调用栈,每一个格子代表一个函数

  • 纵轴展示了栈的深度,按照调用关系从下到上排列,最顶上格子代表采样时,正在占用 cpu 的函数。

  • 横轴的意义是指:火焰图将采集的多个调用栈信息,通过按字母横向排序的方式将众多信息聚合在一起。需要注意的是它并不代表时间。

  • 横轴格子的宽度代表其在采样中出现频率,所以一个格子的宽度越大,说明它是瓶颈原因的可能性就越大。

  • 火焰图格子的颜色是随机的暖色调,方便区分各个调用信息。

  • 其他的采样方式也可以使用火焰图, on-cpu 火焰图横轴是指 cpu 占用时间,off-cpu 火焰图横轴则代表阻塞时间。

  • 采样可以是单线程、多线程、多进程甚至是多 host,进阶用法可以参考附录进阶阅读