@@ -296,7 +296,7 @@ eBPF程序每次执行时候都需要进行编译, 编译则需要用户配置
< li > BPF Compiler Collection (BCC): < a href = "https://github.com/iovisor/bcc" > https://github.com/iovisor/bcc< / a > < / li >
< li > eunomia-bpf: < a href = "https://github.com/eunomia-bpf/eunomia-bpf" > https://github.com/eunomia-bpf/eunomia-bpf< / a > < / li >
< / ul >
< p > 您还可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 以获取更多示例和完整的教程源代码,全部内容均已开源 。我们会继续分享更多有关 eBPF 开发实践的内容,帮助您更好地理解和掌握 eBPF 技术。< / p >
< p > 您还可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 或网站 < a href = "https://eunomia.dev/zh/tutorials/" > https://eunomia.dev/zh/tutorials/< / a > 以获取更多示例和完整的教程源代码。我们会继续分享更多有关 eBPF 开发实践的内容,帮助您更好地理解和掌握 eBPF 技术。< / p >
< div style = "break-before: page; page-break-before: always;" > < / div > < h1 id = "ebpf-入门开发实践教程一hello-world基本框架和开发流程" > < a class = "header" href = "#ebpf-入门开发实践教程一hello-world基本框架和开发流程" > eBPF 入门开发实践教程一: Hello World, 基本框架和开发流程< / a > < / h1 >
< p > 在本篇博客中, 我们将深入探讨eBPF( Extended Berkeley Packet Filter) 的基本框架和开发流程。eBPF是一种在Linux内核上运行的强大网络和性能分析工具, 它为开发者提供了在内核运行时动态加载、更新和运行用户定义代码的能力。这使得开发者可以实现高效、安全的内核级别的网络监控、性能分析和故障排查等功能。< / p >
< p > 本文是eBPF入门开发实践教程的第二篇, 我们将重点关注如何编写一个简单的eBPF程序, 并通过实际例子演示整个开发流程。在阅读本教程之前, 建议您先学习第一篇教程, 以便对eBPF的基本概念有个大致的了解。< / p >
@@ -439,7 +439,7 @@ Runing eBPF program...
< li > 在实际开发中,还可能需要进行其他的步骤,例如配置编译和加载参数,管理 eBPF 内核模块和内核映射,以及使用其他高级功能等。< / li >
< / ul >
< p > 需要注意的是, BPF 程序的执行是在内核空间进行的,因此需要使用特殊的工具和技术来编写、编译和调试 BPF 程序。eunomia-bpf 是一个开源的 BPF 编译器和工具包,它可以帮助开发者快速和简单地编写和运行 BPF 程序。< / p >
< p > 您还可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 以获取更多示例和完整的教程,全部内容均已开源。我们会继续分享更多有关 eBPF 开发实践的内容,帮助您更好地理解和掌握 eBPF 技术。< / p >
< p > 您还可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 或网站 < a href = "https://eunomia.dev/zh/tutorials/" > https://eunomia.dev/zh/tutorials/< / a > 以获取更多示例和完整的教程,全部内容均已开源。我们会继续分享更多有关 eBPF 开发实践的内容,帮助您更好地理解和掌握 eBPF 技术。< / p >
< div style = "break-before: page; page-break-before: always;" > < / div > < h1 id = "ebpf-入门开发实践教程二在-ebpf-中使用-kprobe-监测捕获-unlink-系统调用" > < a class = "header" href = "#ebpf-入门开发实践教程二在-ebpf-中使用-kprobe-监测捕获-unlink-系统调用" > eBPF 入门开发实践教程二:在 eBPF 中使用 kprobe 监测捕获 unlink 系统调用< / a > < / h1 >
< p > eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具。它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。< / p >
< p > 本文是 eBPF 入门开发实践教程的第二篇,在 eBPF 中使用 kprobe 捕获 unlink 系统调用。本文会先讲解关于 kprobes 的基本概念和技术背景,然后介绍如何在 eBPF 中使用 kprobe 捕获 unlink 系统调用。< / p >
@@ -550,7 +550,7 @@ rm test2
< h2 id = "总结-1" > < a class = "header" href = "#总结-1" > 总结< / a > < / h2 >
< p > 通过本文的示例,我们学习了如何使用 eBPF 的 kprobe 和 kretprobe 捕获 unlink 系统调用。更多的例子和详细的开发指南,请参考 eunomia-bpf 的官方文档:< a href = "https://github.com/eunomia-bpf/eunomia-bpf" > https://github.com/eunomia-bpf/eunomia-bpf< / a > < / p >
< p > 本文是 eBPF 入门开发实践教程的第二篇。下一篇文章将介绍如何在 eBPF 中使用 fentry 监测捕获 unlink 系统调用。< / p >
< p > 如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 以获取更多示例和完整的教程。< / p >
< p > 如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 或网站 < a href = "https://eunomia.dev/zh/tutorials/" > https://eunomia.dev/zh/tutorials/< / a > 以获取更多示例和完整的教程。< / p >
< div style = "break-before: page; page-break-before: always;" > < / div > < h1 id = "ebpf-入门开发实践教程三在-ebpf-中使用-fentry-监测捕获-unlink-系统调用" > < a class = "header" href = "#ebpf-入门开发实践教程三在-ebpf-中使用-fentry-监测捕获-unlink-系统调用" > eBPF 入门开发实践教程三:在 eBPF 中使用 fentry 监测捕获 unlink 系统调用< / a > < / h1 >
< p > eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具。它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。< / p >
< p > 本文是 eBPF 入门开发实践教程的第三篇,在 eBPF 中使用 fentry 捕获 unlink 系统调用。< / p >
@@ -616,7 +616,7 @@ rm test_file2
< h2 id = "总结-2" > < a class = "header" href = "#总结-2" > 总结< / a > < / h2 >
< p > 这段程序是一个 eBPF 程序,通过使用 fentry 和 fexit 捕获 < code > do_unlinkat< / code > 和 < code > do_unlinkat_exit< / code > 函数,并通过使用 < code > bpf_get_current_pid_tgid< / code > 和 < code > bpf_printk< / code > 函数获取调用 do_unlinkat 的进程的 ID、文件名和返回值, 并在内核日志中打印出来。< / p >
< p > 编译这个程序可以使用 ecc 工具,运行时可以使用 ecli 命令,并通过查看 < code > /sys/kernel/debug/tracing/trace_pipe< / code > 文件查看 eBPF 程序的输出。更多的例子和详细的开发指南,请参考 eunomia-bpf 的官方文档:< a href = "https://github.com/eunomia-bpf/eunomia-bpf" > https://github.com/eunomia-bpf/eunomia-bpf< / a > < / p >
< p > 如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 以获取更多示例和完整的教程。< / p >
< p > 如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 或网站 < a href = "https://eunomia.dev/zh/tutorials/" > https://eunomia.dev/zh/tutorials/< / a > 以获取更多示例和完整的教程。< / p >
< div style = "break-before: page; page-break-before: always;" > < / div > < h1 id = "ebpf-入门开发实践教程四在-ebpf-中捕获进程打开文件的系统调用集合使用全局变量过滤进程-pid" > < a class = "header" href = "#ebpf-入门开发实践教程四在-ebpf-中捕获进程打开文件的系统调用集合使用全局变量过滤进程-pid" > eBPF 入门开发实践教程四:在 eBPF 中捕获进程打开文件的系统调用集合,使用全局变量过滤进程 pid< / a > < / h1 >
< p > eBPF( Extended Berkeley Packet Filter) 是一种内核执行环境, 它可以让用户在内核中运行一些安全的、高效的程序。它通常用于网络过滤、性能分析、安全监控等场景。eBPF 之所以强大,是因为它能够在内核运行时捕获和修改数据包或者系统调用,从而实现对操作系统行为的监控和调整。< / p >
< p > 本文是 eBPF 入门开发实践教程的第四篇,主要介绍如何捕获进程打开文件的系统调用集合,并使用全局变量在 eBPF 中过滤进程 pid。< / p >
@@ -704,7 +704,7 @@ Runing eBPF program...
< p > 本文介绍了如何使用 eBPF 程序来捕获进程打开文件的系统调用。在 eBPF 程序中,我们可以通过定义 < code > tracepoint__syscalls__sys_enter_open< / code > 和 < code > tracepoint__syscalls__sys_enter_openat< / code > 函数并使用 < code > SEC< / code > 宏把它们附加到 sys_enter_open 和 sys_enter_openat 两个 tracepoint 来捕获进程打开文件的系统调用。我们可以使用 < code > bpf_get_current_pid_tgid< / code > 函数获取调用 open 或 openat 系统调用的进程 ID, 并使用 < code > bpf_printk< / code > 函数在内核日志中打印出来。在 eBPF 程序中,我们还可以通过定义一个全局变量 < code > pid_target< / code > 来指定要捕获的进程的 pid, 从而过滤输出, 只输出指定的进程的信息。< / p >
< p > 通过学习本教程,您应该对如何在 eBPF 中捕获和过滤特定进程的系统调用有了更深入的了解。这种方法在系统监控、性能分析和安全审计等场景中具有广泛的应用。< / p >
< p > 更多的例子和详细的开发指南,请参考 eunomia-bpf 的官方文档:< a href = "https://github.com/eunomia-bpf/eunomia-bpf" > https://github.com/eunomia-bpf/eunomia-bpf< / a > < / p >
< p > 如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 以获取更多示例和完整的教程。< / p >
< p > 如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 或网站 < a href = "https://eunomia.dev/zh/tutorials/" > https://eunomia.dev/zh/tutorials/< / a > 以获取更多示例和完整的教程。< / p >
< div style = "break-before: page; page-break-before: always;" > < / div > < h1 id = "ebpf-入门开发实践教程五在-ebpf-中使用--uprobe-捕获-bash-的-readline-函数调用" > < a class = "header" href = "#ebpf-入门开发实践教程五在-ebpf-中使用--uprobe-捕获-bash-的-readline-函数调用" > eBPF 入门开发实践教程五:在 eBPF 中使用 uprobe 捕获 bash 的 readline 函数调用< / a > < / h1 >
< p > eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具,它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。< / p >
< p > 本文是 eBPF 入门开发实践教程的第五篇,主要介绍如何使用 uprobe 捕获 bash 的 readline 函数调用。< / p >
@@ -794,7 +794,7 @@ Runing eBPF program...
< h2 id = "总结-4" > < a class = "header" href = "#总结-4" > 总结< / a > < / h2 >
< p > 在上述代码中,我们使用了 SEC 宏来定义了一个 uprobe 探针,它指定了要捕获的用户空间程序 (bin/bash) 和要捕获的函数 (readline)。此外,我们还使用了 BPF_KRETPROBE 宏来定义了一个用于处理 readline 函数返回值的回调函数 (printret)。该函数可以获取到 readline 函数的返回值,并将其打印到内核日志中。通过这样的方式,我们就可以使用 eBPF 来捕获 bash 的 readline 函数调用,并获取用户在 bash 中输入的命令行。< / p >
< p > 更多的例子和详细的开发指南,请参考 eunomia-bpf 的官方文档:< a href = "https://github.com/eunomia-bpf/eunomia-bpf" > https://github.com/eunomia-bpf/eunomia-bpf< / a > < / p >
< p > 如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 以获取更多示例和完整的教程。< / p >
< p > 如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 或网站 < a href = "https://eunomia.dev/zh/tutorials/" > https://eunomia.dev/zh/tutorials/< / a > 以获取更多示例和完整的教程。< / p >
< div style = "break-before: page; page-break-before: always;" > < / div > < h1 id = "ebpf-入门开发实践教程六捕获进程发送信号的系统调用集合使用-hash-map-保存状态" > < a class = "header" href = "#ebpf-入门开发实践教程六捕获进程发送信号的系统调用集合使用-hash-map-保存状态" > eBPF 入门开发实践教程六:捕获进程发送信号的系统调用集合,使用 hash map 保存状态< / a > < / h1 >
< p > eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具,它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。< / p >
< p > 本文是 eBPF 入门开发实践教程的第六篇,主要介绍如何实现一个 eBPF 工具,捕获进程发送信号的系统调用集合,使用 hash map 保存状态。< / p >
@@ -910,7 +910,7 @@ Runing eBPF program...
< / code > < / pre >
< p > 并使用一些对应的 API 进行访问,例如 bpf_map_lookup_elem、bpf_map_update_elem、bpf_map_delete_elem 等。< / p >
< p > 更多的例子和详细的开发指南,请参考 eunomia-bpf 的官方文档:< a href = "https://github.com/eunomia-bpf/eunomia-bpf" > https://github.com/eunomia-bpf/eunomia-bpf< / a > < / p >
< p > 如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 以获取更多示例和完整的教程。< / p >
< p > 如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 或网站 < a href = "https://eunomia.dev/zh/tutorials/" > https://eunomia.dev/zh/tutorials/< / a > 以获取更多示例和完整的教程。< / p >
< div style = "break-before: page; page-break-before: always;" > < / div > < h1 id = "ebpf-入门实践教程七捕获进程执行事件通过-perf-event-array-向用户态打印输出" > < a class = "header" href = "#ebpf-入门实践教程七捕获进程执行事件通过-perf-event-array-向用户态打印输出" > eBPF 入门实践教程七:捕获进程执行事件,通过 perf event array 向用户态打印输出< / a > < / h1 >
< p > eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具,它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。< / p >
< p > 本文是 eBPF 入门开发实践教程的第七篇,主要介绍如何捕获 Linux 内核中进程执行的事件,并且通过 perf event array 向用户态命令行打印输出,不需要再通过查看 /sys/kernel/debug/tracing/trace_pipe 文件来查看 eBPF 程序的输出。通过 perf event array 向用户态发送信息之后,可以进行复杂的数据处理和分析。< / p >
@@ -1003,7 +1003,7 @@ TIME PID PPID UID COMM
< / code > < / pre >
< p > 就可以往用户态直接发送信息。< / p >
< p > 更多的例子和详细的开发指南,请参考 eunomia-bpf 的官方文档:< a href = "https://github.com/eunomia-bpf/eunomia-bpf" > https://github.com/eunomia-bpf/eunomia-bpf< / a > < / p >
< p > 如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 以获取更多示例和完整的教程。< / p >
< p > 如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 或网站 < a href = "https://eunomia.dev/zh/tutorials/" > https://eunomia.dev/zh/tutorials/< / a > 以获取更多示例和完整的教程。< / p >
< div style = "break-before: page; page-break-before: always;" > < / div > < h1 id = "ebpf-入门开发实践教程八在-ebpf-中使用-exitsnoop-监控进程退出事件使用-ring-buffer-向用户态打印输出" > < a class = "header" href = "#ebpf-入门开发实践教程八在-ebpf-中使用-exitsnoop-监控进程退出事件使用-ring-buffer-向用户态打印输出" > eBPF 入门开发实践教程八:在 eBPF 中使用 exitsnoop 监控进程退出事件,使用 ring buffer 向用户态打印输出< / a > < / h1 >
< p > eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具。它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。< / p >
< p > 本文是 eBPF 入门开发实践教程的第八篇,在 eBPF 中使用 exitsnoop 监控进程退出事件。< / p >
@@ -1521,7 +1521,7 @@ comm = cpptools
< p > runqlat 是一个 Linux 内核 BPF 程序,通过柱状图来总结调度程序运行队列延迟,显示任务等待运行在 CPU 上的时间长度。编译这个程序可以使用 ecc 工具,运行时可以使用 ecli 命令。< / p >
< p > runqlat 是一种用于监控Linux内核中进程调度延迟的工具。它可以帮助您了解进程在内核中等待执行的时间, 并根据这些信息优化进程调度, 提高系统的性能。可以在 libbpf-tools 中找到最初的源代码:< a href = "https://github.com/iovisor/bcc/blob/master/libbpf-tools/runqlat.bpf.c" > https://github.com/iovisor/bcc/blob/master/libbpf-tools/runqlat.bpf.c< / a > < / p >
< p > 更多的例子和详细的开发指南,请参考 eunomia-bpf 的官方文档:< a href = "https://github.com/eunomia-bpf/eunomia-bpf" > https://github.com/eunomia-bpf/eunomia-bpf< / a > < / p >
< p > 如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 以获取更多示例和完整的教程。< / p >
< p > 如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 或网站 < a href = "https://eunomia.dev/zh/tutorials/" > https://eunomia.dev/zh/tutorials/< / a > 以获取更多示例和完整的教程。< / p >
< div style = "break-before: page; page-break-before: always;" > < / div > < h1 id = "ebpf-入门开发实践教程十在-ebpf-中使用-hardirqs-或-softirqs-捕获中断事件" > < a class = "header" href = "#ebpf-入门开发实践教程十在-ebpf-中使用-hardirqs-或-softirqs-捕获中断事件" > eBPF 入门开发实践教程十:在 eBPF 中使用 hardirqs 或 softirqs 捕获中断事件< / a > < / h1 >
< p > eBPF (Extended Berkeley Packet Filter) 是 Linux 内核上的一个强大的网络和性能分析工具。它允许开发者在内核运行时动态加载、更新和运行用户定义的代码。< / p >
< p > 本文是 eBPF 入门开发实践教程的第十篇,在 eBPF 中使用 hardirqs 或 softirqs 捕获中断事件。
@@ -2302,7 +2302,7 @@ TIME EVENT COMM PID PPID FILENAME/EXIT CODE
< h2 id = "总结-10" > < a class = "header" href = "#总结-10" > 总结< / a > < / h2 >
< p > 通过这个实例,我们了解了如何将 eBPF 程序与用户态程序结合使用。这种结合为开发者提供了一个强大的工具集,可以实现跨内核和用户空间的高效数据收集和处理。通过使用 eBPF 和 libbpf, 您可以构建更高效、可扩展和安全的监控和性能分析工具。< / p >
< p > 在接下来的教程中,我们将继续深入探讨 eBPF 的高级特性,分享更多关于 eBPF 开发实践的内容。通过不断学习和实践,您将更好地理解和掌握 eBPF 技术,并将其应用于解决实际问题。< / p >
< p > 如果您希望学习更多关于 eBPF 的知识和实践,请查阅 eunomia-bpf 的官方文档:< a href = "https://github.com/eunomia-bpf/eunomia-bpf" > https://github.com/eunomia-bpf/eunomia-bpf< / a > 。您还可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 以获取更多示例和完整的教程。< / p >
< p > 如果您希望学习更多关于 eBPF 的知识和实践,请查阅 eunomia-bpf 的官方文档:< a href = "https://github.com/eunomia-bpf/eunomia-bpf" > https://github.com/eunomia-bpf/eunomia-bpf< / a > 。您还可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 或网站 < a href = "https://eunomia.dev/zh/tutorials/" > https://eunomia.dev/zh/tutorials/< / a > 以获取更多示例和完整的教程。< / p >
< div style = "break-before: page; page-break-before: always;" > < / div > < h1 id = "ebpf入门开发实践教程十三统计-tcp-连接延时并使用-libbpf-在用户态处理数据" > < a class = "header" href = "#ebpf入门开发实践教程十三统计-tcp-连接延时并使用-libbpf-在用户态处理数据" > eBPF入门开发实践教程十三: 统计 TCP 连接延时,并使用 libbpf 在用户态处理数据< / a > < / h1 >
< p > eBPF (Extended Berkeley Packet Filter) 是一项强大的网络和性能分析工具,被应用在 Linux 内核上。eBPF 允许开发者动态加载、更新和运行用户定义的代码,而无需重启内核或更改内核源代码。< / p >
< p > 本文是 eBPF 入门开发实践教程的第十三篇,主要介绍如何使用 eBPF 统计 TCP 连接延时,并使用 libbpf 在用户态处理数据。< / p >
@@ -2826,8 +2826,7 @@ PID COMM IP SADDR DADDR DPORT LAT(ms)
< p > 通过本篇 eBPF 入门实践教程,我们学习了如何使用 eBPF 来跟踪和统计 TCP 连接建立的延时。我们首先深入探讨了 eBPF 程序如何在内核态监听特定的内核函数,然后通过捕获这些函数的调用,从而得到连接建立的起始时间和结束时间,计算出延时。< / p >
< p > 我们还进一步了解了如何使用 BPF maps 来在内核态存储和查询数据,从而在 eBPF 程序的多个部分之间共享数据。同时,我们也探讨了如何使用 perf events 来将数据从内核态发送到用户态,以便进一步处理和展示。< / p >
< p > 在用户态,我们介绍了如何使用 libbpf 库的 API, 例如 perf_buffer__poll, 来接收和处理内核态发送过来的数据。我们还讲解了如何对这些数据进行解析和打印, 使得它们能以人类可读的形式显示出来。< / p >
< p > 如果您希望学习更多关于 eBPF 的知识和实践,请查阅 eunomia-bpf 的官方文档:< a href = "https://github.com/eunomia-bpf/eunomia-bpf" > https://github.com/eunomia-bpf/eunomia-bpf< / a > 。您还可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 以获取更多示例和完整的教程。< / p >
< p > 接下来的教程将进一步探讨 eBPF 的高级特性,例如如何使用 eBPF 来追踪网络包的传输路径,如何利用 eBPF 对系统的性能进行细粒度的监控等等。我们会继续分享更多有关 eBPF 开发实践的内容,帮助您更好地理解和掌握 eBPF 技术,希望这些内容对您在 eBPF 开发道路上的学习和实践有所帮助。< / p >
< p > 如果您希望学习更多关于 eBPF 的知识和实践,请查阅 eunomia-bpf 的官方文档:< a href = "https://github.com/eunomia-bpf/eunomia-bpf" > https://github.com/eunomia-bpf/eunomia-bpf< / a > 。您还可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 或网站 < a href = "https://eunomia.dev/zh/tutorials/" > https://eunomia.dev/zh/tutorials/< / a > 以获取更多示例和完整的教程。< / p >
< div style = "break-before: page; page-break-before: always;" > < / div > < h1 id = "ebpf入门实践教程十四记录-tcp-连接状态与-tcp-rtt" > < a class = "header" href = "#ebpf入门实践教程十四记录-tcp-连接状态与-tcp-rtt" > eBPF入门实践教程十四: 记录 TCP 连接状态与 TCP RTT< / a > < / h1 >
< p > eBPF (扩展的伯克利数据包过滤器) 是一项强大的网络和性能分析工具,被广泛应用在 Linux 内核上。eBPF 使得开发者能够动态地加载、更新和运行用户定义的代码,而无需重启内核或更改内核源代码。< / p >
< p > 在我们的 eBPF 入门实践教程系列的这一篇,我们将介绍两个示例程序:< code > tcpstates< / code > 和 < code > tcprtt< / code > 。< code > tcpstates< / code > 用于记录 TCP 连接的状态变化,而 < code > tcprtt< / code > 则用于记录 TCP 的往返时间 (RTT, Round-Trip Time)。< / p >
@@ -3175,7 +3174,7 @@ cnt = 0
< / ul >
< h2 id = "总结-12" > < a class = "header" href = "#总结-12" > 总结< / a > < / h2 >
< p > 通过本篇 eBPF 入门实践教程, 我们学习了如何使用tcpstates和tcprtt这两个 eBPF 示例程序,监控和分析 TCP 的连接状态和往返时间。我们了解了tcpstates和tcprtt的工作原理和实现方式, 包括如何使用 BPF map 存储数据,如何在 eBPF 程序中获取和处理 TCP 连接信息,以及如何在用户态应用程序中解析和显示 eBPF 程序收集的数据。< / p >
< p > 如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 以获取更多示例和完整的教程。接下来的教程将进一步探讨 eBPF 的高级特性,我们会继续分享更多有关 eBPF 开发实践的内容。< / p >
< p > 如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 或网站 < a href = "https://eunomia.dev/zh/tutorials/" > https://eunomia.dev/zh/tutorials/< / a > 以获取更多示例和完整的教程。接下来的教程将进一步探讨 eBPF 的高级特性,我们会继续分享更多有关 eBPF 开发实践的内容。< / p >
< div style = "break-before: page; page-break-before: always;" > < / div > < h1 id = "ebpf-入门实践教程十五使用-usdt-捕获用户态-java-gc-事件耗时" > < a class = "header" href = "#ebpf-入门实践教程十五使用-usdt-捕获用户态-java-gc-事件耗时" > eBPF 入门实践教程十五:使用 USDT 捕获用户态 Java GC 事件耗时< / a > < / h1 >
< p > eBPF (扩展的伯克利数据包过滤器) 是一项强大的网络和性能分析工具,被广泛应用在 Linux 内核上。eBPF 使得开发者能够动态地加载、更新和运行用户定义的代码,而无需重启内核或更改内核源代码。这个特性使得 eBPF 能够提供极高的灵活性和性能, 使其在网络和系统性能分析方面具有广泛的应用。此外, eBPF 还支持使用 USDT (用户级静态定义跟踪点) 捕获用户态的应用程序行为。< / p >
< p > 在我们的 eBPF 入门实践教程系列的这一篇,我们将介绍如何使用 eBPF 和 USDT 来捕获和分析 Java 的垃圾回收 (GC) 事件的耗时。< / p >
@@ -3436,7 +3435,7 @@ TIME CPU PID GC TIME
< h2 id = "总结-13" > < a class = "header" href = "#总结-13" > 总结< / a > < / h2 >
< p > 通过本篇 eBPF 入门实践教程,我们学习了如何使用 eBPF 和 USDT 动态跟踪和分析 Java 的垃圾回收(GC)事件。我们了解了如何在用户态应用程序中设置 USDT 跟踪点,以及如何编写 eBPF 程序来捕获这些跟踪点的信息,从而更深入地理解和优化 Java GC 的行为和性能。< / p >
< p > 此外,我们也介绍了一些关于 Java GC、USDT 和 eBPF 的基础知识和实践技巧,这些知识和技巧对于想要在网络和系统性能分析领域深入研究的开发者来说是非常有价值的。< / p >
< p > 如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 以获取更多示例和完整的教程。< / p >
< p > 如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 或网站 < a href = "https://eunomia.dev/zh/tutorials/" > https://eunomia.dev/zh/tutorials/< / a > 以获取更多示例和完整的教程。< / p >
< div style = "break-before: page; page-break-before: always;" > < / div > < h1 id = "ebpf-入门实践教程十六编写-ebpf-程序-memleak-监控内存泄漏" > < a class = "header" href = "#ebpf-入门实践教程十六编写-ebpf-程序-memleak-监控内存泄漏" > eBPF 入门实践教程十六:编写 eBPF 程序 Memleak 监控内存泄漏< / a > < / h1 >
< p > eBPF( 扩展的伯克利数据包过滤器) 是一项强大的网络和性能分析工具, 被广泛应用在 Linux 内核上。eBPF 使得开发者能够动态地加载、更新和运行用户定义的代码,而无需重启内核或更改内核源代码。< / p >
< p > 在本篇教程中,我们将探讨如何使用 eBPF 编写 Memleak 程序,以监控程序的内存泄漏。< / p >
@@ -3826,7 +3825,7 @@ Tracing outstanding memory allocs... Hit Ctrl-C to end
< / code > < / pre >
< h2 id = "总结-14" > < a class = "header" href = "#总结-14" > 总结< / a > < / h2 >
< p > 通过本篇 eBPF 入门实践教程,您已经学习了如何编写 Memleak eBPF 监控程序,以实时监控程序的内存泄漏。您已经了解了 eBPF 在内存监控方面的应用,学会了使用 BPF API 编写 eBPF 程序,创建和使用 eBPF maps, 并且明白了如何用 eBPF 工具监测和分析内存泄漏问题。我们展示了一个详细的例子,帮助您理解 eBPF 代码的运行流程和原理。< / p >
< p > 您可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 以获取更多示例和完整的教程。< / p >
< p > 您可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 或网站 < a href = "https://eunomia.dev/zh/tutorials/" > https://eunomia.dev/zh/tutorials/< / a > 以获取更多示例和完整的教程。< / p >
< p > 接下来的教程将进一步探讨 eBPF 的高级特性,我们会继续分享更多有关 eBPF 开发实践的内容。希望这些知识和技巧能帮助您更好地了解和使用 eBPF, 以解决实际工作中遇到的问题。< / p >
< div style = "break-before: page; page-break-before: always;" > < / div > < h1 id = "ebpf-入门实践教程编写-ebpf-程序-biopattern-统计随机顺序磁盘-io" > < a class = "header" href = "#ebpf-入门实践教程编写-ebpf-程序-biopattern-统计随机顺序磁盘-io" > eBPF 入门实践教程:编写 eBPF 程序 Biopattern: 统计随机/顺序磁盘 I/O< / a > < / h1 >
< h2 id = "背景-1" > < a class = "header" href = "#背景-1" > 背景< / a > < / h2 >
@@ -3964,7 +3963,7 @@ Retrying.
< p > 完整源代码:< a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/19-lsm-connect" > https://github.com/eunomia-bpf/bpf-developer-tutorial/tree/main/src/19-lsm-connect< / a > < / p >
< h2 id = "总结-16" > < a class = "header" href = "#总结-16" > 总结< / a > < / h2 >
< p > 本文介绍了如何使用 BPF LSM 来限制通过 socket 对特定 IPv4 地址的访问。我们可以通过修改 GRUB 配置文件来开启 LSM 的 BPF 挂载点。在 eBPF 程序中,我们通过 < code > BPF_PROG< / code > 宏定义函数,并通过 < code > SEC< / code > 宏指定挂载点;在函数实现上,遵循 LSM 安全检查模块中 " cannot override a denial" 的原则,并根据 socket 连接请求的目的地址对该请求进行限制。< / p >
< p > 如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 以获取更多示例和完整的教程。< / p >
< p > 如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 或网站 < a href = "https://eunomia.dev/zh/tutorials/" > https://eunomia.dev/zh/tutorials/< / a > 以获取更多示例和完整的教程。< / p >
< h2 id = "参考" > < a class = "header" href = "#参考" > 参考< / a > < / h2 >
< ul >
< li > < a href = "https://github.com/leodido/demo-cloud-native-ebpf-day" > https://github.com/leodido/demo-cloud-native-ebpf-day< / a > < / li >
@@ -4041,7 +4040,7 @@ Packing ebpf object and config into package.json...
< / code > < / pre >
< h2 id = "总结-17" > < a class = "header" href = "#总结-17" > 总结< / a > < / h2 >
< p > 本文介绍了如何向 TC 流量控制子系统挂载 eBPF 类型的 filter 来实现对链路层数据包的排队处理。基于 eunomia-bpf 提供的通过注释向 libbpf 传递参数的方案,我们可以将自己编写的 tc BPF 程序以指定选项挂载到目标网络设备,并借助内核的 sk_buff 结构对数据包进行过滤处理。< / p >
< p > 如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 以获取更多示例和完整的教程。< / p >
< p > 如果您希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 或网站 < a href = "https://eunomia.dev/zh/tutorials/" > https://eunomia.dev/zh/tutorials/< / a > 以获取更多示例和完整的教程。< / p >
< h2 id = "参考-1" > < a class = "header" href = "#参考-1" > 参考< / a > < / h2 >
< ul >
< li > < a href = "http://just4coding.com/2022/08/05/tc/" > http://just4coding.com/2022/08/05/tc/< / a > < / li >
@@ -4174,7 +4173,7 @@ Error: BpfError("load and attach ebpf program failed")
< / ol >
< p > 目前在 Android 系统中使用 eBPF 工具基本上仍然需要构建完整的 Linux 运行环境,但 Android 内核本身对 eBPF 的支持已较为全面,本次测试证明较高版本的 Android 内核支持 BTF 调试信息和依赖 CO-RE 的 eBPF 程序的运行。< / p >
< p > Android 系统 eBPF 工具的发展需要官方新特性的加入,目前看来通过 Android APP 直接使用 eBPF 工具需要的工作量较大,同时由于 eBPF 工具需要 root 权限,普通 Android 用户的使用会面临较多困难。< / p >
< p > 如果希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 以获取更多示例和完整的教程。< / p >
< p > 如果希望学习更多关于 eBPF 的知识和实践,可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 或网站 < a href = "https://eunomia.dev/zh/tutorials/" > https://eunomia.dev/zh/tutorials/< / a > 以获取更多示例和完整的教程。< / p >
< h2 id = "参考-2" > < a class = "header" href = "#参考-2" > 参考< / a > < / h2 >
< div class = "footnote-definition" id = "Google" > < sup class = "footnote-definition-label" > 2< / sup >
< p > < a href = "https://source.android.google.cn/docs/core/architecture/kernel/bpf" > https://source.android.google.cn/docs/core/architecture/kernel/bpf< / a >
@@ -4590,8 +4589,7 @@ yunwei 31583 0.0 0.0 17712 2612 pts/1 S+ 05:42 0:00 grep --color=
< / code > < / pre >
< h2 id = "总结-19" > < a class = "header" href = "#总结-19" > 总结< / a > < / h2 >
< p > 通过本篇 eBPF 入门实践教程,我们深入了解了如何使用 eBPF 来隐藏进程或文件信息。我们学习了如何编写和加载 eBPF 程序,如何通过 eBPF 拦截系统调用并修改它们的行为,以及如何将这些知识应用到实际的网络安全和防御工作中。此外,我们也了解了 eBPF 的强大性,尤其是它能在不需要修改内核源代码或重启内核的情况下,允许用户在内核中执行自定义代码的能力。< / p >
< p > 您还可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 以获取更多示例和完整的教程。< / p >
< p > 接下来的教程将进一步探讨 eBPF 的高级特性,我们会继续分享更多有关 eBPF 开发实践的内容,包括如何使用 eBPF 进行网络和系统性能分析,如何编写更复杂的 eBPF 程序以及如何将 eBPF 集成到您的应用中。希望你会在我们的教程中找到有用的信息,进一步提升你的 eBPF 开发技能。< / p >
< p > 您还可以访问我们的教程代码仓库 < a href = "https://github.com/eunomia-bpf/bpf-developer-tutorial" > https://github.com/eunomia-bpf/bpf-developer-tutorial< / a > 或网站 < a href = "https://eunomia.dev/zh/tutorials/" > https://eunomia.dev/zh/tutorials/< / a > 以获取更多示例和完整的教程。< / p >
< div style = "break-before: page; page-break-before: always;" > < / div > < h1 id = "用-bpf_send_signal-发送信号终止恶意进程" > < a class = "header" href = "#用-bpf_send_signal-发送信号终止恶意进程" > 用 bpf_send_signal 发送信号终止恶意进程< / a > < / h1 >
< p > 编译:< / p >
< pre > < code class = "language-bash" > make