指标
user(通常缩写为us),代表用户态CPU时间。注意,它不包括下面的nice时间,但包括了guest时间。
nice(通常缩写为ni),代表低优先级用户态CPU时间,也就是进程nice值被调整为1-19之间的CPU时间。
system(通常缩写为sys),代表内核态CPU时间。
idle(通常缩写为id),代表空闲时间。注意,它不包括I/O等待时间(iowait)。
iowait(通常缩写为wa),代表CPU空闲担仍有未完成的I/O请求的时间
irq(通常缩写为hi),代表处理硬中断的CPU时间。
softirq(通常缩写为si),代表处理软中断的CPU时间。
steal(通常缩写为st),代表当系统运行在虚拟机中的时候,被其他虚拟机占用的CPU时间。
guest(通常缩写为guest),代表通过虚拟化运行其他操作系统的时间,也就是运行虚拟机的CPU时间。
工具Perf
perf top
输出结果中,第一行包含三个数据,分别是采样数(Samples)、事件类型(event)和事件总数量(Event count)。比如这个例子中,perf 总共采集了 833 个 CPU 时钟事件,而总事件数则为 97742399。另外,采样数需要我们特别注意。如果采样数过少(比如只有十几个),那下面的排序和百分比就没什么实际参考价值了。
再往下看是一个表格式样的数据,每一行包含四列,分别是:
第一列 Overhead ,是该符号的性能事件在所有采样中的比例,用百分比来表示。
第二列 Shared ,是该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等。
第三列 Object ,是动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动态链接库,而 [k] 则表示内核空间。
最后一列 Symbol 是符号名,也就是函数名。当函数名未知时,用十六进制的地址来表示。
还是以上面的输出为例,我们可以看到,占用 CPU 时钟最多的是 perf 工具自身,不过它的比例也只有 7.28%,说明系统并没有 CPU 性能问题。
perf record 和 perf report
在实际使用中,我们还经常为 perf top 和 perf record 加上 -g 参数,开启函数调用关系的采样,方便我们根据调用链来分析性能问题。例如观察某个具体的进程:perf top -g -p 21515。