收藏 分销(赏)

eBPF技术实践白皮书.pdf

上传人:Stan****Shan 文档编号:1188367 上传时间:2024-04-18 格式:PDF 页数:65 大小:3.62MB
下载 相关 举报
eBPF技术实践白皮书.pdf_第1页
第1页 / 共65页
eBPF技术实践白皮书.pdf_第2页
第2页 / 共65页
eBPF技术实践白皮书.pdf_第3页
第3页 / 共65页
eBPF技术实践白皮书.pdf_第4页
第4页 / 共65页
eBPF技术实践白皮书.pdf_第5页
第5页 / 共65页
点击查看更多>>
资源描述

1、 编写说明编写说明 编写单位编写单位:浪潮电子信息产业股份有限公司、阿里云计算有限公司 参编组织参编组织:龙蜥社区 编写组成员编写组成员:苏志远、吴栋、方浩、王传国、梁媛、黄吉旺、毛文安、程书意、甄鹏、李宏伟、彭彬彬 前言 eBPF 的诞生是 BPF 技术的一个转折点,使得 BPF 不再仅限于网络栈,而是成为内核的一个顶级子系统。在内核发展的同时,eBPF 繁荣的生态也进一步促进了 eBPF 技术的蓬勃发展。随着内核的复杂性不断增加,eBPF 以安全、稳定、零侵入、方便的内核可编程性等特点成为实现内核定制与功能多样性的最佳选择,为内核提供了应对未来挑战的基础。本白皮书重点介绍 eBPF 技术的

2、概念、技术实践以及发展趋势。本书首先梳理了eBPF 的架构和重要技术原理,然后分析了 eBPF 在多种典型应用场景的使用方案,并进一步对 eBPF 技术的发展趋势做了探讨。目录目录 eBPF 简介.6 eBPF 技术介绍.7 2.1 eBPF 架构.7 2.1.1 eBPF 加载过程.8 2.1.2 JIT 编译.9 2.1.3 挂载与执行.10 2.2 eBPF 常见的开发框架.17 2.2.1 BCC.17 2.2.2 bpfTrace.18 2.2.3 libbpf.18 2.2.4 libbpf-bootstrap.19 2.2.5 cilium-ebpf.19 2.2.6 Coolb

3、pf.19 eBPF 的应用场景与实践.23 3.1 基于 eBPF 的系统诊断.23 3.1.1 系统诊断面临挑战.23 3.1.2 基于 eBPF 的系统诊断方案.28 3.2 基于 eBPF 的虚拟化 IO 全链路时延监测.34 3.2.1 虚拟化 IO 全路径分析主要面临的挑战.34 3.2.2 基于 bpftrace 虚拟化 IO 路径追踪解决方案.36 3.3 基于 eBPF 的网络性能优化.41 3.3.1 Linux 网络性能优化面临的技术挑战.41 3.3.2 基于 eBPF 的 Linux 内核网络性能优化解决方案.44 3.4 基于 eBPF 的主机安全.53 3.4.1

4、 传统解决方案面临挑战.53 3.4.2 基于 eBPF 的新一代主机安全解决方案.54 挑战与展望.63 eBPF 简介 eBPFeBPF 简介简介 eBPF 是一项起源于 Linux 内核的革命性技术,可以在特权上下文中(如操作系统内核)运行沙盒程序。它可以安全有效地扩展内核的功能,并且不需要更改内核源代码或加载内核模块。内核因具有监督和控制整个系统的特权,一直是实现可观察性、安全性和网络功能的理想场所。同时,由于对稳定性和安全性的高要求,内核发展相对缓慢,与内核之外实现的功能相比,创新速度较慢。eBPF 从根本上改变了上述情况,它允许在内核中运行沙箱程序,即通过运行eBPF 程序向正在运

5、行中的操作系统添加额外的功能,并通过验证引擎和即时编译器保证安全性和执行效率,由此衍生出了一系列的产品和项目,涉及下一代网络、可观察性和安全技术。如今,eBPF 在多种应用场景中起到重要作用:在现代数据中心和云原生环境中提供高性能网络和负载均衡,以低开销提取细粒度的安全可观察性数据,帮助应用程序开发人员跟踪应用程序的运行状态,高效进行性能故障定位,保证应用程序和容器运行时安全等。eBPF 引领的创新才刚刚开始,一切皆有可能。eBPF 技术介绍 eBPFeBPF 技术介绍技术介绍 2.1 eBPFeBPF 架构架构 eBPF 包括用户空间程序和内核程序两部分,用户空间程序负责加载 BPF 字节码

