LWN:针对BPF代码的内存分配器!

BPF性能分析—内存篇page_fault 性能分析—内存篇page_fault 分析步骤 1.sar -B 1整体分析,重点关注fault/s # sar -B 1 Linux 5.4.0-92-generic (zhangxa-Precision-3650-Tower-docker) 01/17/22 _x86_64_ (16 CPU) 11:35:37 pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff 阅读详情

关注了就能看到更多这么棒的文章哦~

A memory allocator for BPF code

By Jonathan Corbet
February 4, 2022
DeepL assisted translation
https://lwn.net/Articles/883454/

将一个 BPF 程序加载到内核的过程需要很多步骤,包括验证、权限检查、链接到内核中的 helper 函数,以及编译成本地可执行的指令。不过,在所有这些工作之中都隐含着一个简单的任务:分配内存,从而将编译后的 BPF 程序存放在内核的地址空间中。事实证明,在目前的内核中,当前的分配方式可能有些浪费内存,特别是在加载大量 BPF 程序的系统中尤为突出。Liu Song 的一组 patch set 就希望通过在内核中引入另一个专门的内存分配器来解决这个问题。

内核可以接受并执行相当大的 BPF 程序,但实际上,大多数 BPF program 都是很小的。BPF 可以用几百字节的代码就完成很多事情。但是,内核为 BPF 程序分配的空间是以整个 page(通常是 4KB)为单位的,只要该程序还没有被卸载掉,那么超过每个程序代码末尾的所有内存空间其实就被浪费掉了。对于一个小程序来说,被分配来存放代码的 page 中大部分空间是未使用的。如果有许多程序被加载进来,那么浪费的内存数量就会持续增加。

Liu 的补丁集增加了一个新的 "bpf_prog_pack" 分配器来解决这个问题。从表面上看,这会是系统中最简单的内存分配器之一。它维护着一个存放 BPF program 的一系列 huge page 的 list,在需要时会再分配新的 page。每当一个新的 BPF 程序需要空间时,一个简单的、先到先得的(first-fit)算法就会给它分配够内存空间。每个 huge page(或称为 "pack")关联的一个 bitmap 会跟踪记录空闲空间(以 64B 的小块为单位),这样就可以在 BPF program 被卸载时自动把返回给这个内存分配器的内存空间拼接起来。这个分配器并不需要以非常快的速度来执行,因为确实也不需要。哪怕是在一个大量使用 BPF 的系统中,分配和释放操作也是比较少见的。

这个简单的内存分配器的优点相当明显。因为可以把多个程序加载到一个 page 里面,这样就会大大减少由于内部碎片(internal fragmentation)而浪费的内存。把 BPF 程序放到 huge page 中就可以减少 TLB 的压力,有助于提高性能。肯定有人想问,既然内核已经有了经过多年密集开发和调整的内存管理代码,那么为什么还需要再加一个新的内存分配器呢?答案是,BPF 带来了一些现有分配器无法满足的特殊需求。

原有的无法进一步细分内存 page 的那些内核 page 分配器所存在的问题上面已经描述过了,那就是浪费了太多的空间。但是,内核的 slab 分配器其实正是为这个任务而设计的:它们会从 page 分配器中获取大块空间,并把它们分成小块传递给内核的其他部分。因此,在这里使用 slab 分配器看起来是很自然的想法。Liu 没有解释为什么不采用这种做法,但是有几个合理的理由可以来解释。

一个原因是由于 slab 分配器是为分配同等大小的 chunk 而进行过针对性的优化的。但是对于 BPF 程序来说,并不是所有的程序都有相同的 size,所以无法使用一个专用的 slab 以及 kmem_cache_alloc() 来简单支持这个功能。当然,可以使用多个 slab,既可以直接在 BPF 代码中使用,也可以简单地用 kmalloc() 来直接分配空间,但是无论如何都会有内部碎片的问题(尽管这个问题会比之前的问题要小得多了)。kmalloc() 使用的 2 的幂次的分配原则仍然会在每个程序的末尾浪费相当多的空间。

