使用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的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