擎创技术流 | 深入浅出运维可观测工具(二):eBPF应用中常见问题

news2024/11/15 11:12:12

上期跟大家聊了下eBPF的发展历史还有特性,点击这里↓↓↓擎创技术流 | 深入浅出运维可观测工具(一):聊聊eBPF的前世今生,一键回看上期精彩内容。

这期主要跟大家分享下eBPF在应用过程中可能出现的问题,希望能帮到遇到类似问题的朋友,话不多说,我们进入正题。

一、内核适应性,老版本的某些功能不可用

eBPF 最低要求版本为LInux 4.1,eBPF的最低内核版本要求是 Linux 4.1,这是在 2015 年发布的内核版本。在这个版本之前的内核不支持 eBPF。

1.对于Linux4.1版本之前的监控

擎创对于Linux 4.1.0 之前的版本采用BPF采集HTTP 1数据以及DNS解析请求,进行可观测统计。

2.对于Linux4.1版本之后的监控

为了保证eBPF程序在各个linux内核版本之间的可移植性,我们编写eBPF程序的时候采用了CORE技术,CORE技术目前只有在 Linux 4.9.0 之后才会支持。

如果用户内核版本低于4.9.0或者内核未开启CO-RE, 我们能够提供linux内核升级包。

BCC总结了kernel版本与eBPF功能的关系:https://github.com/iovisor/bcc/blob/master/docs/kernel-versions.md

二、权限安全要求

1.eBPF权限

需要具备root权限或CAP_SYS_ADMIN能力,这意味着只有能够加载内核模块的用户才能加载eBPF程序。

2.eBPF执行安全

在执行安全方面,eBPF 在加载之前会通过eBPF验证器对要执行的字节码文件进行校验,包括但不限于以下方面:

  • 程序不包含控制循环

  • 程序不会执行超过内核允许的最大指令数

  • 程序不包含任何无法到达的指令

  • 程序不会跳转到程序界限之外

三、uprobe 和 kprobe 差异

1.kprobe的优劣分析

优势:

  • 更简单实现和更易维护。

  • 不依赖于其他库的具体实现细节

劣势:

  • 用户程序可能会将单个请求分割成多个系统调用,重新组装这些请求会带来一些复杂性

  • 与TLS不兼容, 无法解包TLS

2.uprobe的优劣分析

优势:

  • 我们可以访问和捕获应用程序上下文,如堆栈跟踪

  • 我们可以构建uprobes以在解析完成后捕获数据,避免在跟踪器中重复工作

  • 可以比较容易捕获https 请求,对TLS兼容性较好

劣势:

(1)对于使用的底层库版本敏感。 无法在剥离了符号的二进制文件上运行

(2)需要为每个库实现不同的探针(每种编程语言可能都有自己的一组库)

(3)会导致额外的调用性能开销

四、性能消耗

虽然内核社区已经对 eBPF 做了很多的性能调优,跟踪用户态函数(特别是锁争用、内存分配之类的高频函数)还是有可能带来很大的性能开销。因此,我们在使用 uprobe,kprobe 时,应该尽量避免长时间跟踪高频函数。

我们以监控一个Golang 程序HTTP 1通信过程为例子,在分别开启uprobe和kprobe时候对该程序进行压力测试:

从结果可以看出,如果HTTP延迟大于1毫秒,引入的开销可以忽略不计,在大多数情况下只是噪音。这对于kprobes和uprobes都是类似的,尽管我们重新解析了所有数据,但kprobes的性能稍微好一些。请注意,开销有时是负值,这很可能只是测量中的噪音。在这里的关键要点是,如果您的HTTP处理程序正在进行任何实际的工作(大约1毫秒计算时间),引入的开销基本上可以忽略不计。

五、能否追踪所有用户态/内核态函数(调用的入参和返回值)

1.用户态

eBPF可以追踪指定函数调用入参和返回值。hook点可以为指定函数名称或者地址。 如果可执行文件的符号被优化,则需要使用一些逆向手段定位指定函数的地址。

2.内核态

我们可以使用bpftrace -l了解可以hook的钩子点。

bpftrace是通过读取(下方代码)获取kernel层所有的可跟踪点。

/sys/kernel/debug/tracing/available_filter_functions

六、是否有丢失事件的风险

1.kprobe和uprobe本身的事件触发并不会丢失

kprobe是一种内核探测机制,它允许用户在内核函数执行前或执行后插入代码。uprobe是一种对用户空间函数进行探测的机制,它允许用户在用户空间函数的入口或出口处插入代码。

eBPF通过将用户编写的处理逻辑加载到内核中,在事件发生时执行此逻辑,以实现用户级的观察和处理。由于eBPF的虚拟机技术提供了一种安全可隔离的方式来在内核中执行用户代码,因此kprobe和uprobe事件不会丢失。

2.bpf_perf_event会有丢失事件的风险