6、至内核,内核中的 BPF 程序负责在内核中执行特定事件,用户空间程序与内核 BPF程序可以使用 map 结构实现双向通信,这为内核中运行的 BPF 程序提供了更加灵活的控制。eBPF 的工作逻辑如下:1、eBPF Program 通过 LLVM/Clang 编译成 eBPF 定义的字节码;2、通过系统调用 bpf()将字节码指令传入内核中;3、由 Verifier 检验字节码的安全性、合规性;4、在确认字节码程序的安全性后,JIT Compiler 会将其转换成可以在当前系统运行的机器码;5、根据程序类型的不同,把可运行机器码挂载到内核不同的位置/HOOK 点;6、等待触发执行,其中不同的程序

7、类型、不同的 HOOK 点的触发时机是不相同的;并且在 eBPF 程序运行过程中,用户空间可通过 eBPF map 与内核进行双向通信;eBPF 技术介绍 图 2-1-1 eBPF 基本架构与使用示意图 2.1.1 eBPFeBPF 加载过程加载过程 编译得到的 BPF 字节码文件,经过字节码读取、重定位和 Verifier 等过程,加载到内核中。1 1、字节码读取字节码读取 通常 eBPF 字节码文件都是 ELF 格式,各 section 中保存着字节码所有的信息,包括字节码指令、map 定义、BTF 信息,以及需要重定位的变量和函数等;eBPF 加载时,依照 ELF 格式读取字节码文件,把

8、各种信息按照一定的格式保存起来。2 2、重定位、重定位 重定位是指在编译、加载的过程中把字节码中一些临时数据以更准确的信息进行替换,比如用 map 句柄替换 map 索引,用 map 地址替换 map 句柄。经过多轮重定位,可以确保 eBPF 程序在内核中运行所需数据的正确性和完整性。需要重定位的对象有:map、函数调用、Helper 函数调用、字段、Extern 内核符号和 kconfig。eBPF 技术介绍 重定位操作主要分为 2 类:1)BPF 基础设施提供了一组有限的“稳定接口”,通过 convert_ctx_access 对CTX 进行转换,实现内核版本升级时的稳定性和兼容性。2)C

9、O-RE 采用(BTF)非硬编码的形式对成员在结构中的偏移位置进行描述,解决不同版本之间的差异性问题。3 3、V Verifiererifier Verifier 是一个静态代码安全检查器,用于检查 eBPF 程序的安全性,保证 eBPF程序不会破坏内核,影响内核的稳定性。安全检查主要分成两个阶段。第一个阶段检查函数的深度和指令数,通过使用深度优先遍历,来检查是否为有向无环图(DAG)。第二个阶段检查每条 bytecode 指令,根据指令的分类(class),检查其操作寄存器的读写属性、内存访问是否越界、BPF_CALL 是否符合接口协议等。指针的安全性检查在第二个阶段实现,每次把指针加载到寄

10、存器时都会进行指针类型的判定,根据指针类型定义确定读写属性和大小,实现针对指针操作的安全性检查;未识别的指针类型不允许解引用。2.1.2 JITJIT 编译编译 执行字节码是一个模拟 CPU 执行机器码的过程,在运行时需要先把指令依次翻译成机器码之后才能运行,所以比机器码的执行效率低很多。JIT(Just In Time)的eBPF 技术介绍 中文意思是即时编译,主要为了解决虚拟机运行中间码时效率不高的问题。JIT 编译在执行前先把中间码编译成对应的机器码并缓存起来,从而运行时能够直接执行机器码,这样就解决了每次执行都需要进行中间码解析的问题,如下图所示:图 2-1-2 JIT 的作用示意图

11、2.1.3 挂载与执行挂载与执行 eBPF 在内核提供了大量的挂载点,算上 kprobe 挂载点,几乎可以在内核代码的任意函数挂载一段 eBPF 程序。不同 eBPF 程序类型的挂载点各不相同,挂载点是根据设计与需求提前在内核指定位置通过提前嵌入代码实现的,初始时函数指针是空,挂载 eBPF 程序后,对指针赋值,指向 eBPF 内核程序。为了安全性,挂载 eBPF 程序需要 root 权限或 CAP_BPF capability,不过目前也有设计允许非 root 权限帐号载入 eBPF 程序,比如将 kernel.unprivileged_bpf_disabled sysctl 设置为 fal

