什么?Coolbpf 不仅可以远程编译,还可以发现网络抖动! | 龙蜥技术

简介: BPF 可移植性被定义为成功编写并通过内核验证的一个 BPF 程序,能运行在不同内核版本。

近日,在 2022 云栖大会龙蜥峰会 eBPF & Linux 稳定性专场上,来自 eBPF 技术探索 SIG Maintainer 的毛文安分享了《Coolbpf 的应用实践》技术演讲,以下为本次演讲内容:

一、为什么要支持可移植?

幻灯片4.PNG

随着 BPF 技术的发展,开发一个 BPF 程序变得越来越简单,尽管 BPF 提升了便利性,但 BPF 也一直在追求另一个方面:可移植性。BPF 可移植性被定义为成功编写并通过内核验证的一个 BPF 程序,能运行在不同内核版本。


进行 BPF 的移植有两个挑战:

1. 不同内核版本数据的内存布局不同。

2. 内核类型和数据结构不断变化,结构体字段可能被移除或重命名。


BPF CO-RE(Compile Once - Run Everywhere)是实现可移植性的一个手段。


为了支持 CORE,提供了以下组件:

  • BTF:描述内核镜像,获取内核及BPF程序类型和代码的关键信息
  • Clang 释放 bpf 程序重定位信息到.btf 段
  • Libbpf CO-RE 根据.btf 段重定位 bpf 程序


需要进行重定位的信息主要有三类:

  1. 结构体相关重定位,这部分和BTF息息相关。Clang通过__builtin_preserve_access_index()记录成员偏移量。
  2. map fd 、全局变量(data、bss、rodata)、extern 的变量重定位,主要依赖于 ELF 的重定位机制,来更新 eBPF 指令的 imm 字段。
  3. 子函数重定位,是为了将 eBPF 程序调用的子函数同主函数放在一起,便于一起加载到内核。

使用 libbpf 进行 BPF CORE 的开发步骤如下:

  1. 生成带所有内核类型的头文件 vmlinux.h,通过 bpftool 生成。
  2. 使用 Clang(版本10 或更新版本)将 BPF 程序的源代码编译为 .o 对象文件;
  3. 从编译好的 BPF 对象文件中生成 BPF skeleton 头文件 bpftool gen 命令生成;
  4. 在用户空间代码中包含生成的 BPF skeleton 头文件;
  5. 编译用户空间代码,则嵌入 BPF 对象代码无需发布单独的文件。


大致有如下的函数调用:

  • <name>__open() :创建并打开 BPF 应用,之后可以设置 skel->rodata 变量。
  • <name>__load() :初始化,加载和校验 BPF 应用部分。
  • <name>__attach() :附加所有可以自动附加的 BPF 程序。有事件和网络运行报文到达时,会触发运行 bpf 程序。
  • <name>__destroy():分离所有的 BPF 程序并使用其使用的所有资源。

幻灯片6.PNG

eBPF 程序的主要开发方式有三种,它们各有优缺点,见下:

1、内核自带示例代码:基于内核 samples/bpf 示例代码,无 CORE。该方式没有任何基于第三方的开源项目,资源占用量低。但缺点是需要自己完全重新搭建工程,效率较低,且版本兼容性较差。

2、BPF CORE:基于 libbpf 自己编写的 bpf_core_read 代码,开发机生成对应目标机的二进制程序。该方式不依赖在环境中部署 Clang/LLVM ,资源占用少。但是需要搭建编译工程,部分代码相对固定,无法动态配置。

3、BCC:基于应用最广的开源项目,开发效率较高。但是每一次运行都要执行  Clang/LLVM 编译,存在内存、CPU 等资源的争抢;目标环境依赖对应内核头文件。

二、Coolbpf 的功能和架构

幻灯片8.PNG

Coolbpf 提供了远程编译(云编译)。其中远程编译指运行程序的目标机器与编译程序不在同一个机器上,能够解决资源占用问题;提供了本地编译和基础库封装,方便用户调用基础库进行编写;提供了低版本内核的支持;提供了 BTF 的自动生成和发布,用户无需手动适配,下载即可直接使用;提供了自动化测试以及支持 Python/Go/Rust 等高级语言进行应用开发。


Coolbpf 天然支持 BPF 的 CORE 能力,它解决了编译和资源消耗的问题,同时,前面介绍的复杂的 libbpf 开发步骤完全被简化了。用户只需要专注自己的功能开发,不用关注环境搭建和冗余代码开发。

