LWN:Slabs, sheaves, and barns!

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

Slabs, sheaves, and barns

By Jonathan Corbet
February 24, 2025
Gemini-1.5-flash translation
https://lwn.net/Articles/1010667/

内核的 slab (slab:一种内存分配机制)分配器负责分配小的(通常小于一个内存页)内存块。对于许多工作负载来说,对象分配和释放的速度是影响整体性能的关键因素之一,因此,长期以来,人们投入了大量精力来优化 slab 分配器。既然内核现在已经精简到一个单独的 slab 分配器,内存管理开发人员就可以自由地向其中添加复杂性;slab 维护者 Vlastimil Babka 最新的举措是per-CPU sheaves 补丁集。

许多内核开发人员使用诸如 kmalloc() 的函数与 slab 分配器交互,这些函数可以分配任何(合理的)大小的对象。然而,slab 分配器还有一个更底层的接口,它处理固定大小的对象;子系统经常使用该接口来频繁地分配和释放相同大小的对象。好奇的人可以通过查看 /proc/slabinfo 来查看他们系统中的所有专用 slab。许多核心内核操作都涉及到从这些 slab 中分配对象并返回它们,因此,slab 分配器已经获得了许多特性,包括 NUMA 感知和批量操作,以加速分配和释放。

但是,很自然的,它永远不够快。

提高当今多处理器系统性能的关键之一是尽可能避免 CPU 之间的交互。交互会导致争用、锁延迟和缓存行反弹,所有这些都会损害性能,但是一个可以像系统中不存在其他部分一样运行的 CPU 可以全速前进。这种理解推动了 per-CPU 数据结构在内核中的采用。slab 分配器已经使用了 per-CPU 数据,但它仍然有足够的跨 CPU 交互来降低速度。

Sheaves (sheaves:一组对象的集合,这里指 per-CPU 对象缓存)是 Babka 的补丁集中引入的一个概念;本质上,它们是 per-CPU 的对象缓存,可以用来响应分配请求,而无需与系统中的任何其他 CPU 交互。默认情况下,sheaves 是禁用的,但是可以通过在传递给 kmem_cache_create() 的 kmem_cache_args 结构中的新字段 sheaf_capacity 中设置一个非零值来为特定的 slab 启用它们。该值应该是在单个 sheaf 中缓存的对象数量;将 sheaf 用法添加到 maple-tree 数据结构的补丁 将其设置为 32。

启用 sheaves 后,分配器将为每个 CPU 维护一个具有给定对象数量的 sheaf。只要有可能,分配请求将从这个 sheaf 中得到满足,并且释放的对象如果有空间,将被放回 sheaf 中。这会将分配和释放操作转换为纯粹的本地分配,可以快速执行;不需要锁定(甚至不需要原子操作)。每个 CPU 还会维护第二个(备份)sheaf;当发现主 sheaf 为空时,将从备份 sheaf 中分配一个对象。如果在释放对象时主 sheaf 已满,则如果可能,该对象将被放入备份 sheaf 中。

当两个 sheaves 都满时,将不再有地方可以通过简单的赋值来存放释放的对象;这就是 “barn” (barn:存放未使用的 sheaves 的仓库)的用武之地。barn 只是一个用于存放当前未被任何 CPU 用于缓存的 sheaves 的地方;系统中的每个 NUMA 节点都有一个 barn。一旦一个 CPU 填满了它的 sheaves,它将尝试将一个放入 barn 中;如果一个 CPU 的 sheaves 为空,它将尝试从 barn 中获得一个满的 sheaf。在任何一种情况下,此操作都较慢,因为需要锁定才能安全地访问共享的 barn,但它仍然比完全进入 slab 分配器要快。

barn 保存两组 sheaves — 一组用于完整的 sheaves,另一组用于空的 sheaves。如果一个 CPU 正在释放大量对象,它可以将其完整的 sheaves 放入 barn 中,并获得空的 sheaves 来替换它们。barn 可以容纳的 sheaves 数量有限;在当前的补丁集中,完整和空的 sheaves 各自被硬编码为 10 个。如果一个 CPU 尝试将一个 sheaf 放入一个已满的 barn 中,那么该 sheaf 将被释放,以及它包含的任何对象,都将返回到它们来自的 slabs 中。

