eBPF 核心技术与实战
倪朋飞
资深 Linux 专家,Kubernetes 项目维护者
10452 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已更新 26 讲/共 37 讲
eBPF 核心技术与实战
15
15
1.0x
00:00/00:00
登录|注册

07 | 内核跟踪(上):如何查询内核中的跟踪点?

你好,我是倪朋飞。
在上一个模块“基础入门篇”中,我带你搭建了 eBPF 的开发环境,并详细介绍了 eBPF 程序的工作原理、编程接口以及事件触发机制。学习完这些内容,我想你已经掌握了 eBPF 必备的基础知识,并通过简单的示例,初步体验了 eBPF 程序的开发和执行过程。
我在前面的内容中反复强调过,学习一门新技术,最快的方法就是在理解原理的同时配合大量的实践,eBPF 也不例外。所以,从这一讲起我们开始“实战进阶篇”的学习,一起进入 eBPF 的实践环节,通过真实的应用案例把 eBPF 技术用起来。
今天我们先来看看,怎样使用 eBPF 去跟踪内核的状态,特别是最简单的 bpftrace 的使用方法。在下一讲中,我还将介绍两种 eBPF 程序的进阶编程方法。
上一讲我提到过,跟踪类 eBPF 程序主要包含内核插桩(BPF_PROG_TYPE_KPROBE)、跟踪点(BPF_PROG_TYPE_TRACEPOINT)以及性能事件(BPF_PROG_TYPE_PERF_EVENT)等程序类型,而每类 eBPF 程序类型又可以挂载到不同的内核函数、内核跟踪点或性能事件上。当这些内核函数、内核跟踪点或性能事件被调用的时候,挂载到其上的 eBPF 程序就会自动执行。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了如何使用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-31
    5
    37
  • Geek_508898
    bpftrace --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-08
    3
    7
  • Tok1c
    Ubuntu 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归属地:北京
    2
    4
  • 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-07
    1
  • 老师,我的系统是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-23
    1
  • 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-04
    2
  • Li. Mr
    请问倪老师,ebpf能对进程的I/O行为做比较细致紧密的监控探测么?

    作者回复: 可以的,可以跟踪I/O相关的跟踪点。

    2022-02-27
    3
  • 老师好,我有个疑问,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
收起评论
显示
设置
留言
13
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部