eBPF 核心技术与实战
倪朋飞
资深 Linux 专家,Kubernetes 项目维护者
1165 人已学习
立即订阅
登录后,你可以任选4讲全文学习
推荐试读
换一换
02 | 先利其器:如何高效学习 eBPF?
04 | 运行原理:eBPF 是一个新的虚拟机吗?
09 | 用户态跟踪:如何使用 eBPF 排查应用程序?
课程目录
已完结/共 16 讲
开篇词 (1讲)
开篇词 | 想要洞悉系统底层的黑盒?先掌握 eBPF!
学习准备篇 (2讲)
01|技术概览:eBPF 的发展历程及工作原理
02 | 先利其器:如何高效学习 eBPF?
基础入门篇 (4讲)
03 | 初窥门径:开发并运行你的第一个 eBPF 程序
04 | 运行原理:eBPF 是一个新的虚拟机吗?
05 | 编程接口:eBPF 程序是怎么跟内核进行交互的?
06 | 事件触发:各类 eBPF 程序的触发机制及其应用场景
实战进阶篇 (7讲)
07 | 内核跟踪(上):如何查询内核中的跟踪点?
08|内核跟踪(下):开发内核跟踪程序的进阶方法
09 | 用户态跟踪:如何使用 eBPF 排查应用程序?
10 | 网络跟踪:如何使用 eBPF 排查网络问题?
11 | 容器安全:如何使用 eBPF 增强容器安全?
12|高性能网络实战(上):如何开发一个负载均衡器?
13|高性能网络实战(下):如何完善负载均衡器?
阶段总结 (2讲)
阶段总结|实用 eBPF 工具及最新开源项目总结
未来可期|邀你与 eBPF 共赴一场技术革新之约
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
划线
笔记
复制
02 | 先利其器:如何高效学习 eBPF?
04 | 运行原理:eBPF 是一个新的虚拟机吗?
09 | 用户态跟踪:如何使用 eBPF 排查应用程序?
10 | 网络跟踪:如何使用 eBPF 排查网络问题?
12|高性能网络实战(上):如何开发一个负载均衡器?
13|高性能网络实战(下):如何完善负载均衡器?
开通超级会员免费畅看本课程
开通会员
该文章仅可免费阅读部分内容,如需阅读完整文章,请开通超级会员或单独购买本课程。
登录 后留言

精选留言(5)

  • 莫名
    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
    3
    8
  • 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
    2
    2
  • 老师好,我有个疑问,eBPF和ftracer有什么关系吗?我看两个都是在debugfs下的tracing这个目录操作的
    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
收起评论
5
返回
顶部