12、se 的情况下,非 root 帐号能够使用 bpf()系统调用。eBPF 技术介绍 eBPF 内核程序基于事件触发,当内核执行到对应的挂载点时就会执行挂载在此处的 eBPF 程序。eBPF 执行过程中会用到一个很重要的数据结构 map,map 的主要功能是用来实现 BPF 程序执行过程中用户空间程序与内核 BPF 程序之间的双向通信,这也为内核中运行的 BPF 程序提供了更加灵活的控制。1、map 的的实现实现 map 的定义信息在编译后会保存到字节码文件中名为 maps 的 section 中,bpf 加载器读取到 map 信息后调用系统调用创建 eBPF map,系统调用返回由 anon_

13、inodefs文件系统生成的 fd。加载器将内核返回的 map 的 fd,替换到使用 map 的 eBPF 指令的常量字段中,相当于直接修改编译后的 BPF 指令。加载器在指令替换 map fd 后,才会调用 cmd 为 BPF_PROG_LOAD 的 bpf 系统调用,将程序加载到内核。内核在加载eBPF程序系统调用过程中,会根据eBPF指令中常量字段存储的map fd,找到内核态中的 map,然后将 map 内存地址替换到对应的 BPF 指令。最终,BPF 程序在内核执行阶段能根据指令存储的内存地址访问到 map。在 eBPF 数据面中,使用 eBPF map 只需要按照规范定义 map

14、的结构,然后使用bpf_map_lookup_elem、bpf_map_update_elem、bpf_map_delete_elem 等 helper function就可以对 map 进行查询、更新、删除等操作。2、map 的的性能性能 eBPF 技术介绍 eBPF map 有多种不同类型,支持不同的数据结构,最常见的例如 Array、Percpu Array、Hash、Percpu Hash、Lru Hash、Percpu lru Hash、Lpm 等等。常用 map 的查询性能比较如下:Array Percpu Array Hash Percpu Hash Lru Hash Lpm 需

15、要着重说明的是,Array 的查询性能比 Percpu Array 更好,Hash 的查询性能也比 Percpu Hash 更好,这是由于 Array 和 Hash 的 lookup helper 层面在内核有更多的优化。对于读多写少的情况下,使用 Array 比 Percpu Array 更优(Hash、Percpu Hash 同理),而对于读少写多的情况(比如统计计数)使用 Percpu 更优。2.1.3.1 eBPF 常见程序类型常见程序类型 eBPF 作为一个通用执行引擎,可用于性能分析工具、软件定义网络等诸多场景的开发工作。根据应用场景的不同,eBPF 程序类型大致可以分为三类:表

16、2-1-1 eBPF 程序类型分类 分类 用途 包含的程序类型 跟踪 主要用于从系统中提取跟踪信息,进而为监控、排错、性能优化等提供数据支撑 tracepoint,kprobe,perf_event 等 网络 主要用于对网络数据包进行过滤和处理,进而实现网络的观测、过滤、流量xdp,sock_ops,sk_msg,sk_skb,sk_reuseport,socket_filter,eBPF 技术介绍 控制以及性能优化等各种丰富的功能 cgroup_sock_addr 等 其他 主要用于安全和其他功能 LSM,flow_dissector,lwt_in,lwt_out,lwt_xmit 等 1、

17、kprobe kprobe 是 linux 系统的一个动态调试机制,使用它可以向内核添加探针(Probe),在代码执行前或执行后触发一个回调函数。这个机制通常用于调试内核代码,跟踪应用程序执行或收集性能统计信息。通过使用 kprobe,开发人员可以在不影响系统运行逻辑的情况下,对操作系统进行深入的分析和调试。kprobe 机制提供了两种形式的探测点,一种最基本的 kprobe:用于在指定代码执行前、执行后进行探测,挂载点可以是内核代码的任何指令处;一种是 kretprobe:用于完成指定函数返回值的探测功能,挂载点是内核函数的返回位置;当内核执行到指定的探测函数时,会调用回调函数,用户便可收集

18、所需的信息,在完成回调函数后,内核会继续回到原来的位置正常执行。如果用户已经收集足够的信息,不再需要继续探测,则同样可以动态的移除探测点。eBPF 可以在内核态高效的分析 kprobe 采集到的数据,仅把结果反馈到用户空间,而不需要像传统系统一样必须将大量的采样数据全部传输到用户空间再进行分析,极大地减轻了内核态与用户态的通信压力,使得持续地实时分析成为可能。eBPF 技术介绍 2、XDP XDP 全称 eXpress Data Path,即快速数据路径,XDP 是 Linux 网络处理流程中的一个 eBPF 钩子,能够挂载 eBPF 程序,它能够在网络数据包到达网卡驱动层时对其进行处理,具有

