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

news2024/11/19 3:49:49

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

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

随着 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 程序并使用其使用的所有资源。

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

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

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

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

二、Coolbpf 的功能和架构

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

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

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

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

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

三、Coolbpf 的网络应用实践

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

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

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

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

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

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

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

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

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

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

相关链接:

eBPF技术探索 SIG 地址:https://openanolis.cn/sig/ebpfresearch

原文链接

本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/62933.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EL表达式 过滤器 监听器

这里写目录标题1 EL 表达式1.1 EL 表达式介绍1.2 EL 表达式快速入门1.3 EL 表达式获取数据1.4 EL 表达式注意事项1.5 EL表达式运算符1.6 EL 表达式使用细节1.7 EL 表达式隐式对象2 JSTL2.1 JSTL 介绍2.2 JSTL 核心标签库2.3 JSTL基本使用3 Filter3.1 过滤器介绍3.2 Filter 介绍…

很全很详细的GUI编程

为什么要学习&#xff1f; 写出自己想要的小工具。工作可能需要维护到swing界面。了解MVC架构&#xff0c;了解监听。 组件&#xff1a;窗口、弹窗、面板、文本框、列表框、按钮、图片、监听事件、鼠标、键盘事件、破解工具。 一、简介 GUI的核心技术&#xff1a;Swing AWT 因…

[附源码]计算机毕业设计基于springboot和vue的茶文化交流平台的设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

路由规则——MVC控制器

MVC的路由规则配置方式比较多,咱们用得最多的是两种: A、全局规则。就是我们熟悉的”{controller}/{action}“。 app.MapControllerRoute(name: "bug",pattern: "{controller}/{action}"); app.MapControllerRoute(name: "八阿哥",pattern: &…

定积分的概念及可积条件

微积分是高等数学的核心&#xff0c;包含微分和积分。前面几篇我们介绍了微分及其逆运算——不定积分&#xff08;严格来说&#xff0c;不定积分属于微分模块&#xff09;。传送门&#xff1a;微分与导数 不定积分今天开始&#xff0c;我们进入积分模块。还是老样子&#xff0…

怎么关闭Windows安全启动?

什么是安全启动&#xff1f; 安全启动&#xff08;英文名为Secure Boot&#xff09;&#xff0c;是装有UEFI固件的较新PC上的一项重要安全功能&#xff0c;它可以保护计算机的启动过程&#xff0c;防止在启动过程中加载未签名的UEFI驱动程序和引导加载程序&#xff0c;以及阻止…

软件测试经典面试题:如何进行支付功能的测试?

非现金支付时代&#xff0c;非现金支付已经成为了生活不可或缺的一部分&#xff0c;我们只需要一台手机便可走遍全国各地&#xff08;前提是支付宝&#xff0c;微信有钱<00>&#xff09;,那么作为测试人员&#xff0c;支付测试也是非常重要的一环&#xff0c;那么下面我就…

Netty03——进阶

目录1.粘包与半包1.1.粘包现象1.2.半包现象1.3.现象分析1.4 解决方案1.4.1.短链接1.4.2.固定长度1.4.3.固定分隔符1.4.4.预设长度2.协议设计与解析2.1.为什么需要协议&#xff1f;2.2.redis 协议举例2.3.http 协议举例2.4.自定义协议要素2.5.编解码器3.聊天室案例3.1.聊天室业务…

Locust学习记录2-locust用户类学习【HttpUser,wait_time,weight和fixed_count属性】

HttpUser 每个模拟用户定义的类&#xff0c;都必须继承HttpUser&#xff0c;目的时为每个用户提供一个client属性&#xff0c;该属性是一个实例HttpSession&#xff0c;可用于向我们要进行负载测试的目标系统发出HTTP请求 当测试开始时&#xff0c;locust将为它模拟的每个用户…

Java内存模型

TOC Java内存模型 Java内存模型&#xff08;Java Memory Model&#xff0c;JMM&#xff09; 是《Java虚拟机规范》中定义的一种用来屏蔽各种硬件和操作系统的内存访问差异&#xff0c;以实现让Java程序在各种平台下都能达到一致性的内存访问效果的一种内存访问模型。从JDK&…

不要再稀里糊涂的使用反射了,四万字带你搞定Java反射(JDK8)

文章目录前言Java反射体系概述类型信息&#xff08;Type&#xff09;GenericDeclarationAnnotatedType成员信息&#xff08;Member&#xff09;属性信息&#xff08;Field&#xff09;构造函数信息&#xff08;Constructor&#xff09;方法信息&#xff08;Method&#xff09;修…

毕业设计-基于机器视觉的指针式仪表智能识别

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

C++ 复制构造函数

在讲解 C 的复制构造函数之前这里先明确一个概念&#xff0c;C 的复制构造函数的意思并不是字面上的意思复制一个构造函数&#xff0c;而是有一种专门用于复制内容的构造函数被叫做复制构造函数。 复制构造函数对于 C 来说是非常重要的概念&#xff0c;所以我们必须掌握并牢记…

jsp设备信息查询系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 jsp设备信息查询系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&#xff0c;使用…

【算法笔记(六)】检索算法

算法笔记(六) 检索算法算法笔记(六)前言一、线性查找1.什么是线性查找2.需求规则3.人工图示演示4.代码实现二、二分查找1.什么是二分查找2.需求规则3.人工图示演示4.代码实现三.插值查找1.什么是插值查找2.需求规则3.人工图示演示4.代码实现四.斐波那契查找1.什么是斐波那契查找…

[附源码]计算机毕业设计基于springboot框架的资产管理系统设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

TCP三次握手四次挥手及常见问题解决方案

一、重要概念 位码即tcp标志位,有6种表示: SYN(synchronous建立连接) ACK(acknowledgement 表示响应、确认) PSH(push表示有DATA数据传输) FIN(finish关闭连接) RST(reset表示连接重置) URG(urgent紧急指针字段值有效) 二、三次握手四次挥手流程图 三、三次握手 第一次握手&am…

一段有关MPU配置代码的几个小疑问

当我们阅读一些STM32F7或STM32H7系列芯片例程&#xff0c;或者基于这两类芯片通过cubeMx进行配置并用到MPU功能时&#xff0c;往往会在代码里看到下面这段MPU配置。对这段代码可能有人有些疑问&#xff0c;这里重点一起聊聊其中的3个&#xff0c;供参考。第一个疑问&#xff0c…

【AI工程论文解读】04-通过Ease.ML/CI实现机器学习模型的持续集成(上)

作者&#xff1a;王磊 更多精彩分享&#xff0c;欢迎访问和关注&#xff1a;https://www.zhihu.com/people/wldandan 持续集成是一种软件开发实践&#xff0c;即团队开发成员经常集成他们的工作&#xff0c;通常每个成员每天至少集成一次&#xff0c;也就意味着每天可能会发生多…

机器人xacro设计+gazebo/rviz启动

机器人xacro设计gazebo/rviz启动项目需求方案机器人的本体设计机器人本体集成car_gazebo.xacroinertial惯性矩阵 head.xacro小车底盘base.xacro摄像头camera.xacro雷达laser.xacro机器joint关节控制器传感器sensor设计机器人joint关节控制器move.xacro摄像头传感器camera_senso…