内核态的eBPF代码将收集到的事件写入 bpf_perf_event 环形缓冲区,用户态程序进行收集上报。当读写速度不匹配时,就会丢失事件:

  • 写速度过快:例如每个HTTP transaction都作为一个event写入缓冲区,这样比批量写的风险更高。
  • 读速度过慢:例如用户态代码没有在专门线程中读取缓冲区,或者系统负载过高。

3.bpf_map会有丢失事件的风险

eBPF map有大小限制,当map被写满的时,将无法写入新的数据

  • 丢失数据:由于map已满,新的写入操作将无法成功,导致数据丢失。这可能会影响到程序的正确性和完整性。
  • 性能下降:当map写满时,写入操作将被阻塞,导致系统的性能下降。这会影响到整体的系统响应时间和吞吐量。

写在文末

随着eBPF的不断发展和壮大,我们可以看到它在网络和系统领域的巨大潜力。eBPF已经被证明是一种强大且高效的工具,可以用于实现各种高级网络和系统功能。

在未来,我们有理由相信eBPF将继续发展,并被越来越多的开发者和组织使用。随着eBPF功能的不断扩展和完善,我们可以期待更多创新的网络应用和系统工具的出现,从而推动整个行业向前发展。

总之,eBPF的前世今生令人振奋,它不仅继承了BPF的优点,还拥有更强大和灵活的功能。我们期待看到eBPF为网络和系统带来更多的创新和改进,为我们的数字化世界带来更强大的支撑。

互动一下:

关于eBPF,你有什么想分享的?可以留言区探讨起来~


擎创科技,Gartner连续推荐的AIOps领域标杆供应商。公司专注于通过提升企业客户对运维数据的洞见能力,为运维降本增效,充分体现科技运维对业务运营的影响力。

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

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

相关文章

leetcode 122. 买卖股票的最佳时机 II

2023.7.29 把整体利润拆分成每天的利润&#xff0c;将股票值想象成一个折线图&#xff0c;将所有上升的值相加即可。 代码&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {int ans 0;for(int i1; i<prices.size(); i){if(prices[i]-…

神经网络简单介绍

人工神经网络(artififial neural network) 简称神经网络&#xff0c;它是一种模仿生物神经网络结构和功能的非线性数学模型。 神经网络通过输入层接受原始特征信息&#xff0c;再通过隐藏层进行特征信息的加工和提取&#xff0c;最后通过输出层输出结果。 根据需要神经网络可以…

树及其遍历

文章目录 树树定义专业术语树分类 二叉树分类存储连续存储&#xff08;完全二叉树&#xff09;链式存储一般树的存储森林的存储 线索二叉树哈夫曼树构造步骤 遍历先序遍历中序遍历后续遍历 链式二叉树遍历具体代码已知两种遍历序列求原始二叉树已知先序和中序求后序已知中序和后…

mtk桌面壁纸滚动

路径&#xff1a;packages\apps\Launcher3\src\com\android\launcher3 目前代码中是未打开的状态 packages\apps\Launcher3\src\com\android\launcher3\util\WallpaperOffsetInterpolator.java 涉及到的方法有&#xff1a;&#xff08;重要性从上往下&#xff09; updateOffs…

架构的分类

目录 一、 RUP41 架构 1.1 RUP41架构方法概述 1.2 RUP41架构总体 1.3 RUP41架构方法内容 1.3.1 逻辑视图 1.3.2 开发视图 1.3.3 物理视图 1.3.4 处理视图 1.3.5 场景视图 ​二、 TOGAF9 架构 2.1 TOGAF9 架构概述 2.2 TOGAF9 架构分类 2.2.1 业务架构 2.2.2 数据架…

Vue2 第四节 计算属性,监视属性

1.计算属性 2.监视属性 3.计算属性与监视属性之间的关系 一.计算属性 定义&#xff1a;要用的属性不存在&#xff0c;要通过已有属性计算得来原理&#xff1a;底层借助了Object.defineproperty方法提供的getter和setterget函数什么时候会执行&#xff1a;初次读取的时候会执…

银河麒麟安装solr及配置文件修改

下载并解压 将从官网下载的solr.tar.gz解压到目标文件夹 解压命令&#xff1a;tar -zxvf solr-xxx.tar.gz 修改配置文件 进入目录&#xff1a; /home/solr/solr-8.5.1/bin/init.d 修改solr文件里面部分配置 修改solr服务路径 SOLR_INSTALL_DIR"/opt/solr" 改为…

app稳定性测试-iOS篇

稳定性测试&#xff1a;测试应用程序在长时间运行过程中是否存在内存泄漏、崩溃等问题&#xff0c;以确保应用程序具有较高的稳定性和可靠性。 对于安卓端&#xff0c;官方提供了很好的稳定性测试工具&#xff1a;monkey。 相比较而言&#xff0c;iOS则没有&#xff0c;而且当前…

