在工作中排查问题的时候,我们经常需要通过获取某个函数的执行时间来定位问题。比较原始的方式是通过在代码中埋点,然后打印出不同点上的时间戳,或者计算点之间的时间差,这种方式简单直接。但是在没有源代码的时候,或者如果要在某个在线的系统上获取相关信息的时候,这种方式就无能为力了。但是通过perf ,我们很容易办到。
下面我们以获取内核中函数 pci_reset_function的执行时间为例来介绍具体怎么做:
root@ll:~$ perf probe pci_reset_function
Added new event:
probe:pci_reset_function (on pci_reset_function)
You can now use it in all perf tools, such as:
perf record -e probe:pci_reset_function -aR sleep 1
root@ll:~$ perf probe -f 'pci_reset_function%return'
Added new event:
probe:pci_reset_function_1 (on pci_reset_function%return)
You can now use it in all perf tools, such as:
perf record -e probe:pci_reset_function_1 -aR sleep 1
root@ll:~$ perf record -e probe:pci_reset_function -e probe:pci_reset_function_1 -aR -T sleep 15
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.863 MB perf.data ]
root@ll$ perf script
qemu-system-x86 17243 [001] 679865.714931: probe:pci_reset_function: (ffffffff8135b930)
qemu-system-x86 17243 [001] 679866.719016: probe:pci_reset_function_1: (ffffffff8135b930 <- ffffffffa08057d0)
通过perf script 即可获函数进入以及返回的时间戳,那么获取函数的执行时间就很简单了。对于用户态的应用程序,采用的方式类似。