不过,要使用 slab 分配器还无法解决另一个更根本的问题。BPF 程序都是可执行代码,它必须被特别处理过。代码需要在页表配置中有可执行权限,这意味着它不能与数据混放在一起(kmalloc() 就会混放在一起)。毕竟,多年来,开发人员一直在努力确保数据不能在内核中被误执行了。所以,那些旨在管理数据内容的 slab 分配器并不适合这种应用场景。

要使这个 program-packing 方案生效,需要一定的技巧,不仅仅是使用这个专门的分配器就好了的。在一个正在运行的系统中更新代码是非常危险的,如果系统中的 CPU 试图在代码被修改时去执行这部分代码,结果会非常糟糕。内核在很多地方都需要使用那些需要自己修改过的代码,所以已经有机制可以安全地完成这些修改了,但是这个任务仍然必须非常小心地处理。由于无法直接写入可执行内存,再加上内核中的可执行内存区域必须是只读的,这就给 JIT 编译器带来了挑战。

因此,当使用新的分配器来为一个 BPF program 寻找内存空间时,它实际上分配了两个缓冲区。第一个是只读的、可执行的空间,程序必定要放在这里;第二个空间是用 kvmalloc()获得的普通内存。JIT 编译器将会编译输出到第二个 buffer 中,这个区域是可以被写入的,但它生成的任何地址都必须是相对于第一个 buffer 的地址的。等编译过程完成之后,内核的 "text poke" 机制再加上一个新增的 copy 函数就可以把编译好的 program 移动到 read-only 的 buffer 去,并释放这个临时 buffer。

截至目前,这组 patch 已经经历了 8 次修订,收到了许多 review,引出了大量的新的需要 fix 的地方。不过,目前来看可能已经没有更多的东西可以改了。因此,这段代码可能会进入 5.18 版本,然后大量使用 BPF 用户就应该可以节省更多的内存并看到性能有一些提升了。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

a9d559d8cdee21e93f5558fc6f52cdaa.png

IAR调试CC1310的错误:Fatal error:Failed to connect to the XDS emlulator (Error -241 @ 0x0:) 从simplelink_cc13x0_sdk_2_10_00_36导入collector工程后,rebuild后进行debug,出现了如图错误:Fatal error:Failed to connect to the XDS emlulator (connect ICEPick)...(Error -241 @ 0x0)A router subpath could not be accessed.... 阅读详情

相关推荐

解密TMS320F28377D双核工程中的内存分配艺术:从CMD文件到实战优化

本文深入解析TMS320F28377D双核DSP的内存管理艺术,从CMD文件配置到实战优化技巧。详细介绍了SARAM、GSRAM等内存类型的特性与配置方法,提供双核协同、性能优化及高级调试的实用方案,帮助开发者提升系统实时性和稳定性。

weixin_29190651的博客 662

LWN: BPF 中也能panic!

关注了就能看到更多这么棒的文章哦~The BPF panic functionBy Jonathan CorbetJuly 18, 2022DeepL assisted translationhttps://lwn.net/Articles/901284/BPF 子系统的关键卖点之一,就是加载 BPF 程序的动作是安全的:BPF verifier 这个验证器会在允许加载 ...

Linux News搬运工 390

【已解决】App unavailable Unfortunately, Claude is only available in certain countries and regions

App unavailable Unfortunately, Claude is only available in certain countries and regions right now. We will soon publish a list of supported locations on our website.

weixin_43941438的博客 3万+

LWN: BPF可以调用内核函数了!

关注了就能看到更多这么棒的文章哦~Calling kernel functions from BPFBy Jonathan CorbetMay 13, 2021DeepL assisted...

Linux News搬运工 997

在不同版本Python中安装PyQT5及PyQT5-Tools

在不同版本Python中安装PyQT5及PyQT5-Tools

zoomgu680的博客 2万+

VMware ESXi +DELL虚拟化存储磁盘容量处于紧急状态问题的处理

1、环境介绍 exsi server两台(DELL R730 ): 192.168.3.206 VMware EXSi6.5 192.168.3.207 VMware EXSi6.5 磁盘存储柜一台(DELL SC2000): 192.168.3.208 2、故障处理 由于前期规划的卷空间过大,虚拟机文件逐年增大以后,造成卷的磁盘占用过与整个磁盘空间的容量,虚拟化平台可用容量爆掉,DELL SC2000自动切换到紧急状态,禁止所有磁盘I/O,exsi主机上的虚拟机无法开机 首先,安装

