本文仅作为学习记录,非商业用途,侵删,如需转载需作者同意。
一、问题回顾
什么情况下使用perf工具的,perf工具给我们带来了哪些信息?
在调试网路延时的时候,我们使用了 ebpf 的工具之后,发现了节点上一个 CPU,也就是 CPU32 的 Softirq CPU Usage(在运行 top 时,%Cpu 那行中的 si 数值就是 Softirq CPU Usage)时不时地会增高一下。
在发现CPU Usage 异常增高的时候,肯定需要排查是什么程序导致的,这个时候就用到了 perf。
抓取数据,数据读取,异常聚焦三个步骤
第一步:抓取数据
# perf record -C 32 -g -- sleep 10
命令解释:
-C 32 指定只抓取CPU32执行的指令
-g 是指 call-graph enable 也就是记录函数调用关系
sleep 10 主要是为了让perf 抓取10秒钟的数据
然后使用 perf report 读取数据。
为了更直观的查看CPU32上的函数调用情况,做了一个火焰图(火焰图的生产方法,后续介绍)
火焰图中发现在softirq 里 TIMER softirq (run_timer_softirq) 占比很高,并且timer 主要处理的都是 estimation_timer() 这个函数,也就是看火焰图X轴占比比较大的函数。
第三步异常聚焦,找了异常占比中的异常函数,后续就重点关注这个函数的情况。
perf 可以在CPU Usage增高的节点上找到具体的引起CPU增高的函数,然后我们就可以有针对性的聚焦到那个函数分析。
二、如何理解perf的概念和工作机制
Perf 这个工具最早是 Linux 内核著名开发者 Ingo Molnar 开发的,它的源代码在内核源码tools 目录下,在每个 Linux 发行版里都有这个工具,比如 CentOS 里我们可以运行 yum install perf 来安装,在 Ubuntu 里我们可以运行 apt install linux-tools-common 来安装。
2.1、event
perf list
可以列出 event 信息
# perf list
…
branch-instructions OR branches [Hardware event]
branch-misses [Hardware event]
bus-cycles [Hardware event]
cache-misses [Hardware event]
cache-references [Hardware event]
cpu-cycles OR cycles [Hardware event]
instructions [Hardware event]
ref-cycles [Hardware event]
alignment-faults [Software event]
bpf-output [Software event]
context-switches OR cs [Software event]
cpu-clock [Software event]
cpu-migrations OR migrations [Software event]
dummy [Software event]
emulation-faults [Software event]
major-faults [Software event]
minor-faults [Software event]
page-faults OR faults [Software event]
task-clock [Software event]
…
block:block_bio_bounce [Tracepoint event]
block:block_bio_complete [Tracepoint event]
block:block_bio_frontmerge [Tracepoint event]
block:block_bio_queue [Tracepoint event]
block:block_bio_remap [Tracepoint event]
接下来我们就说三个主要的 event,它们分别是 Hardware event、Software event 还有 Tracepoints event。
2.2、Hardware event
Hardware event 来自处理器的一个PMU(Performance Monitoring Unit)这些event 数目不多,都是底层处理器相关的行为,perf 中会命名几个通用的事件,比如 cpu-cycles,执行完成的 instructions,Cache 相关的 Cache-misses。
后面感觉有些难,先不看了。。。