使用perf script进行追踪

perf tools记录内核中的采样事件,对其进行分析并得出性能信息。perf tools还可以记录内核中的追踪事件。也就是说,可以与Hack#69中介绍的ftrace进行同样的操作。perf script是显示已追踪的事件,或启动处理事件的脚本的功能。通过改写脚本,就可以根据需要对事件进行分析。可以记录的事件的种类除了可以如前所示从ftrace的debugfs接口获取,还可以使用perf list命令来获取。


perf list

……

kvmmmu:kvm_mmu_pagetable_walk[Tracepoint event]

kvmmmu:kvm_mmu_paging_element[Tracepoint event]

kvmmmu:kvm_mmu_set_accessed_bit[Tracepoint event]

kvmmmu:kvm_mmu_set_dirty_bit[Tracepoint event]

kvmmmu:kvm_mmu_walker_error[Tracepoint event]

kvmmmu:kvm_mmu_get_page[Tracepoint event]

kvmmmu:kvm_mmu_sync_page[Tracepoint event]

kvmmmu:kvm_mmu_unsync_page[Tracepoint event]

kvmmmu:kvm_mmu_prepare_zap_page[Tracepoint event]


在perf list的输出中,Tracepoint event所示的事件就是追踪用的事件。

在下例中,将使用perf record获取的进程调度程序相关事件并通过perf script输出。


perf record-e sched:'*'-a ls/

bin dev home lib32 media opt root selinux sys tracing var

boot

etc lib lib64 mnt proc sbin srv tmp usr

[perf record:Woken up 1 times to write data]

[perf record:Captured and wrote 0.627 MB perf.data(~27391 samples)]

perf script

perf 5179[000]26985.658132:sched_stat_runtime:comm=perf

pid=5179 runtime=5751845[ns]vruntime=392262038[ns]

Xorg 1115[001]26985.658132:sched_stat_runtime:comm=Xorg

pid=1115 runtime=4757708[ns]vruntime=106804101116[ns]

Xorg 1115[001]26985.658142:sched_stat_sleep:comm=kworker/1:0

pid=4552 delay=9975987[ns]

perf 5179[000]26985.658143:sched_stat_sleep:comm=kworker/0:2

pid=4027 delay=9972425[ns]

swapper 0[003]26985.658144:sched_stat_sleep:comm=kworker/3:0

pid=4983 delay=9920987[ns]

Xorg 1115[001]26985.658144:sched_wakeup:comm=kworker/1:0

pid=4552 prio=120 success=1 target_cpu=001

perf 5179[000]26985.658144:sched_wakeup:comm=kworker/0:2

pid=4027 prio=120 success=1 target_cpu=000

swapper 0[003]26985.658145:sched_wakeup:comm=kworker/3:0

pid=4983 prio=120 success=1 target_cpu=003

Xorg 1115[001]26985.658145:sched_stat_runtime:comm=Xorg

pid=1115 runtime=13009[ns]vruntime=106804114125[ns]

perf 5179[000]26985.658145:sched_stat_runtime:comm=perf

pid=5179 runtime=12798[ns]vruntime=392274836[ns]

……


在不向perf script赋予脚本的情况下运行时,只显示记录的追踪事件。也可以将这个追踪事件作为脚本的输入进行处理并返回结果。在perf script中添加—list选项并执行,就可以获取可使用的脚本列表。


perf script—list

List of available trace scripts:

workqueue-stats workqueue stats(ins/exe/create/destroy)

rw-by-pid system-wide r/w activity

failed-syscalls[comm]system-wide failed syscalls

rwtop[interval]system-wide r/w top

rw-by-file<comm>r/w activity for a program, by file

wakeup-latency system-wide min/max/avg wakeup latency

sched-migration sched migration overview

syscall-counts-by-pid[comm]system-wide syscall counts, by pid

futex-contention futext contention measurement

netdev-times[tx][rx][dev=][debug]display a process of packet and

processing time

sctop[comm][interval]syscall top

syscall-counts[comm]system-wide syscall counts

failed-syscalls-by-pid[comm]system-wide failed syscalls, by pid


脚本可以分为可在线处理的和不可在线处理的。但是一般sctop、rwtop等命令处理的事件频率非常高,因此如果在线处理,即进行追踪的同时运行脚本,则不可避免地会增加负载。另一方面,进行离线处理时是先追踪后处理的,因此可以抑制处理方式对追踪对象的影响。

要进行在线处理,需要在perf script后面指定脚本名称,如下所示。这里使用的是sctop(测量系统调用次数)脚本。

perf script sctop syscall events:

使用perf script进行追踪 - 图1

要进行离线处理,需要在perf script的record和report后面指定脚本名称,如下所示。这里使用scscall-counts脚本,与前一次一样测量系统调用的次数。


perf script record syscall-counts ls/

bin dev home lib32 media opt root selinux sys tracing var

boot etc lib lib64 mnt proc sbin srv tmp usr

[perf record:Woken up 1 times to write data]

[perf record:Captured and wrote 0.028 MB perf.data(~1226 samples)]

perf script report syscall-counts

Press control+C to stop and show the summary

syscall events:

event count



使用perf script进行追踪 - 图2