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

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

What's next for the SLUB allocator

By Jonathan Corbet
May 20, 2024
LSFMM+BPF
Gemini-1.5-flash translation
https://lwn.net/Articles/974138/

Linux 内核中存在两个级别的基本内存分配器:页分配器 (page allocator),以页为单位分配内存;以及 slab 分配器 (slab allocator),分配任意大小的块,通常(但不一定)小于一个页。slab 分配器是内核中常用函数 kmalloc() 的底层实现。在 2024 年 Linux 存储、文件系统、内存管理和 BPF 峰会 上,slab 维护者 Vlastimil Babka 对 slab 级别最近的变动进行了介绍,并讨论了即将到来的变动。

曾经,内核包含三个 slab 分配器实现。在 6.4 版本中,这个数字降至两个,当时 SLOB 分配器(针对低内存系统)被移除。Babka 在 2023 年峰会 上表示,当时已经决定移除 SLAB(两个通用分配器之一),只保留 SLUB 在内核中。这个移除动作也在 6.8 版本中完成。内核开发者现在拥有更大的自由度来改进 SLUB,而不必担心破坏其他分配器。他认为没有人对这个移除动作感到不满,直到他看到了最近来自嵌入式开源峰会的 报告,其中包含了一些抱怨。即使在那个场合里,主要抱怨似乎是关于移除发生得太快了的——尽管他认为这已经拖延了太久。无论如何,似乎没有人强烈要求将 SLAB 重新加入内核。

b513c8a748db1266beccd8607e872f74.png

去年,一些人表达了 SLUB 比 SLAB 对于某些工作负载更慢的担忧。但现在,没有人致力于解决任何剩余的问题。David Rientjes 说 Google 仍在努力过渡到 SLUB;在这个过程中,他们发现使用 SLUB 解决了一些在使用 SLAB 时观察到的抖动问题,因此 Google 的开发人员对这次变更感到满意。

Babka 说他一直在努力减少控制组中内核内存分配的统计(accounting)所产生的开销;这种成本体现在微基准测试(microbenchmarks)中,并且“Linus 对此很不满”。有一些改进已准备好在 6.10 版本中实现,但还有更多工作要做。slab 开发的另一个领域是 堆喷射防御(heap-spraying defense);这些补丁对他来说有点问题。他可以将它们视为内存管理变更进行审查,但他缺乏对安全方面进行判断所需的专业知识。

目前正在进行有关对象缓存和预填充的工作。这项功能将维护一个 per-CPU 的对象数组,用户可以选择是否打开这个功能;他们将能够在分配之前对对象进行预填充(或者预分配),以便它们在需要时随时可用。例如这对于在临界区中分配的对象非常有用。最初的目标用户是 maple tree 数据结构,它目前在进入临界区之前批量分配最坏情况下的对象数量,然后在之后返回未使用的对象。对象缓存将消除这种来回操作,同时确保在需要时可以分配对象。

Michal Hocko 指出,推动这项功能的真正问题是 GFP_ATOMIC 分配与 __GFP_NOFAIL 标志组合起来的情况;如果内存紧张,内核很难满足这种组合。分配器目前在遇到这种组合时会发出警告;他表示,开发者应尽量避免使用这种组合。预填充的对象缓存是解决这个问题的一种方法。将来,可能会为这种情况添加某种预留机制。

maple tree 暴露的另一个问题与其使用 kfree_rcu() 释放对象的做法有关——这在内核代码中经常使用。问题在于,以这种方式释放的内存不会立即供其他用途使用;它必须首先等待 RCU 优雅期过去。这会导致 kfree_rcu() 使用的 per-CPU 数组溢出,导致刷新(flushing),并且可能导致很快就需要重新填充进来,从而再次启动这个循环。这个问题在 Android 上更加严重,RCU 回调只在某些 CPU 上运行,这对处理未运行回调的 CPU 上的 per-CPU 数组就完全没有作用了。

计划创建一个 kfree_rcu() 变体,将对象放入数组并将其放在一边,以便作为一个整体释放。一旦发生这种情况,整个数组就可以放回池中,并提供给所有 CPU 使用。这个数组将被称为“sheaf”;它将存储在每个节点的“barn”中。一个潜在的问题是,在释放对象时可能需要分配一个新的 sheaf;应尽可能避免在释放路径中进行分配。该小组讨论了替代方案,但没有得出任何结论。

与此同时,Babka 并不满足于只移除 SLOB 和 SLAB;接下来要移除的目标是 BPF 子系统使用的特殊分配器。这个分配器旨在任何调用上下文内都可以使用,包括不可屏蔽中断 (NMI) 场景中。BPF 维护者 Alexei Starovoitov 显然赞成进行这个移除,如果 SLUB 能够处理相同的用例的话。BPF 分配器目前为分配的对象添加了 llist_node 结构,使它们更大;切换到 SLUB 将消除这种开销。这也将使 SLUB 成为 NMI 安全的,并消除维护另一个分配器的必要性。

Babka 还希望集成 objpool 分配器,该分配器在 6.7 内核中添加,没有与内存管理开发者进行任何协商。最后,随着会议时间的结束,Babka 提到了最终集成 mempool 子系统(这是另一种预分配对象的方式)的可能性。SLUB 分配器可以为系统中的所有 mempool 预留对象,从而减少整体开销。不过,这看起来是 2025 年峰会讨论的话题。

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

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

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

