性能优化工具使用| 青训营笔记

117 阅读2分钟

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

课堂笔记

本堂课重点内容

  • 性能优化的原则
  • pprof工具的使用

详细知识点介绍

简介

性能调优原则

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

性能分析工具pprof

说明

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

功能简介

  • 工具-Tool

    • runtime/pprof
    • net/http/pprof
  • 采样-Sample

    • CPU
    • 堆内存-Heap
    • 协程-Goroutine
    • 锁-Mutex
    • 阻塞-Block
    • 线程创建-ThreadCreate
  • 分析-Profile

    • 网页
    • 可视化终端
  • 展示-View

    • Top
    • 调用图-Graph
    • 火焰图-FlameGraph
    • Peek
    • 源码-Source
    • 反汇编-Disassemble

排查实战

源代码
 package main
 ​
 import (
     "log"
     "net/http"
     _ "net/http/pprof"
     "os"
     "runtime"
     "time"
 ​
     "github.com/wolfogre/go-pprof-practice/animal"
 )
 ​
 func main() {
     log.SetFlags(log.Lshortfile | log.LstdFlags)
     log.SetOutput(os.Stdout)
 ​
     runtime.GOMAXPROCS(1)
     runtime.SetMutexProfileFraction(1)
     runtime.SetBlockProfileRate(1)
 ​
     go func() {
         if err := http.ListenAndServe(":6060", nil); err != nil {
             log.Fatal(err)
         }
         os.Exit(0)
     }()
 ​
     for {
         for _, v := range animal.AllAnimals {
             v.Live()
         }
         time.Sleep(time.Second)
     }
 }
 ​
执行查看结果命令
 go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10"
CPU
  • 命令:top

查看占用资源最多的函数

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

    • 函数中没有调用其它函数
  • flat==0

    • 函数中只有其他函数的调用
  • 命令:list

根据指定的正则表达式查找代码行(topN已经定位到了最消耗资源的方法)

  • 命令:web

调用关系可视化

Heap-堆内存
 go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/heap"

会出现堆内存调用图

  • alloc_objects 程序累计申请对象数
  • alloc_space 程序累计申请内存大小
  • inuse_objects 程序当前持有对象数
  • inuse_space 程序当前占用内存大小
goroutine-协程

goroutine泄露也会导致内存泄露

 go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/goroutine"
mutex-锁
 go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/mutex"
block-阻塞
 go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/block"

疑问:为什么两个block只显示了一个

Dropped 4 nodes (cum<=1.41s)

丢弃了四个节点所以不显示

实践练习例子

课后个人总结

  • pprof的使用是需要调用本地端口,需要确认端口正确性
  • pprof有许多可视化的功能可以使用
  • 对block可能会出现漏掉分析的情况