ebpf中的percpu map的注意事项与剖析

news2024/11/24 11:49:45

1 背景

    故事还要从一次翻车现场说起。

    为了统计各个CPU上的系统调用数据按照cpu分别进行统计,我参考了kernel Documents中关于percpu map的一段原话:

Values stored in BPF_MAP_TYPE_ARRAY can be accessed by multiple programs across different CPUs. To restrict storage to a single CPU, you may use a BPF_MAP_TYPE_PERCPU_ARRAY.

    用我不太靠谱的英语人肉翻译了一下,最后抓住了关键字"you may use a BPF_MAP_TYPE_PERCPU_ARRAY",我毫不犹豫的选择了BPF_MAP_TYPE_PERCPU_ARRAY作为数据的存储载体。

    接下来就是编写一个最简单的代码框架,然后慢慢完善、打磨功能。谁知刚刚代码框架刚刚写好,结果一跑程序就崩溃了(segfault. 我是幸运的,其实是偶现,如果没有撞见可能程序上线前我都发现不了这个问题)。几经周折,异常引发的范围缩小到bpf_map_lookup_elem(map_fd, &cpu, &value)这个调用引发,而且将BPF_MAP_TYPE_PERCPU_ARRAY换成BPF_MAP_TYPE_ARRAY就再也不出现了。

    这是为什么呢,难道是我用的不对?为了找到原因,接下来就开始了漫长的PERCPU map的探索之路。

    这里补充一些bpf_map_lookup_elem()的知识,以免一些同学一头雾水。

    bpf_map_lookup_elem()是ebpf中查找map中特定key对应value的函数。这个函数存在于两个不同的形态:1) 内核中提供的helper function,供ebpf程序调用;2) libbpf库中提供的用户态接口,最终是通过系统调用来实现查找key对应的value。

2 自我反省

    在深扒代码我认真思考了一下目前的局势:

    1 使用BPF_MAP_TYPE_ARRAY map时,用户态bpf_map_lookup_elem()不出这个问题;

    2 ebpf中内核使用bpf_map_lookup_elem()的helper function为什么就没有问题.

    带着两个问题我深深的怀疑BPF_MAP_TYPE_PERCPU_ARRAY类型的map对于bpf_map_look_elem()的实现在内核helper function和用户态在系统调用上的实现上是不一致的。

3 分析bpf_map_lookup_elem的实现

    为了搞清楚BPF_MAP_TYPE_PERCPU_ARRAY map在bpf_map_look_elem()函数上对于内核helper function和用户态syscall的区别,我开始了这两种方式的探索。

3.1 内核helper function的实现

    可以很清楚的看到,内核helper function在根据key查找元素时最终是通过this_cpu_ptr()获取元素指针。

 3. 2 用户态系统调用

    可以看到,这里最终是拷贝了num_possible_cpus()*元素size 大小的内存到用户态。这里和helper function是有区别的;上面helper function只访问了一个元素大小的内存,而这里则是num_possible_cpus()个元素,也就是说对于BPF_MAP_TYPE_PERCPU_ARRAY这种percpu 类型的map,用户态通过系统调用bpf_map_look_elem()去访问时,需要传递num_possible_cpus()个元素大小的内存来存放内核拷贝的数据。如果只是按照普通MAP方式,传递一个元素大小的内存,则会发生越界。

总结

    本文只是浅浅的关注了一下Linux中BPF_MAP_TYPE_PERCPU_ARRAY类型map在bpf_map_look_elem()函数上对于helper function和用户态系统调用的区别。

    其实在Linux中BPF_MAP_TYPE_PERCPU_ARRAY只是其中一种percpu map,还有其他若干种percpu map,其元素的访问原理也是一样,helper function与用户态系统调用是有区别的。

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

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

相关文章

python转C++格式学习笔记

我是主写python的,但是感觉算法上想精进的话,还是得用c写,所以笔记主要记录的是c与python不太一样的地方,听的是y总的算法基础课,结合y总的讲义,白框里面是自己的理解,大家取精华,去…

已解决pip使用阿里云镜像安装第三方模块失败

已解决(pip使用阿里云镜像安装第三方模块失败)ERROR: Could not find a version that satisfies the requirement xpinyin (from versions: none) ERROR: No matching distribution found for xpinyin WARNING: The repository located at mirrors.aliyu…

2023年,我们还需要一部游戏手机吗?

这世界上本没有路,走的人多了,也便成了路。可实际情况全都如此吗?眼下,游戏手机的路似有还无。2022年12月下旬,刚晋升为小米集团总裁的卢伟冰,在宣传自家的Redmi K60系列时,称“K60宇宙&#xf…

npm无法使用的坑及其解决

1.(如果是第一次可以跳过这个步骤)如果你是下载了nodejs的话,那么请以此删除一下的文件:(他们可能有也可能没有,但有的话把它们删除) C:\Program Files (x86)\nodejs C:\Program Files\nodejs C:\Users{User}\AppData\Roaming\npm&#xff08…

【强训】Day05

努力经营当下,直至未来明朗! 文章目录一、选择二、编程1. 统计回文:sparkles: 2. 连续最大和[dp]答案1. 选择2. 编程普通小孩也要热爱生活! 一、选择 下面的程序 编译运行后,在屏幕上显示的结果是() pub…

LWIP(二)——LWIP有3种编程接口,RAW、NETCONN和SOCKET

