火焰图(Flame Graph)是由 Linux 性能优化大师 Brendan Gregg 发明的,和所有其他的 profiling 方法不同的是,火焰图以一个全局的视野来看待时间分布,它从底部往顶部,列出所有可能导致性能瓶颈的调用栈。
strace命令 是一个集诊断、调试、统计与一体的工具,我们可以使用strace对应用的系统调用和信号传递的跟踪结果来对应用进行分析,以达到解决问题或者是了解应用工作过程的目的。当然strace与专业的调试工具比如说gdb之类的是没法相比的,因为它不是一个专业的调试器。
- yum install perf
- perf record -F 999 -a -g -- sleep 10
- perf record -F 999 -p 834 -g -- sleep 20
- -F: 采样频率
- -a: 所有程序
- -g: 记录函数间的调用关系
- -p: 待分析进程的id
-
-
- https://github.com/brendangregg/FlameGraph下载FlameGraph 解压 然后进入FlameGraph目录
-
- perf script | ./stackcollapse-perf.pl | ./flamegraph.pl > out.svg 生成火焰图
-
- sz out.svg
cProfile 有多种调用方法,可以直接从命令行调用:
- python -m cProfile -s tottime your_program.py
-
其中的 -s 的意思是 sort。常用的 sort 类型有两个:
要获得对程序性能的全面理解,经常需要两个指标都看一下。
不过在这里,我们并不能直接使用命令行方式调用,因为我的代码中还需要一些比较繁重的配置加载,如果把这部分时间算进去了,多少有些干扰,那么我们也可以直接在代码中调用 cProfile。
使用 cProfile 的代码如下:
- import cProfile
- import io
- import pstats
-
-
- def on_start():
- '''
- 需要测试的代码
- '''
- pass
-
-
- pr = cProfile.Profile()
- pr.enable() # 开始收集性能分析数据
-
- on_start() # 需要测试的代码
- pr.disable() # 停止收集性能分析数据
-
- s = io.StringIO()
- sortby = "cumtime" # 仅适用于 3.6, 3.7 把这里改成常量了
- ps = pstats.Stats(pr, stream=s).sort_stats(sortby) # 打印数据
- # pr.dump_stats(r"requests.prof") # 把当前性能分析的内容写入一个文件
- ps.print_stats()
- print(s.getvalue())
下一步我们开始使用火焰图,可视化往往能让我们更容易注视到性能瓶颈
- import cProfile
- import io
- import pstats
-
-
- def on_start():
- '''
- 需要测试的代码
- '''
- pass
-
-
- pr = cProfile.Profile()
- pr.enable() # 开始收集性能分析数据
-
- on_start() # 需要测试的代码
- pr.disable() # 停止收集性能分析数据
-
- s = io.StringIO()
- # sortby = "cumtime" # 仅适用于 3.6, 3.7 把这里改成常量了
- # ps = pstats.Stats(pr, stream=s).sort_stats(sortby) # 打印数据
- pr.dump_stats(r"requests.prof") # 把当前性能分析的内容写入一个文件
- # ps.print_stats()
- # print(s.getvalue())
-
执行完在当前目录下会生成一个requests.prof文件
- pip3.8 install flameprof
-
- flameprof requests.prof > requests.svg # 转为可视化图
-
会生成requests.svg使用浏览器打开