LWN:文件系统支持block size超过page size!

UFS逻辑单元管理 介绍UFS 逻辑单元管理和配置 阅读详情

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

Filesystem support for block sizes larger than the page size

February 20, 2025

This article was contributed by Pankaj Raghav
Gemini-1.5-flash translation
https://lwn.net/Articles/1009548/

内核所能支持的最大文件系统块大小一直受到 Linux 主机页大小的限制,即使文件系统本身可以处理更大的块大小。为 6.12 内核合并的 large-block-size (LBS) patches移除了 XFS 中的这一限制,从而将页大小与文件系统块大小解耦。XFS 是第一个获得此支持的文件系统,未来可能会有其他文件系统添加 LBS 支持。此外,LBS 补丁已被用于将 initial atomic-write support(初始原子写入支持)引入 XFS。

LBS 是一个含义过载的术语,因此有必要澄清它在内核上下文中的含义。在本文中,术语 LBS 指的是文件系统块大小大于系统页大小的情况。文件系统块是文件系统用于在磁盘上存储文件数据的最小单元。设置文件系统块大小只会影响数据路径中的 I/O 粒度,而不会对文件系统元数据产生任何影响。

Long history

LBS 最早的用例 来自 CD/DVD 领域,当时读取和写入必须以 32KB 或 64KB 的块执行。最初提议使用 LBS 支持来处理这些设备,并避免在设备驱动程序级别进行变通,但该方案从未被合并。除了这些历史需求之外,LBS 还支持测试大于主机页大小的文件系统块大小,从而允许开发人员在不支持 64KB 页面的 x86_64 系统上验证 64KB 块的 XFS 功能。鉴于采用更大页大小的架构日益增多,这一点尤其有价值。

LBS 的另一个新兴用例来自现代高容量固态存储设备 (SSD)。存储供应商正在 increasing their internal mapping unit(增加其内部映射单元),通常称为 Indirection Unit (IU),使其超过 4KB 以支持这些设备。如果 I/O 操作的大小与此更大的 IU 不匹配,则设备必须 perform read-modify-write operations(执行读-修改-写操作),从而增加写入放大因子。LBS 使文件系统能够将其块大小与设备的 IU 相匹配,从而避免这些代价高昂的操作。

虽然 LBS 听起来似乎与块层(block layer)有关,但内核中的块大小限制实际上 来自 page cache,而不是块层。获得文件系统 LBS 支持的主要要求是在页缓存中将文件系统块作为一个单元进行跟踪。由于块是数据的最小单元,因此页缓存不应在回写期间 partially evict(部分逐出)单个块。

过去曾多次 attempts(尝试)添加 LBS 支持。Dave Chinner 在 2018 年 最近一次努力通过在 iomap 中添加 IOMAP_F_ZERO_AROUND 标志来规避页缓存的限制。如果 I/O 操作的大小小于单个块,则此标志会用零填充 I/O 操作。这些补丁还移除了 writepage() 回调,以确保在回写期间写入整个大块。由于 folios(页)正逐渐受到关注,并且有可能直接在虚拟文件系统层解决部分逐出的问题,因此这项工作未被提交到主线 (mainline)。

Large folio support(大页支持)已添加到页缓存中,并在 5.18 版本中在 XFS 中启用。如果文件系统支持大页,则页缓存将根据 I/O 操作的大小,在读取和写入路径中有机会分配更大的页。文件系统在 inode 初始化期间调用 mapping_set_large_folios() 以启用大页功能。但是,如果系统内存不足,页缓存仍然可能会退回到分配 order-0 页(单个页),因此无法保证页的大小。

LBS 补丁由我和我的同事开发,它为文件系统添加了一种方式,可以将最小和最大页分配顺序告知页缓存,以匹配其块大小。页缓存将分配与文件系统设置的顺序约束匹配的大页,并确保不会发生块的部分逐出。mapping_set_folio_min_order() 和 mapping_set_folio_order_range() API 已被添加,以控制页缓存中的分配顺序。顺序信息被编码在 address_space struct 的 flags 成员中。

