性能优化分析工具| 青训营笔记

78 阅读3分钟

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

一、本堂课的重点内容

image.png

二、详细知识点如下

1、简介

性能调优的原则: 要依靠数据而不是靠猜测 要定位最大瓶颈而不是细枝末节 不要过早优化 不要过度优化

2、pprof——用于可视化和分析性能数据的工具

1)功能

image.png

2)实战
CPU 问题

命令行分析 go tool pprof "http://localhost:6060/debug/pprof/profile?seconds=10" 调用关系图,火焰图 go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/cpu"

topN 命令

查看资源占用最多的函数 image.png

思考

image.png 结论:flat==cum,函数中没有调用其他函数

flat==0,函数中只有其他函数的调用。

list 命令

根据指定的正则表达式查找代码行

list Eat

image.png

web命令

调用关系可视化

image.png

内存问题

排查堆内存问题 go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/heap" image.png

协程

goroutine泄露也会导致内存泄露。 排查协程问题 go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/goroutine"

image.png

说明: ①由上到下表示调用顺序 ②每一块代表一个函数,越长代表占用cpu的时间越长 ③火焰图是动态的,支持点击块进行分析 ④支持搜索,在source视图下搜索wolf

mutex-锁

临界区:在并发编程中,如果程序中的一部分会被并发访问或修改,那么,为了避免并发访问导致的意想不到的结果,这部分程序需要被保护起来,这部分被保护起来的程序,就叫做临界区。 mutex:如果很多线程同步访问临界区,就会造成访问或操作错误,这当然不是我们希望看到的结果。所以,我们可以使用互斥锁,限定临界区只能同时由一个线程持有。 排查锁问题 go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/mutex"

image.png

block-阻塞

排查阻塞问题 go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/block"

三、课后个人总结

耐心和信心是优化过程中必备的良好心理素质。在很多时候优化可能得出完全相反的结果,即性能反而更糟糕。这是非常正常的,优化路线可能很曲折漫长。有些热点需要长时间尝试不同的方法才能有效优化。

性能优化策略

  1. 空间换时间。各种cache如CPU L1/L2/RAM到硬盘,都是用空间来换时间的策略。这样把计算过程一步一步的保存或缓存下来,不需要每次用的时候再计算一遍,比如数据缓冲,CDN等。这样的策略还表现为冗余数据,比如数据镜象,负载均衡。
  2. 时间换空间。当空间成为瓶颈时,切分数据分批次处理,用更少的空间完成任务处理。如:上传大附件时经常用这种方式。
  3. 简化代码。最高效的程序就是不执行任何代码的程序,所以代码越少性能就越高。如:减少循环的层数,减少递归,在循环中少声明变量,少做分配和释放内存的操作,尽量把循环体内的表达式抽到循环外,条件表达的中的多个条件判断的次序等等
  4. 并行处理。用多个进程或者线程同时处理业务,缩短业务处理时间。

总之,根据2:8原则来说,20%的代码消耗80%的性能,找到那20%的代码,就可以优化对应的80%性能。

四、引用参考

zhuanlan.zhihu.com/p/265670936

www.testwo.com/blog/8320