07 | 内核跟踪(上):如何查询内核中的跟踪点?
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了如何使用eBPF查询内核中的跟踪点,并介绍了内核函数、跟踪点和性能事件的重要性。作者提到了查询跟踪点的方法,包括利用调试信息查询跟踪点的方法和使用Linux性能工具和bpftrace查询跟踪点的方法。bpftrace是一个基于eBPF和BCC的跟踪语言,可以通过简单的脚本实现复杂的跟踪功能。文章还介绍了bpftrace的安装方法,并强调了使用bpftrace进行查询的便利性。此外,还介绍了bpftrace、BCC和libbpf这三种方式在eBPF程序开发中的应用场景和特点。文章还提到了bpftrace的一些限制,并鼓励读者在评论区分享改进和实践经验。整体来说,本文通过介绍内核跟踪点的查询方法,为读者提供了在开发eBPF程序时选择挂载点的指导,并展示了如何使用bpftrace来跟踪短时进程问题。
《eBPF 核心技术与实战》,新⼈⾸单¥59
全部留言(13)
- 最新
- 精选
- 莫名1、首先给倪老师提个问题。【以 v5.13.0 为例,总的内核函数数量已经超过了 16 万】觉得这一表述不太准确,内核符号表 /proc/kallsyms 不仅包含了内核函数(static、非 static),还包含了非栈数据变量。/proc/kallsyms 输出的第二列表示符号类型,包括 A、b、D、t、T 等,其中 T(t) 表示代码段符号表,大概有 7w+ 内核函数(其实还有极少数并非真正的内核函数)。 这 7w+ 内核函数中,只有被显式导出的内核函数(5w+)才能被 BPF kprobe 类型程序动态追踪。 以 5.13 内核版本为例,可通过 tracefs 或 bpftrace 统计,共 52259 个内核函数可以被 BPF 利用 kprobe 技术动态追踪: # cat /sys/kernel/debug/tracing/available_filter_functions | wc -l 52259 # bpftrace -l 'kprobe:*' | wc -l 52259 2、课后思考题,借用 bpftrace 内置函数 time() 输出时间 & 内置变量 curtask 获取父进程 pid($task->parent->tgid),写成单行程序看起来不太直观,整理为以下脚本 execsnoop.bt。 ---------------- execsnoop.bt ----------------- #!/usr/bin/bpftrace #include <linux/sched.h> BEGIN { printf("%-9s %-6s %-6s %-16s %s\n", "TIME", "PID", "PPID", "COMM", "ARGS") } tracepoint:syscalls:sys_enter_execve, tracepoint:syscalls:sys_enter_execveat { $task = (struct task_struct *)curtask; time("%H:%M:%S "); printf("%-6d %-6d %-16s", pid, $task->parent->tgid, comm); join(args->argv); }
作者回复: 1. 非常感谢指出不严谨的地方,这儿我稍后调整一下内容。 2. 非常棒的答案👍
2022-01-31537 - Geek_508898bpftrace --include linux/sched.h -e 'tracepoint:syscalls:sys_enter_execve,tracepoint:syscalls:sys_enter_execveat { time("%H:%M:%S ");printf("%-6d %-6d %-8s ", pid,curtask->parent->pid, comm); join(args->argv)}'
作者回复: 👍 非常棒的答案!
2022-02-0837 - Tok1cUbuntu 22.04 ERROR: Could not resolve symbol: /proc/self/exe:BEGIN_trigger 解决方案: https://github.com/iovisor/bpftrace/issues/2168 echo "deb http://ddebs.ubuntu.com $(lsb_release -cs) main restricted universe multiverse deb http://ddebs.ubuntu.com $(lsb_release -cs)-updates main restricted universe multiverse deb http://ddebs.ubuntu.com $(lsb_release -cs)-proposed main restricted universe multiverse" | \ sudo tee -a /etc/apt/sources.list.d/ddebs.list sudo apt install ubuntu-dbgsym-keyring sudo apt update sudo apt install bpftrace-dbgsym
作者回复: 谢谢分享bpftrace-dbgsym的安装方法
2022-10-07归属地:北京24 - muggle执行 bpftrace -l '*execve*' stdin:1:1-8: ERROR: No probe type matched for *execve *execve* ~~~~~~~ 遇到这个的可以升级下bpftrace版本,0.13.0+ https://github.com/iovisor/bpftrace/pull/1775
作者回复: 👍 谢谢分享经验,的确有的发行版上自带的bpftrace有些老了
2022-03-071 - 坚老师,我的系统是Ubuntu21.10,我在执行sudo bpftrace -l '*execve*'的时候,发现除了内核插桩(kprobe)和跟踪点(tracepoint)这两类,还有一类kfunc,我百度了一下,还是不太了解这个东西,老师可以简单说说吗?
作者回复: 碰到新技术相关的问题时,推荐直接去查找相关技术的官方网站。比如,对于kfunc,bpftrace已经有对应的文档 https://github.com/iovisor/bpftrace/blob/master/docs/reference_guide.md#15-kfunckretfunc-kernel-functions-tracing https://github.com/iovisor/bpftrace/issues/1833 这儿也有一个详细的讨论。简单来说,kfunc对应fentry跟踪,相比kprobe性能更好,使用也更简单。
2022-02-231 - Geek_b914ab$ sudo bpftrace -e 'tracepoint:syscalls:sys_enter_execve { printf("%ld %s ", nsecs, comm); join(args->argv);}' Attaching 1 probe... 349663019454998 core::system::S /usr/bin/cat /proc/cpuinfo 349663023173472 core::system::S /usr/bin/lscpu 349665017216698 core::system::S /usr/bin/cat /proc/cpuinfo 349665040019654 core::system::S /usr/bin/lscpu 349667017603472 core::system::S /usr/bin/cat /proc/cpuinfo 349667040035265 core::system::S /usr/bin/lscpu 349669017626924 core::system::S /usr/bin/cat /proc/cpuinfo 349669039803679 core::system::S /usr/bin/lscpu 349671018720543 core::system::S /usr/bin/cat /proc/cpuinfo 349671039711997 core::system::S /usr/bin/lscpu 349673018112968 core::system::S /usr/bin/cat /proc/cpuinfo 349673039088168 core::system::S /usr/bin/lscpu 349675016659748 core::system::S /usr/bin/cat /proc/cpuinfo 349675039289844 core::system::S /usr/bin/lscpu 349677018311393 core::system::S /usr/bin/cat /proc/cpuinfo 发现每隔2S就有一个core::system::S的进程不断使用lscpu并读取的内容/proc/cpuinfo,这个core::system::S是个啥呢?
作者回复: 这个我还是第一次见,可以说试试ps找出进程,然后看看对应的二进制文件属于哪个软件包
2022-03-042 - Li. Mr请问倪老师,ebpf能对进程的I/O行为做比较细致紧密的监控探测么?
作者回复: 可以的,可以跟踪I/O相关的跟踪点。
2022-02-273 - 坚老师好,我有个疑问,eBPF和ftracer有什么关系吗?我看两个都是在debugfs下的tracing这个目录操作的
作者回复: 是的,ebpf支持内核和应用的跟踪,也很多支持其他非跟踪类的功能,比如网络、安全等等。
2022-02-17 - heyhd9475请问老师,bpftrace无法支持for循环和数组临时变量吗
作者回复: 这两个问题都可以在文档中查到: https://github.com/iovisor/bpftrace/blob/master/docs/reference_guide.md#13-looping-constructs https://github.com/iovisor/bpftrace/blob/master/docs/reference_guide.md#3--associative-arrays
2022-02-16 - Ethan Liu使用bpftrace能查询性能事件吗?
作者回复: 也可以的,比如 bpftrace -l 'software:*'
2022-02-08