wolf1105的博客 3530

LWN:BPF 中可以长存的指针!

关注了就能看到更多这么棒的文章哦~Long-lived kernel pointers in BPFJuly 14, 2022This article was contributed by David VernetDeepL assisted translationhttps://lwn.net/Articles/900749/BPF 子系统允许程序员编写一些可以在内核空...

Linux News搬运工 675

【面试题】MySQL索引相关的面试题(红黑树,hash,B树,B+树)

自己整理了几个面试题分享给大家 问题1:红黑树为什么那样设计? 首先聊一下二叉搜索树,主要特点是左节点比根节点小,右节点比根节点大,并且左右子树都是二叉搜索树。缺点是在极端情况下,比如插入都是有序的,就会出现退化的情况有序序列树退化成链表。 二叉搜索树 退化成链表的二叉搜索树 此时,要想让树的节点平均分布就需要平衡树了,红黑树就是平衡树的一种(平衡二叉搜索树)。然后,一棵树的查询性能取决...

Mr_黑_ 的博客 4042

LWN:让BPF成为一个更安全的内核编程环境!

关注了就能看到更多这么棒的文章哦~BPF as a safer kernel programming environmentSeptember 23, 2022This article was contributed by David VernetLPCDeepL assisted translationhttps://lwn.net/Articles/909095/无论好坏,C语言已经是内核开发...

Linux News搬运工 439

量化交易零基础入门教程

特点 从零开始教编程。靠谱的量化交易学习资源稀少,且具有不讲编程、代码较难、过多等不适合新手等问题,本教程中则会从零开始教编程,解决量化入门过难过编程门槛这一问题。 量化与编程相结合。本教程不仅会教编程,而且会尽量结合量化情景,减少“我要做量化交易为什么要看这些用来培训程序员的东西”的愤懑。 简易精炼,快速入门。尽量只讲最核心最常用的知识,助你快速摆脱想学习量化却处处陌生不知所措的茫然的新手阶段。 读前说明 文后会有自测与自学,包括一些额外的延伸自学内容以及稍有难度的自测题目。 最最最基础的股票.

JanLEE 2885

C# Blazor Server工业监控Web UI:实时数据推送、历史曲线、报警记录,跨浏览器访问(踩坑总结+生产可用)

坑点现象解决方案StateHasChanged()太频繁服务器CPU占用高,浏览器卡顿别100ms刷新一次,1秒刷新一次足够并发高时服务器卡多个用户同时访问,服务器响应慢用Redis做分布式缓存,或者加服务器做负载均衡断线重连后数据丢失浏览器刷新后,实时数据不更新用InfluxDB存历史数据,刷新后重新查询工业现场网络不稳定Blazor Server频繁断线用SQLite本地缓存,断网时数据不丢,联网后补发历史曲线查询慢查询过去7天的数据,要等很久。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 303

A Memory Allocator(dlmalloc)

