bur*_*ino 3 trace ftrace perf bpf ebpf
目前,我可以告诉trace-cmd(一个 ftrace 前端)使用 ftrace 的函数图基础设施来跟踪指定的工作负载。使用一些跟踪数据处理工具,我可以查看调用函数的频率以及每个函数调用的相应总持续时间。示例输出可能如下所示,其中我跟踪了我的工作负载生成的 ext4 函数调用:
# trace-cmd post-processing example output
# function name, frequency, total duration (us)
ext4_alloc_inode(),1,35.567
ext4_read_inode_bitmap(),1,12.076
ext4_init_io_end(),2,41.216
ext4_journal_check_start(),39,716.3
ext4_da_write_end(),10,102.661
ext4_da_get_block_prep(),9,257.46999999999997
ext4_block_write_begin(),2,88.069
ext4_bio_write_page(),1,33.016
Run Code Online (Sandbox Code Playgroud)
我已经看到了可以由、、等生成的令人难以置信的火焰图,这让我相信我应该能够实现与使用或 的输出类似的输出。但是,有一些障碍:eBPFsystemtapperftrace-cmdperfeBPF
perf. 作为参考,您可以查看在更短的时间内跟踪 bash 的示例输出。eBPF无法确定是否可以获得与我的trace-cmd后处理示例输出类似的数据/输出。对于那些比我更熟悉eBPF或perf比我更熟悉的人,我想知道:
eBPF或perf实现我的目标?如果您感觉特别慷慨,将不胜感激能帮助我实现目标的示例代码/命令。
绝对可以使用 eBPF 来做到这一点。
实际上有一个工具可以在bcc tools中执行类似的操作。funclatency跟踪一组函数并显示它们的延迟直方图(每次调用时在函数中花费的时间):
# ./funclatency do_sys_open
Tracing do_sys_open... Hit Ctrl-C to end.
^C
nsecs : count distribution
0 -> 1 : 0 | |
2 -> 3 : 0 | |
4 -> 7 : 0 | |
8 -> 15 : 0 | |
16 -> 31 : 0 | |
32 -> 63 : 0 | |
64 -> 127 : 0 | |
128 -> 255 : 0 | |
256 -> 511 : 0 | |
512 -> 1023 : 0 | |
1024 -> 2047 : 0 | |
2048 -> 4095 : 124 |**************** |
4096 -> 8191 : 291 |**************************************|
8192 -> 16383 : 36 |**** |
16384 -> 32767 : 16 |** |
32768 -> 65535 : 8 |* |
65536 -> 131071 : 0 | |
131072 -> 262143 : 0 | |
262144 -> 524287 : 0 | |
524288 -> 1048575 : 0 | |
1048576 -> 2097151 : 0 | |
2097152 -> 4194303 : 1 | |
Detaching...
Run Code Online (Sandbox Code Playgroud)
从 funclatency 开始,派生出一个工具来做你正在寻找的东西是相当容易的:
# ./funclatency do_sys_open
Tracing do_sys_open... Hit Ctrl-C to end.
^C
nsecs : count distribution
0 -> 1 : 0 | |
2 -> 3 : 0 | |
4 -> 7 : 0 | |
8 -> 15 : 0 | |
16 -> 31 : 0 | |
32 -> 63 : 0 | |
64 -> 127 : 0 | |
128 -> 255 : 0 | |
256 -> 511 : 0 | |
512 -> 1023 : 0 | |
1024 -> 2047 : 0 | |
2048 -> 4095 : 124 |**************** |
4096 -> 8191 : 291 |**************************************|
8192 -> 16383 : 36 |**** |
16384 -> 32767 : 16 |** |
32768 -> 65535 : 8 |* |
65536 -> 131071 : 0 | |
131072 -> 262143 : 0 | |
262144 -> 524287 : 0 | |
524288 -> 1048575 : 0 | |
1048576 -> 2097151 : 0 | |
2097152 -> 4194303 : 1 | |
Detaching...
Run Code Online (Sandbox Code Playgroud)
该工具使用 BPF 直接在内核中计算每个函数调用的频率和总持续时间。在显示它们之前,聚合值仅在最后复制到用户空间。输出:
# ./time-spent do_sys_*
Tracing 6 functions for "do_sys_*"... Hit Ctrl-C to end.
^C
FUNC COUNT TIME (nsecs)
do_sys_poll 6783 213928440379
do_sys_open 3127 43172656
do_sys_ftruncate.constprop.15 39 189623
Run Code Online (Sandbox Code Playgroud)
该解决方案依赖 bcc 在内核中加载 BPF 程序,但也可以用 C 完成所有操作。您可以在存储库中找到开始使用 bcc的教程。
| 归档时间: |
|
| 查看次数: |
1330 次 |
| 最近记录: |