19、非常优秀的数据面处理性能,打通了 Linux 网络处理的高速公路。XDP 程序最常用的模式是 native,它的挂载点处于网卡驱动之中,在网络驱动程序刚收到数据包时触发,无需通过网络协议栈,可用来实现高性能网络处理方案,常用于 DDos 防御,防火墙,4 层负载均衡等场景。图 2-1-3 XDP 的工作过程示意图 XDP 程序在处理网络包后,有不同处理方式 表 2-1-2 XDP 的处理方式 命令码 含义 使用场景 eBPF 技术介绍 XDP_DROP 丢包 防火墙,DDOS 攻击防御 XDP_PASS 传递到内核协议栈 正常处理 XDP_TX/XDP_REDIRECT 转发到同一/不同网卡

20、负载均衡 XDP_ABORTED 错误 XDP 处理错误 3、TC Linux TC 是 Linux 操作系统中的一个调度器,它是 Traffic Control 的缩写,是一种网络流量控制、流量压缩和 QoS(Quality of Service)保证机制,在 Linux 内核中相当于一个独立的子系统,它管理着 Linux 内核中的网络设备和队列,可以实现对不同类型的流(如 HTTP、FTP、SSH 等)的流量限制、限流、分类和优化等,所有这些功能都是经过用户态 TC 命令工具来完成的,一般包括以下的步骤:1、为网卡配置一个队列;2、在该队列上创建分类;3、根据需要创建子队列和子分类;4、为

21、每一个分类创建过滤器。eBPF 在 TC 功能的 sch_handle_ingress、sch_handle_egress 函数中分别添加 HOOK点实现了 TC ingress 和 TC egress 两个挂载点,用于实现对网络流量的整形调度和带宽控制。eBPF 技术介绍 eBPF/TC 直接获取内核解析后的网络报文数据结构 sk_buff,可以获取到更详细的数据。而且由于 eBPF 程序的引入,可以通过 eBPF map 实现用户态与内核态的数据交互,而 map 数据结构则相比 TC 的规则更加直观,也更加好管理。4、Sock_ops sock_ops 是一种通过 eBPF 程序拦截 so

22、cket 操作,然后动态设置 TCP 参数的机制。它总共提供了 15 个挂载点,分别位于 TCP socket 实现的各个阶段,包括三次握手和四次挥手,可用于动态设置 TCP 参数,也可用于统计套接字信息。sock_ops BPF 程序会利用 socket 的一些信息(例如 IP 和 port)来决定 TCP 的最佳配置。例如,在 TCP 建立连接时,如果判断 client 和 server 处于同一个数据中心(网络质量非常好),那么就可以通过如下设置优化这个 TCP 连接:1、设置更合适的 buffer size:RTT 越小,所需的 buffer 越小;2、修改 SYN RTO 和 SYN

23、-ACK RTO,大大降低重传等待时间;3、如果通信双方都支持 ECN,就将 TCP 拥塞控制设置为 DCTCP(DataCenter TCP)。5、LSM LSM(Linux Security Modules)是一个框架,允许用户空间程序向 Linux 内核添加自定义的安全模块。这些模块可以实施 MAC(Mandatory Access Control)、RBAC(Role-Based Access Control)等各种策略。LSM 在 Linux 内核安全相关的关键路径上预置了一批 hook 点,从而实现了内核eBPF 技术介绍 和安全模块的解耦,使不同的安全模块可以自由地在内核中加载/

24、卸载,无需修改原有的内核代码就可以加入安全检查功能。在过去,使用 LSM 主要通过配置已有的安全模块(如 SELinux 和 AppArmor)或编写自己的内核模块;而在 Linux 引入 BPF LSM 机制后,一切都变得不同了:现在,开发人员可以通过 eBPF 编写自定义的安全策略,并将其动态加载到内核中的 LSM挂载点,而无需配置或编写内核模块。当 eBPF 与 LSM 结合使用时,可以通过在 eBPF 程序中访问 LSM 接口来增强内核安全性,并对系统进行更细粒度的访问控制。例如,在 eBPF 程序中使用 LSM 接口来限制进程对某些敏感文件或目录的访问权限。此外,还可以在 eBPF

25、程序中启用LSM Hook 以监视系统调用和网络连接,并执行适当的操作以保护系统免受恶意软件攻击。结合使用 eBPF 和 LSM 还可以使系统更加安全和高效,并提供更多的可定制化选项。2.2 eBPFeBPF 常见的开发框架常见的开发框架 2.2.1 BCCBCC BCC 是如今最热门也是对新手最友好的开源平台,它用 python 封装了编译、加载和读取数据的过程,提供了很多非常好用的 API;和 libbpf 需要提前把 bpf 程序编译成 bpf.o 不同,BCC 是在运行时才调用 LLVM 进行编译的,所以要求用户环境上有 LLVM 和 kernel-devel。eBPF 技术介绍 2.