04c1768a1b4da99054d7b92d64dd2deb.jpeg

内容概要:本文详细介绍了一个基于Java与Vue的企业知识问答系统的设计与实现,旨在解决企业知识分散、检索效率低、信息安全性差等问题。系统采用前后端分离架构,后端基于Spring Boot实现用户认证、权限控制、文档解析、向量检索与问答服务,前端使用Vue及相关生态构建可视化界面。核心技术采用检索增强生成(RAG)架构,结合文本分块、向量化、混合检索(关键词+语义)、重排序与大语言模型生成,确保答案基于企业内部知识,避免幻觉。系统支持多格式文档处理、权限隔离、敏感信息防护与问答可追溯,形成“知识采集—加工—检索—回答—优化”的闭环体系,适用于多行业场景。文中还提供了关键模块的算法描述与Java代码示例,如文本分块、余弦相似度计算、混合排序与提示词构造等,增强了项目的可实施性。; 适合人群:具备Java和Vue开发基础,熟悉Spring Boot、RESTful接口及基本前端框架的中初级软件工程师、全栈开发者,以及对企业知识管理系统、RAG技术落地感兴趣的技术人员;也适合高校学生作为毕业设计或课程项目参考。; 使用场景及目标:① 构建企业级智能问答平台,实现制度、流程、技术文档的自然语言查询;② 解决传统知识管理中语义检索不准、专业术语识别难、模型回答不可控等问题;③ 实践RAG架构在真实业务中的集成与优化,掌握文本向量化、混合检索、权限控制与安全生成等关键技术。; 阅读建议:建议结合代码示例与系统架构图进行理解,重点关注权限控制、混合检索策略与提示词设计等安全与准确性保障机制;在学习过程中可搭建本地环境进行功能验证,并根据实际业务需求调整分块策略、权重参数与安全规则。
内容概要:本文研究了一种基于生成对抗网络(GAN)的数据驱动可再生能源场景生成方法,通过构建两个互连的深度神经网络——生成器与判别器,实现对风电与光伏发电出力时间序列的高效建模。该方法克服了传统基于概率统计模型在刻画非线性、强波动性风光数据分布时的局限性,能够有效捕捉复杂的时空相关性与多模态特征,显著提升生成场景的真实性、多样性与时序一致性。研究重点采用Wasserstein GAN(W-GAN)架构,并结合Python编程实现模型训练与验证,展示了其在新能源功率预测、不确定性量化及电力系统优化调度中的应用潜力,配套提供了完整的代码资源以支持复现与拓展。; 适合人群:具备一定机器学习与深度学习基础,从事新能源发电预测、电力系统规划、微电网优化或不确定性建模等相关领域的科研人员、研究生及工程技术开发者;熟悉Python编程并希望将前沿深度学习模型应用于能源时间序列建模的专业人士。; 使用场景及目标:①应对风光发电强随机性与间歇性带来的建模挑战;②生成高质量、多样化的典型出力场景用于鲁棒优化、随机规划与机会约束调度;③支撑储能配置、电力市场仿真、需求响应等决策分析;④探索W-GAN在多变量时间序列生成中的结构设计与训练稳定性优化策略; 阅读建议:此资源强调理论与实践深度融合,建议读者在掌握GAN与Wasserstein距离基本原理的基础上,结合所提供的Python代码进行逐模块调试与实验分析,重点关注损失函数设计、梯度惩罚机制、模型收敛性判断及生成结果评估指标(如分布相似度、自相关性保持等),并可进一步迁移至其他高不确定性的能源数据生成任务中。
内容概要:本文系统研究了Picard迭代法在非线性常微分方程参数估计中的应用,提出了一种基于迭代逼近的参数辨识方法。通过构建微分方程的Picard序列逐步生成近似解析解,并结合实际观测数据,采用优化算法调整未知参数以最小化模拟值与实测值之间的残差,从而实现对模型参数的高精度估计。文章详细阐述了算法的数学原理、迭代流程设计及收敛性分析,配套提供了完整的Matlab实现代码,支持用户复现实验并拓展应用于其他非线性动力系统。该方法避免了传统数值积分带来的累积误差,具有理论严谨、实现简洁、适应性强的优点,特别适用于缺乏显式解的复杂微分方程建模任务。; 适合人群:具备常微分方程、数值分析基础及Matlab编程能力的理工科研究生、博士生和科研人员,尤其适合从事系统建模、动力学仿真、参数反演等相关领域研究的学者; 使用场景及目标:①解决非线性微分方程因无法解析求解而导致的参数估计难题;②在生物医学、环境科学、工程控制等领域中,从实验或观测数据中反演系统内在参数,提升模型预测能力与解释力; 阅读建议:建议读者结合文中公式推导与代码实现,逐轮观察Picard迭代过程中解的演化规律及参数更新路径,深入理解迭代法在耦合状态与参数联合估计中的作用机制,并尝试将其迁移至多变量、高阶或含噪声数据的实际应用场景中进行验证与改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值