这是我参与「第五届青训营 」伴学笔记创作活动的第 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可能会出现漏掉分析的情况