幻灯片9.PNG

Coolbpf 提供了标准化的 bpf 编译服务。首先将 bpf.c 提交到远程编译服务器时,服务器会根据的内核版本针对不同的语言返回点 bpf.so 或 bpf.o 为高级的应用程序提供服务。因此在你的高级语言代码中,只需加载 bpf.so 即可运行程序,无需再手动触发 Libbpf 的 open()、load()、attach()等函数,而是由高级语言程序的 init()自动完成,这样用户可以快速搭建和部署工程,只需专注于数据输出之后的处理。

幻灯片10.PNG

Coolbpf 还支持在没有 eBPF 特性的低内核版本上,通过我们提供的 eBPF 驱动,帮助它安全的在低版本上运行。我们将高版本上 eBPF verifier 校验部分实现在一个驱动里,它会进行各种安全校验,保证 eBPF 对比于内核模块的安全性。另外,我们把原来基于 libbpf 的调用都转换为 IOCTL 的系统调用。


之前支持的 helper 函数、创建 map 、加载 program 都会转化成低版本上的 kprobe  或 tracepoint 的实现,另外还支持 perf event 和 jit。这样就使得同一个用户程序,加载这样一个驱动,就能不修改 eBPF 程序代码而安全的运行在低版本内核上。

三、Coolbpf 的网络应用实践

幻灯片12.PNG

Raptor 是基于 Coolbpf 的系统可观测工具,能够运行在低版本内核如 alios、CentOS 3.10 等。它可以作为一个 SDK,提供给第三方使用,进行数据采集。

幻灯片14.PNG

在这个网络应用观测中,通过监控系统调用中的数据交互、请求和回复等信息,来确定交互的数据内容和五元组等信息,通过 map 的交互方式发送给用户态,做到了无侵入的方式做观测,最终呈现比如流量统计、请求时延等观测结果。

幻灯片15.PNG

我们来看一个具体的问题,了解 Coolbpf 是如何发现收包阶段的网络抖动问题。我们知道网络收包分为两个阶段:

阶段 1:OS 通过软中断将数据包送到应用的收包队列并通知进程,完成协议栈的收包工作。

阶段 2:应用得到通知后从收包队列取数据。


我们在 Coolbpf 里写一段 BPF 程序,只需监控两个 tracepoint:tcp_probe,tcp_rcv_space_adjust 就能查询到阶段 2 的延迟问题。

幻灯片16.PNG

在这个案例中,某业务应用收包慢,发现内核侧已经收到了 tcp 包,但是应用侧将近 1s 后才收到。

观测方法:部署 eBPF agent,发现阶段 2“收包延迟时间”将近 1 秒。


确定原因:每次发生延迟时间都在某时刻的大致 42 秒处,怀疑跟业务某定时任务相关造成应用自身延时,最终排查到业务有某个任务会定时收集 jvm 的参数,对该业务有 stop 的操作。


解决方法:停掉该任务后,消除了抖动问题。


相关链接:

eBPF技术探索 SIG 地址:

https://openanolis.cn/sig/ebpfresearch

关于龙蜥峰会 eBPF & Linux 稳定性专场课件获取方式:

【PPT 课件获取】:关注微信公众号(OpenAnolis),回复“龙蜥课件” 即可获取。有任何疑问请随时咨询龙蜥助手—小龙(微信:openanolis_assis)。

【视频回放】:视频回放可前往龙蜥官网https://openanolis.cn/video 查看。

—— 完 ——

加入龙蜥社群

加入微信群:添加社区助理-龙蜥社区小龙(微信:openanolis_assis),备注【龙蜥】与你同在;加入钉钉群:扫描下方钉钉群二维码。

