三.高质量编程与性能调优实战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