设置最小页顺序足以让文件系统添加 LBS 支持,因为它们只需要保证页缓存中分配的最小页。文件系统可以在 inode 初始化期间根据块大小设置最小页顺序。 mapping_set_large_folios() 的现有调用者不会注意到任何行为上的变化,因为该函数现在会将最小顺序设置为零,并将最大顺序设置为 MAX_PAGECACHE_ORDER 。

在内存压力下,内核会尝试将一个大页分解为单个页,这可能会违反页缓存中最小页顺序的承诺。主要的约束是,页缓存必须始终确保页缓存中的页永远不小于最小顺序。自 6.8 内核以来,内存管理子系统已支持将大页拆分为任何 lower-order folio(低阶页)。LBS 支持使用此功能来始终保持页缓存中的最小页顺序,即使由于内存压力或截断而拆分大页时也是如此。

Other filesystems?

读者可能想知道,既然页缓存基础设施已经就位,那么向其他文件系统添加 LBS 支持是否会很简单。不幸的是,答案是:视情况而定。即使页缓存中已经有了在任何文件系统中支持 LBS 的必要基础设施,但添加此支持的路径取决于文件系统的实现。XFS 已经为 LBS 支持准备了很长时间,这使得 LBS 补丁只需要在 XFS 中进行最少的更改。

文件系统需要支持大页才能支持 LBS。因此,目前任何在数据路径中使用 buffer heads(缓冲区头)的文件系统都无法支持 LBS。XFS 开发人员放弃了缓冲区头,并设计了 iomap 来解决缓冲区头的缺点。虽然目前正在进行支持缓冲区头中的大页的工作,但这可能需要一段时间才能添加。一旦将大页支持添加到文件系统,添加 LBS 支持就是要找到文件系统中任何对块大小做出假设的 corner cases(极端情况)。

LBS 已经在内核中找到了一个用例。页缓存中表示文件系统块的内存不会被拆分的保证已被用于 6.13 中的 atomic-write support in XFS(XFS 中的原子写入支持)。XFS 中的初始支持将仅允许原子地写入一个文件系统块。驱动器需要使用所需大小的原子写入作为其文件系统块大小进行格式化。

LBS 项目的下一个重点是 remove the logical-block-size restriction for block devices(删除块设备的逻辑块大小限制)。与文件系统块大小类似,逻辑块大小(logical block size),即存储设备可以寻址的最小大小,由于页缓存的限制,也被限制为主机页大小。当应用程序直接在设备上执行缓冲 I/O 操作时,块设备会将数据缓存在页缓存中,并且默认使用缓冲区头与页缓存进行交互。因此,需要在缓冲区头中支持大页才能消除块设备的这一限制。

在 LBS 的第一次尝试之后,过去 17 年中发生了许多核心变化,例如大页支持、XFS 使用 iomap 而不是缓冲区头、块层中的多页 bvec 支持等等。这使得添加 LBS 支持所需的更改相对较少。随着 6.12 完成这项工作,XFS 最终将支持它在 2001 年移植到 Linux 之前在 IRIX 中支持的所有功能。

[I would like to thank Luis Chamberlain and Daniel Gomez for their contributions to both this article and the LBS patches. Special thanks to Matthew Wilcox, Hannes Reinecke, Dave Chinner, Darrick Wong, and Zi Yan for their thorough reviews and valuable feedback that helped shape the LBS patch series.]

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

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

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

f2b091aea5dd0f727fd125d3e52edcd3.jpeg

Linux 块设备驱动 (2) 本文将继续上篇博客:Linux 块设备驱动 (1) 的实验,围绕 Sampleblk 探究 Linux 块设备驱动的运作机制。除非特别指明,本文中所有 Linux 内核源码引用都基于 4.6.0。其它内核版本可能会有较大差异。 阅读详情

