perf简明使用
注:perf的使用需要容器的特权,需要在容器启动时添加参数 --privileged。k8s中添加参数:给容器的spec指定securityContext.privileged=true但特权容器存在安全隐患,特权容器能访问宿主机上的所有设备(逃逸:容器挂载宿主机磁盘,然后切换根目录)。man文档查看: man perf-top。
·
perf
注:perf的使用需要容器的特权,需要在容器启动时添加参数 --privileged。
k8s中添加参数:给容器的spec指定securityContext.privileged=true
但特权容器存在安全隐患,特权容器能访问宿主机上的所有设备(逃逸:容器挂载宿主机磁盘,然后切换根目录)。
不能在线上正式服使用。
perf本身的原理也非常有意思,其把事件源视为perf_event,并分为task和CPU两个维度进行事件触发,本身支持counting,sampling以及bpf作为事件的处理流程。事件源类型(不是机制)被分为Hardware Events,Software Events,Tracepoint,USDT以及Timed Profiling。
Event是perf最为重要的概念,其标识了可以触发perf的事件类型,这是perf如此强大的一个重要原因
man文档查看: man perf-top
perf list
perf list 主要是用于列出有哪些可用的event,可以供 perf top -e eventname 来分析。
perf list [hw|sw|cache|tracepoint|pmu|event_glob]
perf list [hw|sw...] 可以知道所有的 tracepoint events, 接下来我们就可以使用 perf top -e tracepoint-event 来专门获得指定的tracepoint的信息:
perf top
perf top -e cpu-clock: 查看CPU的使用(如上图)
Kernel:操作系统内核。核心功能为:事件的调度和同步、进程间的通信、存储器管理、进程管理理。
IRQ:中断请求(Interrupt request)
finish_task_switch:内核进程上下文相关切换。在上下文切换前调用prepare_task_switch,在切换后调用finish_task_switch,释放之前的锁,并执行任何其他特定于体系结构的清理操作
vmxnet3_xmit_frame:虚拟网卡
nft_do_chain:数据包分类?(暂时没找到)
_raw_spin_unlock_irqrestore出现率很高? 看文档最后
block对应的内核手册说明:https://docs.huihoo.com/doxygen/linux/kernel/3.7/block_8h.html#a4002499da2a2b8b9ebe431fcbeb7d83b
perf top -e block:block_rq_issue : 向设备驱动程序发出挂起的块 IO 请求操作。
Tracepoint event:perf复用了ftrace中trace_event的所有插桩点(即tracepoint),trace数据即可以通过ftrace的通道提供,也可以被包装成perf_event供perf工具使用。
perf record/report
Samples : 采样数, perf 总共采集了 6K 个 CPU 时钟事件。
event : 事件类型。
Event count (approx.) : 事件总数量
Overhead: 是该符号的性能事件在所有采样中的比例,用百分比来表示。
Shared: Shared ,是该函数或指令所在的动态共享对象(Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等。
Object: Object ,是动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动态链接库,而 [k] 则表示内核空间。
Symbol: Symbol 是符号名,也就是函数名。当函数名未知时,用十六进制的地址来表示。
perf record -e cpu-clock -g -p 1 -- sleep 10
perf report
perf的两个命令:
1. perf record:保存perf追踪的内容,文件名为perf.data
2. perf report:解析perf.data的内容
example: perf record -a
* -a:表示对所有CPU采样
* --call-graph dwarf:表示分析调用栈的关系
* -p:表示分析指定的进程ID
* -F 99 :1秒钟进行采集99次
* -- sleep 30:采集时间为30秒(-- sleep 中间有个空格)
* -g:收集调用栈
结束后,会生成 perf.data 文件,然后通过 report 导出报告,即可以查看 main 函数和子函数的CPU平均占用率。
直接查看:perf report
输出到文件查看:perf report -i perf.data > perf.txt
perf stat
sched源码定义:https://docs.huihoo.com/doxygen/linux/kernel/3.7/namespacesched-migration.html
perf stat -e 'sched:*' -p ID sleep 10,可以查看被监控事件的counter数据。
perf lock
(没尝试成功,在debian的配置中修改后还是没成功)
可以检测锁的各种信息,但是需要CONFIG_LOCKDEP和CONFIG_LOCK_STAT编译选项的开启,执行如下指令perf lock record ls,然后执行perf lock report,就可以看到详细的信息
配置:内核配置通常在: /usr/src/linux/.config 下。不建议直接编辑此文件,而是使用以下配置:
make config(开始一个基于字符的问答环节);
make menuconfig(启动一个面向终端的配置工具(使用 ncurses));
make xconfig(启动一个基于 X 的配置工具)。
说明文档:https://tldp.org/HOWTO/SCSI-2.4-HOWTO/kconfig.html。
开发环境是用的debian,命令:uname -r 能查看内核版本,正在使用的内核配置在 /boot/ 目录下。()
perf mem
perf-kmem 是 perf 工具里用来跟踪和测量“内存分配与释放”的一些探测点的集合
采集:perf kmem record ls
分析:perf kmem stat --caller --alloc
perf sched 查看调度
perf sched record -p ID
perf report latency
perf sched script 可以知道这个最高的时延发生的原因是什么.
perf sched map 可以用图表的方式来查看不同CPU核上任务的转移情况。例如:perf sched record -- sleep 1采集完成后 执行 perf sched map
其中类似A0,B0,C0这样的标识符代表了一个任务,然后*代表CPU刚刚调度一个事件,.代表此CPU目前空闲,这种分析可以很好的观测当前系统中任务切换的情况。
-a, --all-cpus 系统范围的采集(默认的)
-c , --count= 采样的事件周期
-C , --cpu= 仅仅监控提供的CPU列表。多个CPU可以提供一个逗号分隔的列表,不能有空格,如0,1,可以用-表示多个cpu的一个范围,如0-2。默认是监控所有的CPU
-d , --delay= 刷新之间延迟的秒数
-e , --event= 选择PMU(Performance Monitoring Unit)事件.被选择的可以是一个符号化的事件名称(使用perf list命令可以列出所有的事件),或者是一个原始的PMU事件(eventsel+umask),形式如rNNN其中的NNN是一个十六进制的事件描述符
-E , --entries= 展示Display this many functions
-f , --count-filter= Only display functions with more events than this.
–group 将计数器放到一个计数器组中
-F , --freq= 以这个频率来进行性能剖析
-i, --inherit 子任务不继承计数器
-k , --vmlinux= 到vmlinux这种内核文件的路径,注释功能需要。
-m , --mmap-pages= mmap的数据页数(必须为2的次方),或者尾部带有单位字符(B
-p , --pid= 在已经存在的进程ID上进行剖析,逗号分隔的列表
-t , --tid= 在已经存在的线程ID上进行剖析,逗号分隔的列表
-u, --uid= 记录由uid拥有的线程的事件。名字或者数字都可以
-r , --realtime= 用这个RT SCHED_FIFO优先级来收集数据
–sym-annotate= 注释此符号。
-K, --hide_kernel_symbols 隐藏内核符号
-U, --hide_user_symbols 隐藏用户空间符号
–demangle-kernel 分解内核符号
-D, --dump-symtab 转储用于剖析的符号表
-v, --verbose Be more verbose (show counter open errors, etc).
-z, --zero 显示更新的历史记录为零
-s, --sort 按关键字排序,可以多个key排序。 pid, comm, dso, symbol, parent, srcline, weight, local_weight, abort, in_tx, transaction, overhead, sample, period。参考perf report中的–sort
–fields= 指定输出字段。多个key可以用CSV格式指定。下面的字段是可用的overhead, overhead_sys, overhead_us, overhead_children, sample and period。当然可以包含任何排序key。默认情况下每个没有在这里指定的排序key都会自动加上
-n, --show-nr-samples 展示带有采样数的一列
–show-total-period 展示带有各采样周期和的一列
–dsos 仅仅考虑在这些dsos中的符号。这个选项将影响overhead列的百分比
–comms 仅仅考虑在这些comms中的符号。这个选项将影响overhead列的百分比
–symbols 仅仅考虑这些符号。这个选项将影响overhead列的百分比
-M, --disassembler-style= 给objdump设置反汇编器风格
–source 源代码与汇编代码交织在一起。 默认情况下启用,使用–no-source禁用。
–asm-raw 显示汇编指令的原始指令编码。
-g 启用调用图(stack chain/backtrace)记录。
–call-graph [mode,type,min[,limit],order[,key][,branch]] 设置并启用调用图(stack chain/backtrace)记录,暗含-g
–children 将子级的调用链累积到父项,以便随后可以显示在输出中。输出将有一个新的“ Children”列,并将按数据进行排序。 它要求必须启用-g /-call-graph选项。 有关更多详细信息,请参见“开销计算”部分。 默认情况下启用,使用–no-children禁用。
–max-stack 解析调用链时设置堆栈深度限制,超出指定深度的任何内容都将被忽略。 这是在信息丢失和更快的处理之间做出的权衡,尤其是对于可能具有非常长的调用链堆栈的工作负载而言。默认值:/ proc / sys / kernel / perf_event_max_stack(如果存在),否则为127。
–ignore-callees= 忽略与给定正则表达式匹配的函数的被调用者。 这具有将每个这样的函数的调用者收集到调用图树中的一个位置中的效果。
–percent-limit 不要显示开销低于该百分比的条目。 (默认值:0)
–percentage 确定如何显示已过滤条目的开销百分比。 可以通过–comms,-dsos和/或–symbols选项以及TUI上的Zoom操作(线程,dso等)应用过滤器。相对表示它仅与过滤的条目有关,因此显示的条目之和始终为100%。 绝对表示在应用过滤器之前和之后均保留原始值。
-w, --column-widths=<width[,width…]> 强制将每列宽度设置为提供的列表,以提高终端可读性。 0表示没有限制(默认行为)。
–proc-map-timeout 在处理预先存在的线程/proc/XXX/mmap时,可能需要很长时间,因为文件可能很大。 在这种情况下,需要超时。 此选项设置超时限制。 默认值为500毫秒。
-b, --branch-any 启用已采取的分支堆栈采样。 可以对任何类型的采用分支进行采样。 这是–branch-filter any的快捷方式。 有关更多信息,请参见–branch-filter。
-j, --branch-filter 启用分支栈采样.每个样本捕获一系列连续的分支。 每个样本捕获的分支数量取决于基础硬件,相关分支的类型以及执行的代码。 通过启用过滤器可以选择捕获的分支类型。 有关修饰符的完整列表,请参见性能记录手册页。该选项要求any,any_call,any_ret,ind_call和cond中至少一种分支类型。 特权级别可以省略,在这种情况下,关联事件的特权级别将应用于分支过滤器。 内核(k)和管理程序(hv)特权级别均受许可权的约束。 在多个事件上采样时,将为所有采样事件启用分支堆栈采样。 所有事件的采样分支类型均相同。 必须将各种过滤器指定为以逗号分隔的列表:–branch-filter any_ret,u,k请注意,此功能可能并非在所有处理器上都可用。
–raw-trace 显示traceevent输出时,不使用print fmt或插件。
–hierarchy 启用层次化的输出
–force 不要进行所有权验证
–num-thread-synthesize 当合成已经存在的进程的事件时要运行的线程数。默认情况下,线程数等于在线CPU数。
为什么_raw_spin_unlock_irqrestore出现率很高?
更多推荐
已为社区贡献1条内容
所有评论(0)