到目前为止,这个系列有可能极大地加速为分配和释放大量 slab 对象的工作负载的内存分配操作。但是,该系列后面添加了其他几个特性,以使 sheaves 更有用。

其中之一是对 kfree_rcu() 的增强,它将延迟对象的释放,直到 read-copy-update (RCU:一种并发控制机制)宽限期过去之后,从而确保该对象不再有任何活动引用。维护第三个 per-CPU sheaf 以保存用 kfree_rcu() 释放的对象;一旦 sheaf 填满,它将被传递给 RCU 子系统以进行宽限期等待。一旦发生这种情况,将尝试将 sheaf 放回 barn 中。

另一个补充是预分配。内核中的许多地方都必须立即分配内存,当然也不能阻塞分配线程。还有许多代码路径无法以任何合理的方式处理分配失败。在大多数这些情况下,有机会在进入更受约束的代码之前预先分配所需的内存。长期以来,内核一直维护着像 mempools 这样的子系统来满足这种需求。

但是,如果内核可以进入关键代码,并且知道它有一个装满对象的 per-CPU sheaf 可供使用,那么许多这些问题(以及对 mempool 的需求)就会消失。为此,该系列提供 一组函数 用于处理特殊用途的 sheaves。调用 kmem_cache_prefill_sheaf() 将返回一个包含至少所需数量的对象的 sheaf,如果可能,从 barn 中获取它。然后,可以使用 kmem_cache_alloc_from_sheaf() 从 sheaf 中分配对象,并保证至少所需数量的对象的成功。其他函数可用于将 sheaf 返回到 barn 或将更多对象放入 sheaf 中。这些特殊用途的 sheaves 的作用类似于 mempool,但它们旨在是短期的,而 mempool 通常存在于系统的整个生命周期中。

这个系列似乎没有引起太多的争议,尽管可能开发人员会将他们的评论保留到即将到来的 Linux Storage, Filesystem, Memory-Management, and BPF Summit,该峰会将于 3 月下旬举行。考虑到对更快的内存分配和释放的渴求,sheaves 和 barns 似乎很可能会在某个时候被添加到组合中。

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

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

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

e5502d9e47ed6c4cb4dc70f8ffc21d5b.jpeg

