如果我们想绘制系统在运行上述a.out进程的时候的off-cpu火焰图,我们可以先采集调度数据30秒,得到out.stacks: sudo offcputime-bpfcc -df -p `pgrep -nx a.out` 30 > out.stacks 接下来,我们进入clone下来的FlameGraph项目目录,用flamegraph.pl绘制火焰图: ./flamegraph.pl --color=io --title="Off-CPU ...
结合Off-CPU火焰图和wakeup火焰图,我们可以得到很多信息,那么是否有一种方式可以直接追踪整个过程呢?链图是一种实验性质的可视化方式,其将Off-CPU和wakeup堆栈关联起来,虽然开销会比较高,但是我们可以得到很多有用的信息。 Off-Wake Flame Graphs 作为尝试的第一步,我们可以将Off-CPU堆栈和单个wakeup堆栈进行关联。我们...
任务的切入意味着任务准备 ON CPU 了,也就是说这次的 OFF CPU 已经结束,只要获取到上面定义的 start_time , 就可以计算这次任务 OFF CPU 的总耗时。跟上面一样,定义一个处理切入的函数,除去最后一行 increment_ns ,逻辑就是:过滤 TGID。获取缓存,如果获取不到直接返回。根据从缓存拿到上次 OFF CPU 时的...
遇到CPU性能问题时,我们常常通过perf来了解CPU上到底在执行什么,以及通过On-CPU火焰图来帮助我们寻找性能瓶颈。但是,这种方式并不能让我们知道不在CPU上运行的进程和线程到底在做什么。在一些场景中,我们会发现CPU的使用率上不去,性能表现很差,这时候我们也许就需要考虑,是不是花在应用请求、异步调用这种Off-CPU的场...
On-CPU性能问题可以借助On-CPU火焰图解决,但是无法了解进程和线程不在CPU上运行所花费的时间。如果有很多的时间花在同步请求上,也会很容易影响性能表现。 下图是一种Off-CPU时间的情况: off-cpu event https://www.brendangregg.com/FlameGraphs/offcpuflamegraphs.html ...
在《宋宝华:火焰图:全局视野的Linux性能剖析》一文中,我们主要看了on-cpu火焰图,理解了系统的CPU的走向的分析。但是,很多时候,单纯地看on-cpu的情况(什么代码在耗费CPU),并不能解决性能问题,因为有时候性能差的原因瓶颈不一定在CPU上面,而是在off-cpu的时间,比如: ...
由于I/O大部分时间都是off-CPU时间,因此跟踪I/O是一种off-CPU分析。尽管有些I/O可能根本不会离开CPU,例如,文件系统缓存命中。为了生成火焰图,跟踪工具需要捕获导致I/O的I/O时间和堆栈跟踪或代码路径。对于堆栈跟踪,我们可以使用eBPF或perf。 Pay attention to the I/O context, whether it is synchronous to...
在《宋宝华:火焰图:全局视野的Linux性能剖析》一文中,我们主要看了on-cpu火焰图,理解了系统的CPU的走向的分析。但是,很多时候,单纯地看on-cpu的情况(什么代码在耗费CPU),并不能解决性能问题,因为有时候性能差的原因瓶颈不一定在CPU上面,而是在off-cpu的时间,比如: ...
在上方的火焰图中看虽然funcA、funcB、funcC、funcD、funcE这几个函数的耗时都挺长,但它们的耗时并不是自己用掉的。而且都花在执行子函数里了。我们真正应该关注的是火焰图最上方 caculate 这种又长又平的函数。因为它才是真正花掉 CPU 时间的代码。其它项目中也一样,拿到火焰图后,从最上方开始,把耗时比较...
遇到CPU性能问题时,我们常常通过perf来了解CPU上到底在执行什么,以及通过On-CPU火焰图来帮助我们寻找性能瓶颈。但是,这种方式并不能让我们知道不在CPU上运行的进程和线程到底在做什么。在一些场景中,我们会发现CPU的使用率上不去,性能表现很差,这时候我们也许就需要考虑,是不是花在应用请求、异步调用这种Off-CPU的场...