26、2.2 bpfTracebpfTrace bpfTrace 是基于 BPF 和 BCC 构建的开源跟踪程序。与 BCC 一样,bpfTrace 附带了许多性能工具和支持文档。但是,它还提供了高级编程语言,使您可以创建功能强大的单行代码和简短的工具。它自定义了自己的 DSL 作为前端,底层也是调用LLVM 的。事实上,它依赖于 BCC 提供的 libbcc.so 文件。2.2.3 libbpflibbpf libbpf 是指 linux 内核代码库中的 tools/lib/bpf,这是内核提供给外部开发者的 C库,用于创建 BPF 用户态的程序。目标是为了使得 bpf 程序像其它程序一样,编译好

27、后,可以放在任何一台机器,任何一个 kernel 版本上运行(当然要对内核版本有一些要求)。libbpf 解决了如下问题:1 1、头文件的问题、头文件的问题:依赖内核态特性支持 BTF,将内核的数据结构类型构建在内核中;用户态的程序可以导出 BTF 成一个单独的.h 头文件,bpf 程序只要依赖这个头文件就行,不需要再安装内核头文件(vmlinux.h)的包。2 2、兼容性问题、兼容性问题:使用clang-11 的针对 eBPF 后端专门的特性:preserve_access_index,支持记录数据结构 field 相对位置信息,可实现 relocation,从而解决了由于数据结构在不同内核

28、版本间的变化导致的兼容性问题。3 3、性能提升、性能提升:内核中 bpf 模块做了一些增强,bpf Verifier 支持直接字段访问,不需要 call bpf 函数的方式来访问结构体字段,有效提升了 eBPF 程序的性能。eBPF 技术介绍 2.2.4 libbpflibbpf-bootstrapbootstrap libbpf-bootstrap 是一个项目,基于 libbpf 开发的框架,提供了一些样例程序和模板,帮助开发者理解如何使用 libbpf 创建、加载、管理 eBPF 程序,并与这些程序进行交互;提供了集成到构建系统的模板,可以方便地编译和链接 eBPF 程序。2.2.5 ci

29、liumcilium-ebpfebpf cilium-ebpf 是一个基于 Go 语言的 BPF 库,其将 eBPF 系统调用抽象为 Go 接口。相比于其他开发框架,Cilium/eBPF 具有如下特点:1、用户态程序可使用纯 go 语言开发,无需引入 cgo,减少环境依赖 2、编译相对简单,只需执行简单命令即可完成编译,无需编写复杂 Makefile 3、支持 CO-RE,编译出的二进制可执行文件可在同架构任何环境运行 4、依托于 Cilium 在 eBPF 研究上的持续投入,Cilium/eBPF 社区较活跃,受关注度较高 2.2.6 CoolbpfCoolbpf Coolbpf 项目,以

30、 CORE(Compile Once-Run Everywhere)为基础实现,保留了资源占用低、可移植性强等优点,还融合了 BCC 动态编译的特性,适合在生产环境批量部署应用。Coolbpf 分为三大模块:开发&测试、编译组件和基础模块。开发&测试组件提供了多语言开发和自动化测试功能;编译组件提供了多种编译方式,灵活性高;基础模块提供了 BTF、低版本内核 eBPF 驱动、通用库等多个功能。eBPF 技术介绍 图 2-2-1 Coolbpf 功能架构图 1 1、开发测试模块、开发测试模块 目前 Coolbpf 项目支持 python、rust、go 及 c 语言,覆盖了当前主流的高级开发语言

31、。此外 Coolbpf 还支持 lwcb 脚本语言,便于开发者快速开发 eBPF 功能脚本。Generic library:基础通用库,提供了 eBPF 相关的 API,如 eBPF map、eBPF program等;Language bindings:基础通用库的 bindings,使得多种编程语言能够直接使用基础通用库;Language library:由于 bindings 缺少高级语言的面向对象编程思想,为此在language bindings 的基础上做进一步的封装。eBPF 技术介绍 图 2-2-2 Coolbpf 开发模块层级结构图 2 2、编译模块、编译模块 本地编译服务,基

32、础库封装,客户使用本地容器镜像编译程序,调用封装的通用函数库简化程序编写和数据处理;本地编译服务,不需要推送 bpf.c 到远程,一些常用的库和工具,已经包含在提供的镜像里面,省去了构建环境的繁杂。远程编译服务,接收 bpf.c,生成 bpf.so 或 bpf.o,提供给高级语言进行加载,用户只专注自己的功能开发,不用关心底层库安装、环境搭建;远程编译服务,目前用户开发代码时只需要 pip install Coolbpf,程序就会自动到编译服务器进行编译。脚本语言编译主要功能是编译 lwcb 脚本,生成 eBPF 字节码。eBPF 技术介绍 图 2-2-3 Coolbpf 编译模块逻辑图 3

