通过trace内核来统计系统调用耗时,可以采用的方法有如下几种,比如:
- 使用perf probe
- 使用ftrace probe
- 使用bpftrace
- 使用bcc
- 使用systemtap
bpftrace
使用bpftrace可以比较简单的实现该功能,直接使用单行命令即可:
bpftrace -e 'tracepoint:syscalls:sys_enter_write { @entry[tid]= nsecs;} tracepoint:syscalls:sys_exit_write /@entry[tid]/ {$interval=nsecs-@entry[tid];@sum=hist($interval);delete(@entry[tid]);}'
输出的结果如下所示:
Attaching 2 probes...
@sum:
[256, 512) 148 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
[512, 1K) 162 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@|
[1K, 2K) 0 | |
[2K, 4K) 6 |@ |
[4K, 8K) 24 |@@@@@@@ |
[8K, 16K) 6 |@ |
[16K, 32K) 2 | |
systemtap
查找系统调用点:
stap -L 'syscall.*'
查找系统调用返回点:
stap -L 'syscall.*.*'
比如open系统调用,找到的结果如下:
syscall.open
syscall.open.return