相关推荐

【信息科学与工程学】【产品体系】第三十三篇 DPU/smartinic芯片中的学科知识03

需求实现DMA 与流边界检测优化​分级超时状态机(短/中/长)+ 积压计数 + 批量触发DMA 控制器优化​描述符预取(深度 4)+ 中断合并(阈值 8)Fence 语义正确性验证​RTL 断言 + C 语言序列号检测 + 性能对比 + 硬件计数器所有代码均为可综合 Verilog,已在仿真器中通过基本功能测试。在 FPGA 原型上运行上述 RTL,配合 ChipScope 观察 fence 时序在 BlueField-3 上运行 DOCA DPA 测试程序,对比加/不加 fence 的结果。

weixin_49199313的博客 272

ufs2.2 协议扫盲(十八)

Logical Unit Management

GRZ的博客 6279

从零实现反激式电源仿真:LTspice高级应用实例

深入解析反激式开关电源的建模与仿真过程,利用LTspice实现从零搭建电路,精准验证电路仿真效果,提升电源设计效率与可靠性。

weixin_36149538的博客 1896

ufs2.2 协议扫盲(十一)

UFS Protocol Information Units COMMAND UPIU

GRZ的博客 3210

PaddleOCR 3.x 最新版使用教程(2025)——从安装到实战身份证识别,一步到位!

本文针对PaddleOCR 3.x大版本更新带来的参数变化和兼容性问题,提供从环境配置到实际应用的全流程解决方案。

qq_58607032的博客 9786

Power BI----各类切片器的使用

首先介绍切片器的最基础的创建和效果演示,紧跟着介绍切片器在多页中的同步和本身与报表的联动,再然后介绍关于切片器属性的设置,使得交互更加美观,最后介绍几种很好看的第三方的切片器样式和自己构建的可折叠的切片器.........

Itsme_MrJJ的博客 2万+

Linux中的physical_block_size和logical_block_size

Linux中的physical_block_size和logical_block_size

msdnchina的专栏@JiNan,ShanDong 5576

DataGrip 2023.3 Windows版激活保姆级教程:从下载脚本到输入激活码,一次搞定

本文提供DataGrip 2023.3 Windows版的完整安装与授权指南,从环境准备到数据库连接管理,再到高效开发技巧与高级功能扩展,帮助开发者快速掌握这一专业数据库管理工具。内容涵盖安装步骤、初始配置、常见问题解决及性能调优技巧,适合数据库开发新手和专业人士。

weixin_30275415的博客 635

LWN:把文件系统转换为iomap!

关注了就能看到更多这么棒的文章哦~Converting filesystems to iomapBy Jake EdgeJune 27, 2023LSFMM+BPFDeepL assisted translationhttps://lwn.net/Articles/935934/Luis Chamberlain 在 2023 年 Linux 存储,文件系统,内存管理和 BPF 峰会上领导了一场围绕...

Linux News搬运工 2033

【VisionMaster】图像源模块之本地图像

图像采集之图像源

zhy29563 6956

Multisim的探针(Probe)及数字电路的一些调试技巧的应用

Multisim的探针(Probe)及数字电路的一些调试技巧的应用 --EE Bang   By  WRS 上图为555方波发生器,根据R1,R2,C2参数的配置可产生频率为46.3KHZ,占空比50%的方波信号,如果用示波器查看波形参数的话需要用两个坐标轴做差,操作不便,另外如果要修改电路将上述电阻换成滑动变阻器的话,使其产生可变频率

Agent Christmas的博客 3万+

LWN:对EROFS的介绍!

关注了就能看到更多这么棒的文章哦~An introduction to EROFSBy Jake EdgeJune 7, 2023LSFMM+BPFDeepL assisted translationhttps://lwn.net/Articles/934047/Gao Xiang 在 2023 年 Linux 存储、文件系统、内存管理和 BPF 峰会的文件系统会议上对扩展只读文件系统 (EROF...