33、3、基础模块、基础模块 基础模块提供了关键组件。Coolbpf为了保证eBPF程序能够运行在低版本内核,提供了 Coolbpf 库和 eBPF 驱动。其中 Coolbpf 库用于发起 eBPF 程序运行时的系统调用或向 eBPF 驱动发起的 ioctl 请求。eBPF 驱动则根据 ioctl 请求的具体信息执行相应的动作,如创建 map,prog 的安全检查、JIT 等。图 2-2-4 Coolbpf 基础模块结构图 eBPF 的应用场景与实践 eBPFeBPF 的应用场景与实践的应用场景与实践 eBPF 具有高性能、高扩展、安全性等优势,目前已经在网络、安全、可观测性等领域广泛应用,并且随着

34、云计算和容器化技术的不断发展,eBPF 将会在更多的应用场景中得到广泛应用。3.1 基于基于 eBPFeBPF 的系统诊断的系统诊断 3.1.1 系统诊断面临挑战系统诊断面临挑战 传统系统诊断在网络、IO、内存和调度等方面存在局限性 网络网络 网络诊断中网络抖动是最疑难的问题。网络抖动是指在网络传输过程中,因为各种原因导致数据包的传输延迟增加的现象。网络抖动可能会导致网络连接不稳定,影响网络应用程序的性能和用户体验。一般情况下,网络抖动问题会对客户的业务产生很大的影响。下面是一些比较典型的案例:1、网络连接不稳定:网络抖动会导致网络连接的不稳定性,使得客户在使用网络应用程序时经常出现连接断开、

35、页面加载缓慢等问题。2、影响在线业务:对于在线业务来说,如在线游戏、视频会议、在线购物等,网络抖动会导致数据传输的延迟增加,使得用户无法流畅地进行交互或观看,影响用户体验,甚至导致交易失败。3、影响远程办公:在远程办公的情况下,网络抖动会导致视频会议、文件传输eBPF 的应用场景与实践 等协作工具的不稳定性,影响远程团队的工作效率和沟通效果。4、影响云服务:对于使用云服务的客户来说,网络抖动会导致云服务的不稳定性,使得客户无法正常访问或使用云服务提供的功能。5、业务中断:在某些情况下,网络抖动可能会导致网络连接断开,使得客户无法访问网络或者无法与服务器建立稳定连接,导致业务中断,造成损失。传统

36、的定位网络抖动问题主要通过一下几类工具。1、网络数据包分析工具:如 Wireshark、tcpdump 等,这些工具可以捕获和分析网络数据包,通过分析数据包的延迟、丢包情况,定位网络抖动问题所在。2、网络故障排查工具:如 Ping、Traceroute 等,这些工具可以用于排查网络故障,如检测网络连接的连通性、确定网络路径和跳点等,帮助确定网络抖动问题的发生位置。3、网络设备监控工具:如 SNMP(Simple Network Management Protocol)管理工具,可以实时监控网络设备的状态和性能,包括路由器、交换机等,有助于发现设备故障引起的网络抖动问题。网络链路是非常复杂且漫长

37、的,一个报文从发送端到达接收端,要穿越各种网络组件,比如容器、ECS、OS 内核、物理机、VPC 网络、物理网络等。上面那些工具很难达到细粒度的网络抖动问题。IOIO IO 问题也是常见的问题之一,比如一个进程可能会导致磁盘 I/O 负载过高,直eBPF 的应用场景与实践 接影响整个系统的 I/O 性能。在定位这类问题时,有两个关键点需要考虑:1、确定哪个进程贡献了大量的 I/O:需要找出是哪个进程导致了 I/O 负载过高的情况。2、确定 I/O 最终是由哪个磁盘消耗的,或者进程在访问哪个文件:如果系统统计显示某个进程产生了大量的 I/O,那么我们希望能够了解这些 I/O 最终是由哪个磁盘处理

38、的,或者进程在访问哪个文件。如果这个进程是来自某个容器,我们也希望能够获取到文件访问信息以及该进程所在的容器。这些信息有助于我们更准确地定位问题,并找出导致 I/O 问题的根本原因。传统的定位手段主要包括以下几种:1、基于内核 diskstats 衍生的工具,如 iostat、tsar-io、vmstat-d,这些工具主要从整个磁盘的角度统计 I/O 信息,例如统计整个磁盘的 IOPS(每秒 I/O 操作数)和 BPS(每秒字节数),但无法准确统计单个进程贡献的 IOPS 和 BPS。2、基于内核 proc/$pid/io 衍生的工具,如 pidstat-d,这些工具可以统计进程总体的 I/O