#systemverilog# 说说Systemverilog中《automatic》那些事儿(关于for循环内置变量研究)

#systemverilog# 说说Systemverilog中《static》那些事儿(理论篇1) 上面的截图,是来自于前面的文章,当时留下的疑问,今天和大家是实践一下小细节问题。 一 for 内置声明变量修饰 1.1 static 修饰

第八章浮点单元(Cortex-M7 Processor)

目录 浮点单元 8.1关于FPU 8.2FPU功能描述 8.2.1操作方式 8.2.2符合IEEE 754标准 8.2.3异常 8.3FPU编程器模型 浮点单元 介绍FPU (Floating Point Unit)。 它包含以下部分: 关于FPU的信息见8-2。FPU功能描述见8-3。FPU程序员模型在第8-5页。 8.1关于FPU Cortex-M7处…

基于RK3588+FPGA+AI算法定制的智慧交通与智能安防解决方案

随着物联网、大数据、人工智能等技术的快速发展&#xff0c;边缘计算已成为当前信息技术领域的一个热门话题。在物联网领域&#xff0c;边缘计算被广泛应用于智慧交通、智能安防、工业等多个领域。因此&#xff0c;基于边缘计算技术的工业主板设计方案也受到越来越多人的关注。…

【Kaggle】Kaggle数据集如何使用命令语句下载?

一、Kaggle数据集如何下载 1.1 问题的起因 最近看到了 Google 组织的 Kaggle 比赛&#xff0c;想自己试一下&#xff0c;但是数据集太大了&#xff0c;将近有370G的数据。直接下载的话&#xff0c;网速太慢&#xff0c;可能要下载3-4天&#xff0c;所以萌生了用命令语句下载的…

LeetCode刷题笔记-287题寻找重复数

LeetCode 287 寻找重复数 难度&#xff1a;中等 题目&#xff1a; 给定一个包含 n 1 个整数的数组 nums &#xff0c;其数字都在 [1, n] 范围内&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 &#xff0c;返回…

fpga开发--蜂鸣器发出连续不同的音调

描述 使用fpga蜂鸣器连续发出do&#xff0c;re&#xff0c;mi&#xff0c;fa&#xff0c;so&#xff0c;la&#xff0c;xi七个不同的音调&#xff0c;每个音调的持续时间为0.5s。 思路 采用状态机实现音调的转化&#xff0c;当do状态持续了0.5s之后转移到re状态&#xff0c;…

c语言位段知识详解

本篇文章带来位段相关知识详细讲解&#xff01; 如果您觉得文章不错&#xff0c;期待你的一键三连哦&#xff0c;你的鼓励是我创作的动力之源&#xff0c;让我们一起加油&#xff0c;一起奔跑&#xff0c;让我们顶峰相见&#xff01;&#xff01;&#xff01; 目录 一.什么是…

【SpringCloud Alibaba】(五)服务雪崩与容错方案

在前面的文章中&#xff0c;我们实现了用户微服务、商品微服务和订单微服务之间的远程调用&#xff0c;并且实现了服务调用的负载均衡。 但是&#xff0c;现在系统中存在着一个很明显的问题&#xff1a;那就是如果系统的并发量上来后&#xff0c;系统并没有容错的能力&#xf…

Onetable:统一的表格式元数据表示

概括 Onehouse 客户现在可以将他们的 Hudi 表查询为 Apache Iceberg 和/或 Delta Lake 表&#xff0c;享受从云上查询引擎到顶级开源项目的原生性能优化。 在数据平台需求层次结构的基础上&#xff0c;存在摄取、存储、管理和转换数据的基本需求。 Onehouse 提供这种基础数据…

C++库封装JNI接口——实现java调用c++

1. JNI原理概述 通常为了更加灵活高效地实现计算逻辑&#xff0c;我们一般使用C/C实现&#xff0c;编译为动态库&#xff0c;并为其设置C接口和C接口。用C实现的一个库其实是一个或多个类的简单编译链接产物。然后暴露其实现类构造方法和纯虚接口类。这样就可以通过多态调用到…

获取各省人口排名数据

目录 一、目标网址 二、网址分析 2.1、获取并解析网页内容 2.2 两种获取方法 三、获取目标数据 四、代码附件 一、目标网址 目标网址&#xff1a;中国人口排名 省份 1.1 网址截图 二、网址分析 2.1、获取并解析网页内容 我们需要使用requests库获取网页&#xff0c;使用…

三个常用查询:根据用户名 / token查询用户信息+链表分页条件查询

目录 1.根据用户名或者token查询用户信息 会员信息实体类 统一状态Result类 controller层 service层及实现类 dao层 测试&#xff1a; 2.链表分页条件查询 会员等级实体类 封装条件类PageVo controller层 service层及实现类 dao层 Mapper.xml层 测试 vue前端参考 1.根据用户名…