Linux News搬运工 2278

【全开源】旅行吧旅游门票预订系统源码(FastAdmin+ThinkPHP+Uniapp)

此外,系统还会根据我的旅行计划和喜好,为我推荐合适的景点和门票,让我的旅行更加丰富多彩。旅游门票预订系统的出现,不仅简化了门票预订的流程,还提高了旅行的便捷性和效率。一款基于FastAdmin+ThinkPHP+Uniapp开发的旅游门票预订系统,支持景点门票、导游产品便捷预订、美食打卡、景点分享、旅游笔记分享等综合系统,提供前后台无加密源码,支持私有化部署。如今,有了旅游门票预订系统,这些问题都能迎刃而解。智能推荐:系统还会根据你的旅行计划和喜好,为你推荐合适的景点和门票,让你的旅行更加丰富多彩。

2401_84413757的博客 1301

深入解析Linux IO调用链与性能优化

IO操作是Linux系统编程的核心基础,涉及从用户空间到内核的多层调用链。理解C标准库缓冲区、系统调用接口和内核页缓存的工作原理,对于优化IO密集型应用至关重要。通过分析文件流缓冲策略、VFS抽象层和块设备调度机制,开发者可以掌握减少系统调用开销、提升数据吞吐量的关键技术。在实际场景中,合理选择mmap内存映射、AIO异步IO或O_DIRECT直接IO等方案,能够显著提升数据库、大数据处理等应用的性能表现。本文结合Linux内核参数调优和SSD特别优化等实践技巧,为系统级软件开发提供全面的IO性能优化指南。

weixin_34111790的博客 457

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Qt之共享内存类QSharedMemory的使用及实现原理(全)(一)

跨平台支持:对不同操作系统(如 Windows、Linux 等)的底层共享内存机制进行封装,屏蔽了各系统间的差异,为开发者提供统一的接口,方便在不同平台上实现进程间共享内存通信。简化操作:提供了创建、附加、分离、删除共享内存等操作的简单方法,降低了使用共享内存的复杂度,开发者无需深入了解底层系统调用细节。数据共享:允许不同进程或线程访问同一块物理内存区域,实现高效的数据共享,避免了数据在不同进程间的多次拷贝,提高了数据传输效率。从使用的角度来讲,尤其是在线程或进程间数据通信来讲还是非常方便的;

红军不怕远征难,万水千山只等闲 2704

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Linux内核NVMe子系统架构与驱动实现深度解析(从blk-mq到PCIe队列全链路)

深度剖析Linux内核NVMe驱动子系统的分层架构与核心源码实现,涵盖nvme-core/nvme-pci/nvme-fabrics三层设计、关键数据结构、blk-mq多队列集成机制、驱动初始化全流程、I/O提交与完成完整调用链、PRP/SGL DMA映射、Admin命令处理、错误恢复与超时机制、IOPoll/HMB/Write Zeroes等高级特性,并给出fio实测性能与SPDK用户态驱动的量化对比。

专注分享DPU、RDMA智能网卡/SSD(固态硬盘)产品测试与优化 415

四路 CAN 转 4G 网关

SG‑CAN‑4G‑410 为**四路隔离 CAN 转 4G 工业网关**,把 CAN2.0A/B 报文封装成 TCP/UDP 报文,通过 4G 无线网络实现 CAN 总线远程监控、远程控制。四路 CAN 相互独立;以太网仅用于本地配置,不做业务数据传输;支持移动 / 联通 / 电信 4G 网络。

S2003120416的博客 160

【计算机网络】断点续传是怎么做到的:从 Range 请求到分片上传的完整机制