相关文章
|
1月前
|
存储 监控 安全
单位网络监控软件:Java 技术驱动的高效网络监管体系构建
在数字化办公时代,构建基于Java技术的单位网络监控软件至关重要。该软件能精准监管单位网络活动,保障信息安全,提升工作效率。通过网络流量监测、访问控制及连接状态监控等模块,实现高效网络监管,确保网络稳定、安全、高效运行。
67 11
|
3天前
|
边缘计算 容灾 网络性能优化
算力流动的基石:边缘网络产品技术升级与实践探索
本文介绍了边缘网络产品技术的升级与实践探索,由阿里云专家分享。内容涵盖三大方面:1) 云编一体的混合组网方案,通过边缘节点实现广泛覆盖和高效连接;2) 基于边缘基础设施特点构建一网多态的边缘网络平台,提供多种业务形态的统一技术支持;3) 以软硬一体的边缘网关技术实现多类型业务网络平面统一,确保不同网络间的互联互通。边缘网络已实现全球覆盖、差异化连接及云边互联,支持即开即用和云网一体,满足各行业需求。
|
21天前
|
负载均衡 网络协议 网络性能优化
动态IP代理技术详解及网络性能优化
动态IP代理技术通过灵活更换IP地址,广泛应用于数据采集、网络安全测试等领域。本文详细解析其工作原理,涵盖HTTP、SOCKS代理及代理池的实现方法,并提供代码示例。同时探讨配置动态代理IP后如何通过智能调度、负载均衡、优化协议选择等方式提升网络性能,确保高效稳定的网络访问。
138 2
|
27天前
|
机器学习/深度学习 安全 网络安全
网络安全词云图与技术浅谈
### 网络安全词云图与技术浅谈 本文介绍了通过词云图展示网络安全关键术语的方法,并探讨了构建现代网络安全体系的关键要素。词云图利用字体大小和颜色突出高频词汇,如恶意软件、防火墙、入侵检测系统等。文中提供了生成词云图的Python代码示例,包括安装依赖库和调整参数。此外,文章详细讨论了恶意软件防护、加密技术、身份验证、DDoS防御、社会工程学防范及威胁情报等核心技术,强调了多层次、多维度的安全策略的重要性。
66 11
网络安全词云图与技术浅谈
|
1月前
|
存储 安全 网络安全
云计算与网络安全:技术融合的双刃剑
在数字化浪潮中,云计算如同一股不可阻挡的力量,推动着企业和个人用户步入一个高效、便捷的新时代。然而,随之而来的网络安全问题也如影随形,成为制约云计算发展的阿喀琉斯之踵。本文将探讨云计算服务中的网络安全挑战,揭示信息保护的重要性,并提供实用的安全策略,旨在为读者呈现一场技术与安全的较量,同时指出如何在享受云服务带来的便利的同时,确保数据的安全和隐私。
36 6
|
1月前
|
存储 人工智能 安全
云计算与网络安全:技术融合与挑战
在数字化时代的浪潮中,云计算和网络安全已成为推动社会进步的两大关键技术。本文将探讨云计算服务的发展,网络安全的重要性,以及信息安全技术的演进。我们将通过实例分析,揭示云服务如何增强数据保护,网络安全措施如何应对新兴威胁,以及信息安全技术的创新如何为企业带来竞争优势。文章旨在为读者提供对云计算和网络安全领域的深入理解,并展示它们如何共同塑造我们的未来。
|
1月前
|
监控 安全 网络安全
云计算与网络安全:技术挑战与解决方案
随着云计算技术的飞速发展,其在各行各业的应用越来越广泛。然而,随之而来的网络安全问题也日益凸显。本文将从云服务、网络安全和信息安全等技术领域出发,探讨云计算面临的安全挑战及相应的解决方案。通过实例分析和代码示例,旨在帮助读者更好地理解云计算与网络安全的关系,提高网络安全防护意识。
|
1月前
|
存储 监控 安全
云计算与网络安全:云服务、网络安全、信息安全等技术领域的融合与挑战
本文将探讨云计算与网络安全之间的关系,以及它们在云服务、网络安全和信息安全等技术领域中的融合与挑战。我们将分析云计算的优势和风险,以及如何通过网络安全措施来保护数据和应用程序。我们还将讨论如何确保云服务的可用性和可靠性,以及如何处理网络攻击和数据泄露等问题。最后,我们将提供一些关于如何在云计算环境中实现网络安全的建议和最佳实践。
|
1月前
|
存储 安全 网络安全
云计算与网络安全:云服务、网络安全、信息安全等技术领域的融合与挑战
随着云计算技术的飞速发展,越来越多的企业和个人开始使用云服务。然而,云计算的广泛应用也带来了一系列网络安全问题。本文将从云服务、网络安全、信息安全等方面探讨云计算与网络安全的关系,分析当前面临的挑战,并提出相应的解决方案。
75 3
|
1月前
|
存储 安全 网络安全
云计算与网络安全:技术融合下的挑战与机遇
随着云计算技术的飞速发展,网络安全问题也日益凸显。本文将探讨云计算环境下的网络安全挑战,以及如何通过技术创新来应对这些挑战。我们将分析云服务的安全特性,讨论信息安全的最佳实践,并展望未来云计算与网络安全的发展趋势。