[A German adaptation and translation of this article appears in unix/mail December, 1996. This article is now out of date, and doesn't reflect details of current version of malloc.] Introduction Mem

把握自己。 2581

RK3568 上C图像camera图像采集应用实例(二)

本文探索rk3568上实现C语言的 通过C v4l2 接口 采集图像 ,刷屏控制 drm的显示camera图像中 实现camera preview 预览 的实践和探索。

luoshanxuli2010的专栏 758

LWN:BPF专用的内存分配器!

关注了就能看到更多这么棒的文章哦~A BPF-specific memory allocatorBy Jonathan CorbetJune 30, 2022DeepL assisted translationhttps://lwn.net/Articles/899274/内核现在并不缺内存分配器(memory allocator),所以人们可能不理解为什么又要加一个分配...

Linux News搬运工 388

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

LWN:SLUB分配器的下一步计划!

关注了就能看到更多这么棒的文章哦~What's next for the SLUB allocatorBy Jonathan CorbetMay 20, 2024LSFMM+BPFGemini-1.5-flash translationhttps://lwn.net/Articles/974138/Linux 内核中存在两个级别的基本内存分配器:页分配器 (page allocator),以页为单...

Linux News搬运工 465

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

LWN:针对可执行代码的另一个内存分配方案!

关注了就能看到更多这么棒的文章哦~Yet another memory allocator for executable codeBy Jonathan CorbetJune 8, 2023DeepL assisted translationhttps://lwn.net/Articles/933867/内核的代码越来越动态了,也就是随时会出现新的 text 段代码。目前,为新内核代码分配内存的责...

Linux News搬运工 1110

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

LWN:优化只有一个用户的内存!

关注了就能看到更多这么棒的文章哦~Optimizing single-owner memoryBy Jonathan CorbetMay 26, 2023LSFMM+BPFDeepL assisted translationhttps://lwn.net/Articles/932391/内核里的内存管理子系统的主要优化目标是要能最大程度地共享资源。但是,正如 Pasha Tatashin 在 20...

Linux News搬运工 1095

LWN: 6.1 合并窗口第一部分!

关注了就能看到更多这么棒的文章哦~The first half of the 6.1 merge windowBy Jonathan CorbetOctober 7, 2022DeepL assisted translationhttps://lwn.net/Articles/910312/6.1 合并窗口正在顺利进行中:自从窗口打开以来,已经有 5,752 个 non-merge changes...

Linux News搬运工 368

LWN:给kernel的swap添加一个抽象层!

关注了就能看到更多这么棒的文章哦~A new swap abstraction layer for the kernelBy Jonathan CorbetMay 23, 2024LSFMM+BPFGemini-1.5-flash translationhttps://lwn.net/Articles/974587/交换(swapping)在本质上可能是一种内存管理技术,但其实现也涉及内核的文件系...

Linux News搬运工 698

LWN:Lua in the kernel!

关注了就能看到更多这么棒的文章哦~Lua in the kernel?By Jake EdgeSeptember 9, 2020Netdev原文来自:https://lwn.net/Ar...

Linux News搬运工 814

LWN:内核5.5合并窗口关闭!

关注了就能看到更多这么棒的文章哦~The end of the 5.5 merge windowByJonathan CorbetDecember 9, 2019原文来自:https:...

Linux News搬运工 365

A Memory Allocator(经典文章)

本文转载自    http://g.oswego.edu/dl/html/malloc.html A Memory Allocator by Doug Lea [A German adaptation and translation of this article appears in unix/mail December, 1996. This article is no

IT小小鸟 1325

Linux网络编程:原始套接字--包过滤器BPF

目录参考文章一、BPF介绍二、BPF的结构三、BPF Socket 实例三、BPF Code 生成方法 参考文章 linux网络和BPF linux 下的 包过滤器 BPF Linux bpf 3.1、Berkeley Packet Filter (BPF) (Kernel Document) 一、BPF介绍 BPF(Berkeley Packet Filter)伯克利包过滤器。 BPF允许用户空间程序将一个过滤(filter)附加到任何的套接字(socket)上面用来允许或不允许某些类型的数据通过

jin787730090的博客 4403

BPF分析及使用方式

bpf

记录项目中所学到的问题,以及自学记录 7187

LWN:多种改善BPF性能的方案!

关注了就能看到更多这么棒的文章哦~A medley of performance-related BPF patchesByJonathan CorbetJanuary 2, 2020...

Linux News搬运工 980

BPF程序类型及其原理

bpf都可以干啥 为了回到这个问题,我们在bpf.h中看到了一些bpf类型的枚举定义: enum bpf_prog_type { BPF_PROG_TYPE_UNSPEC, BPF_PROG_TYPE_SOCKET_FILTER, BPF_PROG_TYPE_KPROBE, BPF_PROG_TYPE_SCHED_CLS, BPF_PROG_TYPE_SCHED_ACT, BPF_PROG_TYPE_TRACEPOINT, BPF_PROG_TYPE_

zhjwang的博客 6873
上一篇: LWN:PinePhone,尝试一款Linux的智能机!
下一篇: LWN:避免对持久性内存的误写入!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值