39、 情况,但无法追溯具体的 I/O 是归属于哪个磁盘或哪个文件。3、基于 taskstat 衍生的工具,如 iotop,这些工具可以统计进程总体的 I/O 情况以及贡献的 IOWait 时间,但也无法追溯具体的 I/O 是归属于哪个磁盘或哪个文件。以上工具虽然在一定程度上能够提供 I/O 性能的信息,但无法提供进一步的细粒度定位,无法准确追踪 I/O 归属的磁盘或文件。内存内存 eBPF 的应用场景与实践 内存子系统常见的问题是内存泄漏。当出现内存泄漏时,程序会占用大量系统内存,甚至导致系统内存耗尽,对业务的正常运行造成影响。内存泄漏可能有多种潜在原因,例如在程序执行过程中忘记释放不再需要的内存

40、。此外,如果应用程序的内存使用量过大,系统性能可能因为页面交换(swapping)而显著下降,甚至可能导致系统强制终止应用程序(如 Linux 的 OOM killer)。调试内存泄漏问题是一项复杂而具有挑战性的任务。这涉及详细检查应用程序的配置、内存分配和释放情况,通常需要专门的工具来辅助诊断。1、有一些工具可以在应用程序启动时将 malloc()函数调用与特定的检测工具关联起来,如 Valgrind memcheck。这类工具可以模拟 CPU 来检查所有内存访问,但可能会导致应用程序运行速度大幅降低。2、另一个选择是使用堆分析器,如 libtcmalloc。相比之下,它的性能较高,但仍可能

41、导致应用程序运行速度下降五倍以上。3、此外,还有一些工具,如 gdb,可以获取应用程序的核心转储,并进行后处理以分析内存使用情况。然而,这些工具通常需要在暂停应用程序时获取核心转储,或在应用程序终止后才能调用 free()函数。调度调度 在日常业务运行中,经常会遇到各种干扰,导致抖动和影响客户体验。其中一个常见的干扰源是中断抢占。当中断抢占时间过长时,可能会导致业务进程调度不及时,数据收发延迟等问题。这种干扰已经存在于 Linux 内核中很长时间了,因此 Linux内核和业界已经提供了多种相关的中断抢占检测手段。在 Linux 系统中,可以使用以eBPF 的应用场景与实践 下工具来定位抖动问题

42、:1、sysstat:sysstat 是一个系统性能监测工具集,其中包含了 sar、mpstat、pidstat 等工具。可以使用 sar 命令来查看系统的 CPU 使用率、内存使用率、I/O 情况等,以判断是否存在系统抖动问题。然而,该工具输出的指标较多,对于非专业用户来说可能需要一定的专业知识进行分析,并且难以准确定位根本原因。2、top:top 命令用于实时监测系统的 CPU 使用率、内存使用率、进程状态等,并按照 CPU 或内存使用率进行排序。通过查看 top 命令的输出,可以找出占用 CPU或内存较高的进程,以判断是否存在抖动问题。然而,top 命令只提供了进程级别的信息,对于复杂的

43、抖动问题可能无法提供全面的分析。3、Perf:Perf 是 Linux 内核提供的性能分析工具,可以用于监测系统调度情况,包括调度延迟和抖动。通过 perf sched 命令可以收集和分析调度相关的事件和数据。然而,该工具输出的调度信息较多,需要进行大量的、长时间的分析,仍然可能难以定位到根本原因。4、Latencytop:Latencytop 是一个基于 Linux 内核的工具,用于检测系统中的延迟问题。它可以提供实时的进程级别的延迟信息,包括调度延迟,有助于定位调度抖动问题。然而,对于非专业用户来说,解读和理解 Latencytop 输出的详细延迟信息和统计数据可能会有一定的难度。可以看出

44、,传统的工具在定位抖动问题时仍然存在短板,例如输出过多的数据难以分析,甚至即使进行了分析,仍难以准确定位根本原因。eBPF 的应用场景与实践 3.1.2 基于基于 eBPFeBPF 的系统诊断方案的系统诊断方案 针对传统系统诊断工具在网络、IO、内存和调度领域的限制,基于 eBPF 的系统诊断方案应运而生,为系统在网络、IO、内存和调度等方面的诊断提供了更强大的能力。网络网络 网络抖动问题定位周期长,定位难度大(跨很多组件),业务影响严重的特点,在这个背景下,基于 eBPF 开发的抖动诊断工具:PingTrace,可以快速定位网络中哪个位置出现了问题,提高解决问题的速度和效率。PingTrac

