Perf使用笔记

常用perf指令

perf event是内核的一部分,在tools/perf下面。

cmd:

perf record -e [probe] -ag
-a trace所有cpu
-g 追踪stack调用栈

data--写入-->perf.data文件

ctrl-c 停止追踪

perf report 显示分析报告

开销排序:

小| 统计/count 统计事件数量

| 采样

大| trace 收集事件细节

V

具体的使用方式可以查man

分类列出perf指令

列出:

perf list 列出所有event

perf list 'sched:* ' 列出某一类tracepoint

计数器:

perf stat 加各种参数

perf stat command (针对特定的指令或者PID)

-d 显示细节 details

-p PID

-a 记录所有东西‘

sleep 5 记录5秒

刨析/采样

perf record 同样加cmd或者-p PID 来监测特定的内容

-F 采样频率 单位Hz

-g 抓call stack

--call-graph dwarf 使用dwarf符号记录栈

关于"--"看起来似乎是加在带参数的command 之前的。

动态加探针

perf probe 指令

在 perf probe 的使用中,很多地方需要使用debug info。这是否意味着需要gcc -g?

[--add] tcp_sendmsg 在内核函数入口加tracepoint

-d/--del删除tp

-V 显示可用变量

perf probe似乎是在'probe:*'下增加了一个tracepoint. 可用再通过perf record使能和记录。

显示报告

perf report 报告形式输出

perf script 列出所有event记录(记录表 细节条目)

ftrace和perf

ftrace 是基于debugfs的一套前端

底层数据源也是tracepoint kprobe uprobe

常见套路:

perf-->采样刨析

|

v

热点函数-->ftrace定量分析-->调用过程

前端工具:

  1. debugfs

  1. trace-cmd---------->对debugfs的操作的封装

  1. perf-tools

可用追踪进程 函数 子函数

+++++++++++++++++++++++++

perf 采样 不能坐函数遍历

children

self

统计自己和子函数的比分比

只统计落在自己内的 子函数外的百分比

perf安装

使用perf可能会提示安装,按照提示安装即可,也可以从内核源码编译安装

所需要的symbols可能需要安装一些包或者开启内核配置选项来支持

关于symbols

->符号 帮助我们从地址映射到函数或者变量名,人们才能理解

-> 使用perf可能会提示安装包含symbols的debug包,多以'--dbgsym'结尾

->你可以检查编译系统配置以保留符号信息

->对于内核级别的符号,可以安装内核的debuginfo包或者使能CONFIG_KALLSYMS

Stack Traces

编译时不要省略frame pointers !!!

对GCC来讲 可用编译参数:

-fno-omit-frame-pointer

对内核来讲是:

CONFIG_FRAME_POINTER=y

没有FP 记录不了 代码回溯。可用用dwarf或者LBR来顶一顶,但是也不见得好用。

使能tracepoint

perf record -e 'sched:sched_process_*' -a sleep 5

Tracepoint不是使用采样/刨析来捕获?不受频率影响?

按频率采样CPU获得调用栈

perf record -F Hz

原理是创造周期中断事件 来让perf捕获 同时记录指针

事件源

software event

由perf提供 数量较少

softevent有default period 采样的时候是采集到一定的数量报一次(不然报太多了 你看stack有一个给你看就够了)可以通过perf record -vv看具体的。

PMC

硬件性能计数器 和处理器相关

实际上一般会复用寄存器 来记录不同的事件发生的次数。实现不同的功能。要配置。

应用场景:cpu cycles; cache miss之类

Kernel Trace point

内核中的代码埋点,可用于你的自己的trace工具开发,较稳定。

经由设计人员仔细考究,很常用。

USDT

用户层代码的静态埋点

需要先在环境中安装USDT的库,以dtrace为代表。【API 也比较稳定】

例如:apt install systemtap-sdt-dev

安装 dtrace

然后将已埋好USDT的API的代码与库一起编译

例如:./configure --with-dtrace

make -j64

Dtrace是USDT的代表,LTTng也有USDT

Dynamic Tracing

不稳定 因为是之间抓代码

通过 perf probe --add之间加tracepoint

可以在内核和程序运行时动态增加,在probe处运行一些新加的指令。

使用之前无开销,用完删了probe之后也无开销。

stat 统计 (PMC)

perf stat CMD 分析PMCs

常用指标“insns per cycles”即所谓的IPC。每周期指令数。

IPC高--->CPU吞吐高--->很好

IPC低--->stall多

需要注意有没有spin lock CPU 空转不干活。

可以通过perf stat -d 进一步看细节

比较有用的指标是:“stalled cycles per insns”

代表了mem和资源总线访问 代表了延时。越低越好。

剖析

Timed Profiling

按照一定的时间间隔采样 instruction pointer和stack trace

例: perf record -F 99 -a -g --sleep 30

【采样 99 赫兹而不是100赫兹是为了防止与某些周期任务冲突导致偏移】

Event Profiling

以硬件时间作为采样触发 而不是时钟

硬件事件可能在短时间内发生太多,每次都出发记录可能导致太大的开销。

所以一般用-C count的方式设置触发阈值。

在每次捕获这么多的事件后才记录一次stack。

例如: perf record -e Lrdxaxhe-load-misses -c 10000 -ag -- sleep 5

注意:

很多CPU会在触发采样后故意引入很小的延时以避免锁步

这对time profiling几乎没有影响 但是对于事件采样 会造成采样不准。

解决方法:所谓的“precise sampling”

不一定所有的PMC都支持精确采样,可以通过“perf record -vv”查看“precise_ip”的值来确认。

启用方法 在PMC事件后加“:p”

例如:“-e instructions:p”

static kernel tracing

tracepoint和其他静态事件也可以使用counter计数

例如:perf stat -e "syscalls:sys_enter_*"

对比perf和strace

strace的底层是使用ptrace 原理是类似GDB。会在目标位置断点代码执行,strace执行开销巨大

dynamic tracing

内核选项:

CONFIG_KPROBES=y

CONFIG_KPROBE_EVENTS=y

CONFIG_FRAME_POINTER=y

CONFIG_UPROBES=y

CONFIG_UPROBE_EVENTS=y

如果开启了debuginfo

CONFIG_DEBUG_INFO=y

可以记录函数中的内核变量

显示出每条记录中当前变量的大小

例如:

perf probe -V tcp_sendmsg 列出所有可用变量

perf probe --add 'tcp_sendmsg size' 加probe同时记录size

perf record -e probe:tcp_sendmsg -a 使能并开始记录

在有debuginfo的情况下,也可以根据内核函数的行号 来加trace point

例:

perf probe -L tcp_sendmsg 列出可用 的 line probe

perf probe -V tcp_send:81 列出第81行可见变量

perf probe --add 'tcp_sendmsg:81 seglen' 加 probe

perf record -e probe:tcp_sendmsg -a 开始记录

猜你喜欢

转载自blog.csdn.net/kuno_y/article/details/128940426