内容概要:本文介绍了一个基于Java与Vue的资产盘点PDA联动与账实核对可视化系统的设计与实现。系统以后端Spring Boot、MySQL、Redis为基础,前端采用Vue框架,结合PDA终端实现资产扫码盘点、数据同步、账实自动核对及差异闭环管理。通过统一资产数据模型、建立分层匹配算法(如编辑距离与加权综合评分)、实现幂等性控制与离线缓存机制,解决了传统盘点中存在的漏盘、错盘、网络不稳定、数据重复提交等问题。系统支持账实差异的自动生成与分类处理,构建了涵盖进度统计、风险预警、权限控制和操作审计的可视化决策平台,提升了资产管理的数字化、规范化和可追溯水平。文中还提供了核心模型设计与代码示例,包括资产实体、PDA扫描幂等保存、匹配算法、差异计算和统计接口等。; 适合人群:具备Java和Vue开发基础,熟悉Spring Boot、MySQL、Redis等技术栈,从事企业级管理系统开发的中高级研发人员,尤其是关注物联网(PDA)、数据同步、账实核对等场景的开发者。; 使用场景及目标:① 实现企业固定资产的高效、精准现场盘点;② 解决账面与实物不一致问题,建立自动化差异识别与处理流程;③ 构建可视化的资产管理驾驶舱,支持管理层决策与审计追踪;④ 学习高并发、幂等控制、模糊匹配算法在实际项目中的应用; 阅读建议:此资源以真实业务场景为驱动,不仅展示系统架构和技术实现,更强调业务逻辑与工程细节的结合。建议读者结合代码示例深入理解账实匹配算法、PDA同步机制与权限控制设计,并在实际项目中参考其分层架构与数据闭环理念进行实践与优化。
内容概要:本文针对配电网在发生故障后的恢复重构问题,提出一种结合改进深度优先搜索(DFS)算法与二进制粒子群优化(BPSO)的混合优化方法,旨在实现快速、高效的供电恢复。通过引入改进的DFS算法,有效校验配电网重构过程中的辐射状拓扑约束,确保网络的连通性与非环性,显著提升了拓扑可行性判断的效率;同时采用BPSO算法进行全局寻优,以最小化停电损失、降低网络损耗、最大化负荷恢复为目标构建综合优化模型,增强了重构方案的经济性与可靠性。该方法在Matlab平台上完成仿真验证,结果表明其在求解速度、收敛稳定性及优化质量方面均优于传统算法,具备良好的实用价值与推广前景,尤其适用于结构复杂的现代配电网在故障条件下的实时自愈控制。; 适合人群:电力系统自动化、电气工程及其自动化等相关专业的高校研究生、科研人员,以及从事配电网运行管理、智能电网开发与故障恢复系统设计的工程技术人员。; 使用场景及目标:①实现配电网故障后的快速网络重构与负荷恢复;②提升配电系统在突发事件下的自愈能力与供电可靠性;③优化开关操作策略,降低运行损耗并缩小停电影响范围;④为智能配电管理系统提供核心算法支撑。; 阅读建议:建议读者结合提供的Matlab代码深入理解改进DFS的拓扑校验逻辑与BPSO的编码机制、适应度函数设计及收敛特性分析,重点关注算法在不同故障场景下的鲁棒性表现,并可根据实际馈线结构进行参数调优与仿真迁移。
内容概要:本文系统阐述了基于Benders分解算法求解混合整数规划中的机组组合问题,重点介绍该方法在电力系统经济调度中的建模思路与优化机制。机组组合作为电力系统运行的核心优化问题,旨在通过合理安排各发电机组的启停状态与出力计划,在满足负荷需求与系统约束的前提下最小化总运行成本。Benders分解算法通过将原问题分解为包含整数变量的主问题(机组启停决策)和包含连续变量的子问题(经济负荷分配),采用迭代方式交替求解,并通过生成Benders割(可行性割与最优性割)逐步逼近全局最优解,从而有效应对大规模机组组合问题的计算复杂性。文中配套提供了完整的Matlab代码实现,涵盖模型构建、算法流程设计、收敛判据设置及结果可视化等环节,有助于深入理解算法在实际电力系统调度中的应用细节。; 适合人群:具备电力系统分析、运筹学基础及Matlab编程能力,从事能源系统优化、电力市场调度或相关方向研究的研究生、科研人员及工程技术人员。; 使用场景及目标:① 掌握Benders分解算法的基本原理及其在混合整数规划中的应用范式;② 实现机组组合问题的数学建模与高效求解,提升对电力系统日前调度与经济运行的理解;③ 借助Matlab代码进行算法复现、性能测试与扩展改进,支持学术研究或实际工程问题的原型验证; 阅读建议:此资源强调理论推导与编程实践的紧密结合,建议读者在熟悉拉格朗日松弛、对偶理论等背景知识的基础上,逐模块调试代码,重点关注主问题与子问题之间的信息交互机制,并尝试引入更多实际约束(如爬坡速率、最小启停时间)以深化对算法鲁棒性与适应性的理解。
内容概要:本文围绕基于改进秃鹰搜索算法(Improved Bald Eagle Search Algorithm, IBESA)的微电网群经济优化调度展开研究,提出了一种结合多能源协调控制、负荷动态变化与分布式电源出力不确定性的优化模型,并采用Matlab进行仿真验证。通过对传统秃鹰算法在收敛精度与全局寻优能力方面的改进,有效提升了算法在复杂非线性、多约束条件下求解微电网群调度问题的性能。研究综合考虑光伏、风电、储能系统及可控负荷等多种分布式单元,构建以最小化系统综合运行成本为目标的优化模型,涵盖燃料成本、购电费用、环境惩罚成本与设备维护成本,并满足功率平衡、设备容量限值、储能充放电特性等多重约束条件。文中详细阐述了算法设计机制、数学建模流程、参数设定及对比实验分析,通过与其他智能算法的仿真结果对比,验证了IBESA在求解效率与优化质量上的优越性。; 适合人群:具备电力系统运行与优化基础知识,熟悉Matlab编程工具,从事新能源系统调度、智能优化算法研究或微电网相关课题的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握智能优化算法在微电网经济调度中的建模与实现方法;②学习如何改进元启发式算法以提升其在实际工程问题中的搜索能力与稳定性;③复现高水平学术论文中的优化模型与仿真结果,支撑科研项目申报、论文写作或工程方案设计; 阅读建议:建议结合文中提供的完整资源下载链接(公众号“荔枝科研社”及百度网盘资料),获取源码与数据集进行实操复现,重点关注目标函数构建、约束处理方式及算法参数调优过程,通过对比不同算法的收敛曲线与调度结果,深入理解优化机理与工程应用价值。
内容概要:本文提出了一种基于中位数的多候选观测信号状态估计方法,重点研究了异常值的处理机制,旨在提升状态估计在复杂噪声环境下的鲁棒性与精度。该方法通过引入多个候选观测信号,并利用中位数对异常值不敏感的统计特性,有效抑制了突发性干扰或传感器异常带来的不良影响,增强了系统在恶劣工况下的稳定性。文章详细阐述了信号筛选、中位数融合策略及状态更新机制的设计逻辑,并配套提供了完整的Matlab代码实现,便于用户开展算法验证、性能测试与二次开发,适用于需要高可靠状态感知的工程应用场合。; 适合人群:具备信号处理、控制理论或状态估计基础知识,从事自动化、电力系统、工业控制、传感器融合及相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①在存在异常观测或多源传感器数据的系统中实现鲁棒状态估计;②应用于传感器融合、故障检测、容错控制等关键系统中的算法设计与仿真验证;③为学术研究中相关算法的复现、对比分析与改进优化提供可执行的技术参考。; 阅读建议:建议结合Matlab代码逐模块研读,重点关注中位数融合机制与异常值抑制策略的设计原理,理解其相较于均值法等传统方法的优势,并可根据实际应用场景调整候选信号数量、滑动窗口长度等参数以优化性能。
内容概要:本文系统介绍了基于多尺度集成极限学习机(ELM)回归的Matlab代码实现方法,属于机器学习在回归分析中的前沿应用。该方法融合极限学习机系列算法(如ELM、KELM等)的高效训练特性与多尺度集成策略,显著提升了模型在风电功率预测、负荷预测等复杂工程问题中的预测精度与泛化能力。文档不仅聚焦核心技术实现,还提供了大量配套科研资源案例,涵盖智能优化算法、深度学习、信号处理、电力系统等多个领域,充分体现了“借力科研”的理念,即通过整合先进算法工具提升科研效率与创新能力。; 适合人群:具备一定Matlab编程基础和机器学习基础知识的研究生、高校教师及工程技术人员,特别适用于从事风电预测、智能优化、电力系统调度等相关领域课题研究的科研人员。; 使用场景及目标:①掌握多尺度集成极限学习机在回归建模中的具体实现流程与关键技术细节;②借鉴文中丰富的科研案例,拓展自身研究的技术路径与算法选型思路;③利用所提供的完整代码资源加快实验验证与项目开发进度,提升科研产出效率与质量。; 阅读建议:建议读者结合文档中提供的百度网盘链接及公众号资源渠道,下载完整的Matlab代码进行实操演练,重点剖析多尺度特征提取与集成学习机制的设计原理,并尝试将其迁移应用于具体的科研任务中进行调参与优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值