use png instead of jpg

This commit is contained in:
yunwei37
2023-06-15 16:51:00 +08:00
parent a53481d131
commit f576ebc02d
7 changed files with 16 additions and 13 deletions

View File

@@ -10,7 +10,7 @@ eBPF 是一项革命性的技术,起源于 Linux 内核,可以在操作系
对于浏览器而言JavaScript 的引入带来的可编程性开启了一场巨大的革命,使浏览器发展成为几乎独立的操作系统。现在让我们回到 eBPF为了理解 eBPF 对 Linux 内核的可编程性影响,对 Linux 内核的结构以及它如何与应用程序和硬件进行交互有一个高层次的理解是有帮助的[4]。
![kernel-arch](https://raw.githubusercontent.com/eunomia-bpf/bpf-developer-tutorial/main/src/0-introduce/kernel-arch.webp)
![kernel-arch](kernel-arch.png)
Linux 内核的主要目的是抽象出硬件或虚拟硬件并提供一个一致的API系统调用允许应用程序运行和共享资源。为了实现这个目的我们维护了一系列子系统和层以分配这些责任[5]。每个子系统通常允许某种程度的配置,以考虑到用户的不同需求。如果不能配置所需的行为,就需要改变内核,从历史上看,改变内核的行为,或者让用户编写的程序能够在内核中运行,就有两种选择:
@@ -22,7 +22,7 @@ Linux 内核的主要目的是抽象出硬件或虚拟硬件,并提供一个
有了 eBPF就有了一个新的选择可以重新编程 Linux 内核的行为,而不需要改变内核的源代码或加载内核模块,同时保证在不同内核版本之间一定程度上的行为一致性和兼容性、以及安全性[6]。为了实现这个目的eBPF 程序也需要有一套对应的 API允许用户定义的应用程序运行和共享资源 --- 换句话说,某种意义上讲 eBPF 虚拟机也提供了一套类似于系统调用的机制,借助 eBPF 和用户态通信的机制Wasm 虚拟机和用户态应用也可以获得这套“系统调用”的完整使用权,一方面能可编程地扩展传统的系统调用的能力,另一方面能在网络、文件系统等许多层次实现更高效的可编程 IO 处理。
![new-os](https://github.com/eunomia-bpf/bpf-developer-tutorial/blob/main/src/0-introduce/new-os-model.jpg?raw=true)
![new-os](new-os-model.png)
正如上图所示,当今的 Linux 内核正在向一个新的内核模型演化:用户定义的应用程序可以在内核态和用户态同时执行,用户态通过传统的系统调用访问系统资源,内核态则通过 BPF Helper Calls 和系统的各个部分完成交互。截止 2023 年初,内核中的 eBPF 虚拟机中已经有 220 多个Helper 系统接口,涵盖了非常多的应用场景。

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 KiB

View File

@@ -27,6 +27,10 @@ TCP 连接的建立过程常被称为“三次握手”Three-way Handshake
7. 服务器接收 ACK服务器内核接收并处理 ACK然后将对应的连接从半连接队列移动到全连接队列。这涉及到一次软中断的 CPU 开销。
8. 唤醒服务器端用户进程:被 `accept()` 系统调用阻塞的用户进程被唤醒然后从全连接队列中取出来已经建立好的连接。这涉及一次上下文切换的CPU开销。
完整的流程图如下所示:
![tcpconnlat1](tcpconnlat1.png)
在客户端视角在正常情况下一次TCP连接总的耗时也就就大约是一次网络RTT的耗时。但在某些情况下可能会导致连接时的网络传输耗时上涨、CPU处理开销增加、甚至是连接失败。这种时候在发现延时过长之后就可以结合其他信息进行分析。
## tcpconnlat 的 eBPF 实现

View File

@@ -3,23 +3,22 @@
# eBPF 实践教程:基于 libbpf 和 CO-RE
- [介绍 eBPF 的基本概念、常见的开发工具](0-introduce/README.md)
- [Hello World基本框架和开发流程](1-helloworld/README.md)
- [在 eBPF 中使用 kprobe 监测捕获 unlink 系统调用](2-kprobe-unlink/README.md)
- [在 eBPF 中使用 fentry 监测捕获 unlink 系统调用](3-fentry-unlink/README.md)
- [在 eBPF 中捕获进程打开文件的系统调用集合,使用全局变量过滤进程 pid](4-opensnoop/README.md)
- [在 eBPF 中使用 uprobe 捕获 bash 的 readline 函数调用](5-uprobe-bashreadline/README.md)
- [eBPF Hello World基本框架和开发流程](1-helloworld/README.md)
- [使用 kprobe 监测捕获 unlink 系统调用](2-kprobe-unlink/README.md)
- [使用 fentry 监测捕获 unlink 系统调用](3-fentry-unlink/README.md)
- [捕获进程打开文件的系统调用集合,使用全局变量过滤进程 pid](4-opensnoop/README.md)
- [使用 uprobe 捕获 bash 的 readline 函数调用](5-uprobe-bashreadline/README.md)
- [捕获进程发送信号的系统调用集合,使用 hash map 保存状态](6-sigsnoop/README.md)
- [捕获进程执行/退出时间,通过 perf event array 向用户态打印输出](7-execsnoop/README.md)
- [在 eBPF 中使用 exitsnoop 监控进程退出事件,使用 ring buffer 向用户态打印输出](8-exitsnoop/README.md)
- [使用 exitsnoop 监控进程退出事件,使用 ring buffer 向用户态打印输出](8-exitsnoop/README.md)
- [一个 Linux 内核 BPF 程序,通过柱状图来总结调度程序运行队列延迟,显示任务等待运行在 CPU 上的时间长度](9-runqlat/README.md)
- [在 eBPF 中使用 hardirqs 或 softirqs 捕获中断事件](10-hardirqs/README.md)
- [在 eBPF 中使用 bootstrap 开发用户态程序并跟踪 exec() 和 exit() 系统调用](11-bootstrap/README.md)
- [使用 hardirqs 或 softirqs 捕获中断事件](10-hardirqs/README.md)
- [使用 bootstrap 开发用户态程序并跟踪 exec() 和 exit() 系统调用](11-bootstrap/README.md)
- [使用 libbpf-bootstrap 开发程序统计 TCP 连接延时](13-tcpconnlat/README.md)
- [编写 eBPF 程序 tcpconnlat 测量 tcp 连接延时](13-tcpconnlat/tcpconnlat.md)
- [使用 libbpf-bootstrap 开发程序统计 TCP 连接延时](14-tcpstates/README.md)
- [使用 libbpf-bootstrap 记录 TCP 连接状态与 TCP RTT](14-tcpstates/README.md)
- [使用 USDT 捕获用户态 Java GC 事件耗时](15-javagc/README.md)
- [编写 eBPF 程序 Memleak 监控内存泄漏](16-memleak/README.md)
- [编写 eBPF 程序 Biopattern: 统计随机/顺序磁盘 I/O](17-biopattern/README.md)
- [编写 eBPF 程序 Biopattern 统计随机/顺序磁盘 I/O](17-biopattern/README.md)
- [更多的参考资料](18-further-reading/README.md)
- [使用 LSM 进行安全检测防御](19-lsm-connect/README.md)
- [使用 eBPF 进行 tc 流量控制](20-tc/README.md)