45、e 是一个基于 eBPF 实现的网络延迟探测定界工具,该工具实现了一个基于 ICMP 回显(ICMP_ECHO 和ICMP_ECHOREPLY)协议的网络延迟探测协议,通过发送和解析探测报文来定位报文在不同传输阶段的延迟信息。图 3-1-1 PingTrace 原理图 上图展示了 PingTrace 的基本原理。其大致流程如下:1)基于 ICMP 回显协议定义了 PingTrace 报文的格式。2)在报文的传输路径上,使用 eBPF 部署检测点。每eBPF 的应用场景与实践 经过一个检测点,报文中会添加该检测点的时间戳信息。3)当发送端收到接收端的回包后,可以获取所有时间戳数据进行分析,以确定

46、存在延迟的位置。PingTrace 已经开源到 sysak,可以通过 sysak pingtrace 来使用 PingTrace 功能。PingTrace 工具使用方法如下:通过 Pingtrace 能够达到网络抖动问题分钟级定界。IOIO 基于 eBPF 的 iofsstat 工具可以从进程的角度统计 IO 信息和文件读写信息,这有助于确定问题的根源,并采取下一步的措施,例如停止进程或容器,检查逻辑是否合eBPF 的应用场景与实践 理,特别是对于大量写入某个文件的情况。下面是 iofsstat 的大致工作原理图。图 3-1-2 iofsstat 工作原理图 从 iofsstat 的工作原理图

47、可以看出,该工具主要用于统计某个进程对某个文件的IO 贡献。它以进程角度和磁盘角度为基础来呈现用户的指标。磁盘角度的统计是为了提供对整个磁盘的综合了解,而进程角度的统计则更具有细粒度,能够显示在某个时刻各个进程的贡献情况。值得注意的是,进程角度的统计和磁盘角度的统计并不一定完全一致。因为统计的原理不同,两者之间可能存在差异。在分析时,我们更关注两个角度之间的关联性。例如,在某个时刻磁盘统计显示 IO 负载较高,此时可以查看对应时刻各个进程的贡献程度。通过 iofsstat 可以更准确地了解进程与文件的 IO 关系,从而有针对性地解决问题。下面是 iofsstat 工具的指标解释:进程角度:co

48、mm:进程名 pid:进程 id cnt_rd:读文件次数 bw_rd:读文件带宽 eBPF 的应用场景与实践 cnt_wr:写文件次数 bw_wr:写文件带宽 inode:文件 inode 编号 filepath:文件路径,当在一次采集周期内由于进程访问文件很快结束情况下,获取不到文件名则为-如进程来自某个容器,在文件名后缀会显示containterId:xxxxxx 磁盘角度:xxx-stat:r_iops:磁盘总的读 iops xxx-stat:w_iops:磁盘总的写 iops xxx-stat:r_bps:磁盘总的读 bps xxx-stat:w_bps:磁盘总的写 bps xxx-

49、stat:wait:磁盘平均 io 延迟 xxx-stat:r_wait:磁盘平均读 io 延迟 xxx-stat:w_wait:磁盘平均写 io 延迟 xxx-stat:util%:磁盘 io utils 内存内存 Coolbpf 提供的基于 eBPF memleak 工具用于检测内存泄漏问题。memleak 工具eBPF 的应用场景与实践 的原理如下:1、memleak 使用 eBPF 来跟踪内核分配的内存块。它通过在内核中插入 eBPF 程序来监测内存分配和释放的事件。2、当内核分配内存时,memleak 会在 eBPF 程序中记录下内存块的地址和大小,并将其保存在一个哈希表中。3、当内

50、核释放内存时,memleak 会检查该内存块是否存在于哈希表中。如果不存在,则将其标记为泄漏。4、memleak 还会记录泄漏内存块的调用栈信息,以帮助定位泄漏的源代码位置。5、memleak 会周期性地打印出已泄漏的内存块的信息,包括内存地址、大小和泄漏的调用栈。通过使用 memleak 工具,开发人员可以监测和定位内存泄漏问题,从而改善系统的内存管理和性能。它提供了一种非侵入式的内存泄漏检测方法,不需要修改应用程序的源代码,而且对性能影响较小。调度调度 针对调度问题,经过分析将其分为三类具体场景:1、关中断:包括硬中断和软中断执行时间过长的情况;2、进程唤醒后长时间无法调度;3、CPU 任

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 研究报告 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服