断点续传在下载侧靠的是 HTTP 现成的 Range 协议,Content-Range 保证偏移对得上,If-Range 防止文件变更导致的错误拼接;上传侧没有标准,需要自己设计 init/part/complete 三段式交互,核心是让服务端记住“哪些块已经收下”,从而把失败粒度从整个文件降到单个分片。 这套机制可以迁移到任何长耗时操作的设计上。判断方法很简单:先问失败粒度是多少。如果一次操作失败就得从头再来,那它迟早会在生产环境里出问题——传输、批量导入、数据迁移、长事务,都是同一个道理。把大操作切成

2503_94545876的博客 513

汽车电子标定与测量的核心基石XCP协议

控制逻辑(算法)与标定参数(数据)。如果每次优化参数都要修改源码、重新编译并刷写Flash,整个研发周期的效率将趋近于零。标定(Calibration)技术正是为了解决这一痛点而生。它允许工程师在ECU运行过程中,动态观察内部变量(测量,Measurement),并在不中断运行的前提下实时修改控制变量(标定,Calibration)。在这一领域,XCP(Universal Measurement and Calibration Protocol,通用测量与标定协议)是公认的行业标准与核心基石。

diansandaosilaodanan的博客 374

Linux 服务器性能排查手册(2026):CPU、内存、磁盘IO、网络四大瓶颈定位

iptables 四表五链模型、firewalld zone 信任级别、云安全组与主机防火墙的关系与优先级,避坑改了防火墙把自己挡在服务器外面的翻车事故。

2502_91473995的博客 287

【Linux网络】TCP 服务器并发处理多客户端:从 fork 分发到双重 fork 彻底消灭僵尸进程

拆解 TCP 服务器并发演进链:fork 分发连接、SIGCHLD 循环回收僵尸、双重 fork 交孙进程给 init 收养,并给出模型选型与线上排错对照。

2301_78967866的博客 414

SD-WAN 与传统企业组网方式有什么区别?六个维度分析技术差异与适用场景

SD-WAN 与传统组网区别,主要体现在网络管理模式、链路调度能力、可视化水平以及多站点扩展方式上。传统组网技术成熟、架构灵活,对于站点较少、业务简单、网络结构稳定的企业来说,仍然具有较高的实用价值。SD-WAN 则通过软件定义和集中化管理,为多站点网络管理、链路质量监测和业务流量调度提供了另一种技术实现方式。两者并不存在绝对的替代关系。在实际网络建设中,也可以根据不同业务和网络区域采用混合架构。

ESDWAN的博客 789

网口ps端--基础知识--调试(1)--deepseek

你现在卡住,是因为这每一层(硬件、驱动、lwIP 协议、IP 地址)中,只要有一层不对,网口就不通。物理层:看灯。灯亮说明线没问题,PHY 没死。MAC 驱动层:看串口打印。有没有打印出Link Speed?如果卡在自协商,说明你的 PHY 驱动还没配好。lwIP 协议层:如果底层通了,IP 也配对了,你调用udp_recv注册了回调函数,当电脑发来 UDP 包时,lwIP 会自动把数据包拆开,送到你的回调函数里。你之前一直在改,就是一直在死磕第 1 层和第 2 层。

AlibabaApple的博客 95

Windows syslog日志服务器搭建与模拟器对接

二 HCL 华三模拟器连接HOST直接让路由器接口UP。1.下载visualsyslog 日志服务器软件。4.7 日志服务器可以看到年份为2026年。2.2 华三路由器配置并执行日志服务器。2.4 华三路由器可以与日志服务器互通。3.2 日志服务器可以实时查看日志。3.4 日志服务器可以实时看到日志。4.6 路由器配置日志显示年份。五 日志服务器查看日志存放位置。4.5 日志服务器查看到日志。2.3 华三路由器接口UP。4.3 日志服务器清掉日志。路由器本地日志显示年份成功。4.在桌面生成快捷方式。

huainingning的博客 246
上一篇: LWN:block write在6.13中支持原子操作!
下一篇: LWN:可取消的BPF program!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值