目录 1. RAW 2. NETCONN 3、SOCKET LWIP有3种编程接口,RAW、NETCONN和SOCKET。它们的易用性从左到右依次提高,而执行效率从左到右依次降低,用户可以根据实际情况,平衡利弊,选择合适的 API 进行网络应用程序的开发。…

性价比高的香港物理服务器怎么选用?

​  从事跨境业务,对于网络流量大且速度、安全网络要求高的企业,通常建议选用香港物理服务器。物理服务器以非共享方式租给一个特定的客户,比较满足一些企业的高要求。当然,在进行比较并选择性价比高的香港物理服务器时&#xf…

Flink 知识点整理及八股文问题<第二、三部分 Flink快速上手和部署>

本篇为Flink的第二、三部分&#xff0c;Flink快速上手和Flink部署&#xff0c;全篇参考自 尚硅谷2022版1.13系列 整个系列的目录如下&#xff1a; &#x1f49a;<一>Flink简介 &#x1f49a;<二>Flink快速上手 &#x1f49a;<三>Flink 部署 &#x1f49a;&l…

Revit标注墙偏移如何简便标注呢?万能标注?

一、Revit标注墙偏移如何简便标注呢? 1、如果墙定位线是核心层中心线&#xff0c;现在要标注墙偏移如何简便标注呢? 遇到上述问题大家可能想到的办法是用TAB键去选择墙的内外边缘。其实有更简便的方法&#xff0c;如图1所示。 红色框选部分是选项栏&#xff0c;当使用对齐尺寸…

JDBC高级——主键回显、批量插入、事务操作

自增主键回显 一般在插入数据时&#xff0c;设置主键为自增&#xff0c;然后我们就不用去维护这个主键值&#xff0c;其他的级联表可能以这个主键作为外键或参考&#xff0c;所以我们要拿到插入数据的主键值&#xff0c;这就是主键回显。 如何获取数据库自增的主键值&#xff…

自己写一个简单的工作流引擎V2

上一篇文中我们实现了顺序的工作流&#xff0c;对于多分支的工作流如下&#xff0c;该如何实现呢&#xff1f; 小明提交了一个申请单&#xff0c;然后经过经理审批&#xff0c;如果通过&#xff0c;发邮件通知&#xff0c;不通过&#xff0c;则打回重新填写申请单&#xff0c;…

计算机体系结构 | 函数栈帧 | 栈帧的创建与销毁讲解 | 篡改函数的返回地址

文章目录前言预备知识demo及其汇编代码汇编代码讲解返回值篡改&#xff08;111 ???&#xff09;前言 复习时遇到一些问题&#xff0c;可能是关于左值右值的概念理解不够透彻&#xff0c;于是转头去研究左值右值的问题&#xff0c;但是想要参透左右值&#xff0c;我又觉得需…

通信网络概论

一、通信网络概述 通信网络是一些设备、设施组成的集合&#xff0c;可以提供特定的服务&#xff0c;即可以实现位于任意地点的不同用户间信息的传递。 通信网络的基本问题&#xff1a;如何以尽可能低的成本有效地解决处于任何地理位置的任意两个用户之间即时信息传递问题&…

基于java springmvc+mybatis学生考试系统设计和实现

基于java springmvcmybatis学生考试系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码…

公司选择之外包

前言 简单介绍下人们常说的外包是什么&#xff0c;应届生未出社会没有经验&#xff0c;避免求职过程中的一些坑。 文章目录前言一、什么是外包&#xff1f;1、简介1、项目外包2、人力外包二、外包公司有哪些&#xff1f;三、优缺点1、优点2、缺点四、选择一、什么是外包&#x…

FreeRTOS的Systick和HAL时基

目录 分析 举个例子&#xff1a; 正确的做法&#xff1a; 总结 我们首先需要知道&#xff0c;使用了FreeRTOS会强制使用systick作为自己的心跳&#xff0c;这个os_tick的优先级是最低的&#xff0c;它主要的作用就是OS任务调度&#xff0c;时间片查询等工作。 在图中&#x…

【未解决乌龟问题】测试ROS是否安装成功

前提说明&#xff1a;虚拟机、ubuntu-18.04.1 1、操作流程&#xff1a; 1&#xff09;参考教程链接1&#xff0c;第一步输入roscore指令查看ROS的版本、节点、端号等内容时出现“Command roscore not found, but can be installed with: sudo apt install python-roslaunch”…

python-docx写入word

目录 字体大小参照 安装python-docx 引入依赖包 使用 标题设置字体、字号、居中、加粗、颜色 正文设置字体、字号、居中、加粗、颜色 添加图片 官方文档 字体大小参照 字号‘八号’对应磅值5 字号‘七号’对应磅值5.5 字号‘小六’对应磅值6.5 字号‘六号’对应磅值7.…

Java8-19新特性一览 ,认识全新的前沿技术

文章目录Java8-19新特性一览 ,认识全新的前沿技术前言你的收获Java发展趋势准备工作新特性1、接口private1&#xff09;、说明2&#xff09;、案例3&#xff09;、注意2、类型推断1&#xff09;、说明2&#xff09;、案例3&#xff09;、注意3、空指针优化1&#xff09;、说明2…

【5】SCI易中期刊推荐——计算机科学(中科院2区)

🚀🚀🚀NEW!!!SCI易中期刊推荐栏目来啦 ~ 📚🍀 SCI即《科学引文索引》(Science Citation Index, SCI),是1961年由美国科学信息研究所(Institute for Scientific Information, ISI)创办的文献检索工具,创始人是美国著名情报专家尤金加菲尔德(Eugene Garfield…