LWN:关闭文件系统extent的一个优化!

linux c用open打开(创建)一个文件 1、文件描述符 Linux操作系统内核(kernel)利用文件描述符来访问文件,文件描述符大于等于0,是一个用户描述被打开文件的索引值,它指向该文件的相关信息记录表,当文件打开或者创建新文件的时,就会返回一个文件描述符,当读写文件时,也需要使用文件描述符来指定特写文件。 2、讲解open函数 文件需要先打开或则创建 如果返回是-1, 则出错,如果成功,则返回文件描述符 第一个 阅读详情

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

Disabling an extent optimization

By Jake Edge
June 21, 2022
LSFMM
DeepL assisted translation
https://lwn.net/Articles/898029/

在 2022 年 Linux 存储、文件系统、内存管理和 BPF 峰会(LSFMM)的最后一场文件系统会议上,David Howells 主持讨论了文件系统中一个当前引出了一些问题的优化。那些 Extent-based 文件系统中包含了一些有时不能反映文件中存在的空洞(hole)的数据结构。如果对稀疏文件(sparse file, 也就是有空洞的文件)的空洞区域中进行 read 时,返回的数据必须是零,但除此之外,文件系统并没有责任去真正意识到这里是有个空洞的,这就导致了下面要讲述的问题。

Howells 首先介绍了一下这个问题,他第一次遇到的是在使用 FS-Cache 来缓存文件内容的时候,但他后来发现这个问题实际上是个更普遍的问题。如果某个 extent-based 文件系统(如 Ext4、XFS 和 Linux 的 Btrfs)上有一个文件,在两个 extent 之间有一个小空缺时,文件系统有时就会把两个 extent 合并起来,并且用 0 来填补空缺区域。这样做的目的是为了减少文件的 extent list 数量,尽管这样做会增加磁盘上的存储空间的占用量。同时也会有一些相反的情况发生,如果文件系统看到文件中有一个文件中有很多 block 都是全 0 的时候,它可以通过创建成两个 extent 把中间作为空洞,从而节省磁盘空间,不过这一点这对 Howells 来说似乎不是一个问题。

2aa95ad92f4707a70476c69ac4829a1c.png

[David Howells]

困难在于,由于 extent list 可以随时改变,因此各种操作如 lseek() 用 SEEK_HOLE 和 SEEK_DATA 来寻找空洞区域的话,都会出现假阳性或者假阴性的结果。FS-Cache 是用本地缓存文件中的空洞来代表尚未从服务器上获取的数据的,所以不应该直接想当然地填充这部分区域。如果加密不是在文件系统内进行的,那么这种 merging 和 filling 操作也会对带有空洞的文件的内容的加密操作造成负面影响。他说,当内容加密是单独进行的时候,加密文件中的空洞主要是为了表明明文文件中包含 0,而不是加密文件里面包含 0;所以在加密文件中填入很多 0 的话会破坏这个文件。

对于 ext4 上的 fscrypt,他认为是没有问题的,因为它是在 ext4 内完成加密的,ext4 不允许在加密文件中出现空洞;ext4 会用适当的加密内容来填补这些空洞。Ted Ts'o 证实了这一点。Howells 希望能够对任何文件系统的内容都支持加密,但不需要浪费磁盘空间来加密明文文件中的空洞。他想知道是不是应该允许其他用例来对底层文件系统提出要求不要进行这些优化。

Ts'o 说,这个问题的核心是一个哲学问题。一些文件系统把稀疏文件当作简单的优化,他们不管这里是否有空洞,只保证说这些空洞中会返回 0。但是,FS-Cache 把这些空洞事实上作为一个数据通道(data channel)来使用了;它需要确保那些它专门放在文件中的空洞需要一直保持空洞状态。如果用户空间期望 SEEK_HOLE 和 SEEK_DATA 也是按这种方式工作的话,就可能跟文件系统的看法不一致了,毕竟文件系统认为空洞只是一种优化,他说。

几位与会者整理了一下当前的情况,其中 Btrfs 不会做这种 "optimistic filling",也就是说不会把这些小空隙填充掉从而不再当作一个空洞,所以这个问题只存在于 ext4 和 XFS 中。不过,这里的终极问题是文件系统是否有义务维护稀疏文件以及磁盘上全 0 的 block 的文件之间的语义差异,Ts'o 说。他介绍说最初的理由是,比如说有一个 32KB 的空洞,那么在磁盘里直接写入 32KB 的 0 数据,比起使用两个 extent 所必需的 seeking 以及 extent-tree 的操作要更快。

一位远程参与者指出,欧洲原子核研究中心(CERN)几年前就因为这种行为而对 AFS 报告了一些 bug。CERN 当时正在使用一个大小为 2PB 的稀疏文件,并期望其中的空洞要能够一直保持。后来其中一个 12 字节的空洞消失了,从而破坏了整个文件。AFS 的开发者解释说,CERN 所依靠的是一个文件系统无法保证的行为,但这是一个与加密(或缓存)无关的例子,表明用户确实有可能希望能禁用 hole filling 动作。

Josef Bacik 建议说可以提供一个 per-file 的 flag 来禁用这个优化。Ts'o 说,Ext4 有一个文件系统范围的解决方法,就是使用一个可调整的参数来设置文件系统中会被填充的 hole 的最大 size。默认是 8 个文件系统 block,但将其设置为 0 就可以禁用该功能。他认为 per-file flag 确实更加好;他不介意替没能参加 LSFMM 的 XFS 的开发人员来提供意见,不过毕竟无法代表他们。然而,如果受影响的文件系统都达成一致应该如何设置这个 flag,那就是最好的方案了。

Bacik 说他想在 Btrfs 中加入这个优化,所以也想实现禁用此优化的机制。Chris Mason 说他不确定这些 "bridgeable(意思就是填充两个区域之间的空隙)" 的空洞出现得有多频繁,但对于 Btrfs 来说,创建一个 4KB 的 hole 绝对是得不偿失的。Ts'o 说,在 ext4 中填补小空隙的最初需求是来自 libbfd,它会创建有很多空隙的文件,然后最终用真正的数据填补这些空隙;不这样做的话会影响 "一些愚蠢的性能测试场景,比如说内核编译就是一个例子"。

Amir Goldstein 说,XFS 已经有了一个类似的 API,但跟人们想要的并不完全相同,也许它可以被扩展一下来满足这个需求。远程接入会议的 Jan Kara 说,那个 API 是基于 ioctl()的,主要目的之一是用来设置 project ID,并且跟 ext4 公用。这个 API 可以扩展一下来设置一个 inode flag,存放在 inode 里的 chattr flags 中,禁用这个 hole filling 行为,只要那里还有可用空间的话。Bacik 说,他认为还是有空间的,Howells 也同意,因此这似乎会是今后的实现方向了。

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

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

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

format,png

Ambari 3.0+BigTop 3.3集群部署实战 Ambari 3.0+BigTop 3.3集群部署 阅读详情

相关推荐

【扫地机器人测试】

本测试方案旨在系统性评估扫地机器人的核心功能、性能指标、可靠性及用户体验,验证产品是否符合设计规范、行业标准及市场需求。通过多维度、全场景的测试,精准定位产品缺陷与优化空间,为产品迭代提供数据支撑,确保上市产品的质量稳定性与用户满意度。

xuhuaiyaun的博客 1371

【操作系统复习】文件系统:磁盘空间分配

磁盘空间分配分为三种策略:连续分配(Continuous allocation)、链接分配(Linked allocation)、索引分配(Indexed allocation)每个文件在磁盘上占据一组连续的块。简单,只需要起始位置(块号)和长度(块数)的信息。支持随机访问。在这种情况下,访问任何块都只需要1次物理读取,因为块是连续存储的。浪费空间(动态存储分配问题),因为文件需要连续的空间。文件不能动态增长。基于Extent的文件系统是许多较新的文件系统所采用的一种修改后的连续分配方案。

weixin_63160898的博客 1336

jason-2卫星介绍及其数据下载

两台仪器发射脉冲宽度均为105.6μs,带宽320MHz(C频段)和320/100MHz(Ku频段),脉冲重复频率1800Hz(Ku频段)和300Hz(C频段),功率78W,数据传输速率22.5kbit/s。共发射了3颗卫星(Jason - 1/2/3),星上有效载荷均主要为雷达高度计和微波辐射计。Jason - 1卫星主要有效载荷为波塞冬 - 2和“贾森微波辐射计”,Jason - 2卫星进行了改进,主要携带了波塞冬 - 3和先进微波辐射计,此外,Jason - 2卫星还携带了“多里斯”系统。

beautyaaaa的博客 1605

第11章 文件系统实现

文件结构逻辑存储单元收集相关信息“文件系统”组织成层文件系统驻留在辅助存储器(磁盘)上通过便于存储,检索,提供高效和方便的磁盘访问文件系统是操作系统中以文件方式管理计算机软件资源的软件和被管理的文件和数据结构(如目录和索引表等)的集合。File control block(文件控制块)-由有关文件的信息(属性)组成的存储结构Device driver(设备驱动)控制着物理设备。

weixin_53254469的博客 533

Unity3d实现红外热成像效果

1.将需要在红外图像中高亮的物体设置到图层PostProcessing。 2.新建一个相机CameraHighLight,设置其Culling Mask为PostProcessing,也就是在这个相机中只有PostProcessing图层的物体可见。 3.新建一个RenderTexture,命名为HightLightRt,将CameraHighLight的Target Texture设HightLightRt。 4.新建一个相机Camera2,这个相机用于显示其他物体。 接下来将CameraHigh

zouxin_88的专栏 8327

Arduino--土壤湿度传感器使用(电阻式)

最近买了一个土壤湿度检测传感器,实物图是这样的: 我买这个模块是想要得到土壤湿度的模拟量。但我买的时候忘了买左边的蓝色模块,我开始以为这个模块是有运放功能的,但实际它是一个电压比较器和一个分压电路。 其模块的接线如图: 该模块的四线是带模拟量输出的,三线的只输出一个到达阈值的标志量。该模块的原理图如下: 该模块的测试原理为:把土壤当成一个可变电阻,随着土壤含水量的增加,土壤电阻减小。而该传感器其实就是两个电极,用来接土壤这个可变电阻。一般湿度的土壤电阻大概在几百K左右,其串连的分压电阻应该在这个数量级。

weixin_41866783的博客 1万+

文件lseek操作产生空洞文件的方法

在文件操作过程中,lseek操作可以偏移到文件的任意位置。 在UNIX文件操作中,文件位移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将延长该文件,并在文件中构成一个空洞,这一点是允许的。位于文件中但没有写过的字节都被设为 0。 如果 offset 比文件的当前长度更大,下一个写操作就会把文件“撑大(extend)”。这就是所谓的...

weixin_34261739的博客 1087

AI大模型实战——模型测评:如何评估大模型的表现

大模型评测体系解析:从数据集到基准测试 本文系统梳理了大模型评测的关键要素。在数据集方面,重点介绍了C-Eval等中文评估套件,强调数据质量需通过人工验证保证。评测维度涵盖自然语言理解、知识推理、代码生成等核心能力。基准测试作为标准化评估方法,Glue、SuperClue等平台提供了公平比较的依据。文章指出厂商自评榜单存在水分问题,建议关注第三方评测。同时解析了少样本和零样本两种prompt模式的应用场景差异。最后解释了"SOTA"这一术语在描述模型最优性能时的应用价值。整体呈现了大模型

小志的博客 895

rd_kafka_seek_SEEK_HOLE和SEEK_DATA:有效地存档/复制大型稀疏文件

rd_kafka_seekHow to efficiently archive a very large sparse file, say 1TB? The sparse file may contains a small amount of data, say 32MB. 如何有效地归档非常大的稀疏文件(例如1TB)? 稀疏文件可能包含少量数据,例如32MB。 SEEK_HOLE和SEEK...

cuma2369的博客 1137

ZYNQ Petalinux编译系统启动文件实战指南

本文提出的混合编译加速方案实测可将编译时间从45分钟缩短至18分钟,QSPI双启动方案已在工业控制领域成功应用。Xilinx官方UG1144文档(最新v2023.1版)正点原子《ZYNQ嵌入式开发实战》开源项目Meta-Petalinux(GitHub趋势项目)未来展望:随着Versal平台的普及,Petalinux将支持更多AI加速器原生驱动,值得持续关注。

QQ_778132974的博客 811

6、基于深度强化学习的无人机路径规划

本文介绍了一种结合人工势场法的改进DQN深度强化学习算法在无人机路径规划中的应用。通过设计合理的网络结构、状态空间、动作空间和融合引力-斥力机制的奖励函数,实现了无人机在复杂环境中的自主避障与目标导向飞行。采用轻量级神经网络提升实时性,并在Gazebo仿真环境中进行训练与测试,结果表明该算法具有快速收敛、高成功率和良好适应性。实验评估指标包括损失函数、最大Q值和任务成功率,验证了方法的有效性。文章还探讨了其在物流配送、农业植保和环境监测等领域的应用前景,并展望了多无人机协同与复杂环境适应性等未来研究方向。

html8的博客 238

Linux man page学习之lseek

title: Linux man page学习之lseek date: 2020-07-29 13:44:00 categories: Linux知识 index_img: /img/articles/vim.jpg tags: - Linux - lseek 本文简介了类UNIX系统下(主要为Linux)的lseek相关函数的内容。 函数原型 #include <sys/types.h> #include <unistd.h> off_t lseek(int fd, off_.

Jamza的博客 736

基于MATLAB编程的LSTM的时间序列预测

时间序列预测,回归分析,LSTM详细原理

abc991835105的博客 358

Spring AI + GPT-5.5 + Ollama 配置教程:Base URL、超时与流式调用

由于不同 Spring AI、Spring Boot 小版本之间仍可能存在差异,创建项目时应检查 Spring Initializr、Spring AI BOM 和官方兼容矩阵,不要直接复制旧教程中的 Starter 名称和版本号。多人项目最好隔离不同客户端,并在脱敏前提下记录最终 URL、状态码、请求耗时、请求 ID 和模型 ID。Spring AI 接入模型 API,至少要同时确认 Starter、Base URL、请求路径、API Key、模型 ID、连接超时、读取超时和流式客户端这 8 项。

2601_95893075的博客 222

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

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

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 328

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【JVM】对象内存布局

HotSpot JVM 中,Java 对象内存布局由对象头(12字节,含Mark Word与压缩Klass Pointer)、实例数据及对齐填充构成,总大小为8字节倍数。对象头支持锁状态动态复用,指针压缩使引用仅4字节,但堆超32GB时失效。实例字段按类型优先级重排序以减少间隙,最小对象大小为16字节。通过JOL工具可精准验证布局,理解锁机制、GC、伪共享等底层行为。

2301_79732484的博客 149

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 115

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 194

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 364

Decorator

TaskDecorator 是异步场景下"跨线程传递上下文"的标准方案,主要用于传递 MDC、用户信息、数据源路由等上下文数据,核心价值是让异步任务的日志链路不中断、业务上下文不丢失。TaskDecorator 是 Spring 提供的一个钩子接口,用于在异步任务执行前对 Runnable 进行包装,常用于跨线程传递上下文。如果你在项目中遇到具体的异步上下文传递问题,可以把代码贴出来,我帮你给出最合适的 Decorator 方案 👍。✅ 核心能力:在线程切换时,把"父线程的上下文"搬到"子线程"

wlwork66的博客 102

JDK 下载安装:装完 Java 提示「不是内部或外部命令」?环境变量没配

JDK 是写 Java 程序必须装的东西。它包含运行 Java 的虚拟机(JRE)和编译 Java 的编译器(javac)——装了它,能跑、.java文件能编译成可执行程序。免费,学习和小规模生产都不花钱。

科小怪的博客 625

数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南

Oracle 提供了ORA_ROWSCN伪列(System Change Number),记录最后修改行的 SCN,类似 PostgreSQL 的xmin。实践中通常仍使用 version 字段方案,逻辑与 MySQL 完全相同。-- Oracle:通过 ORA_ROWSCN 实现乐观锁-- 更新时比对 SCN// 自定义注解// AOP 切面@Aspect@Component@Slf4jtry {

yjc_1111的专栏 396

C++ 多态详解:作用、原理与实战用法

多态是C++面向对象的核心特性,通过虚函数实现运行期动态绑定,使同一接口在不同对象上表现出不同行为。其核心作用包括统一接口、提升可扩展性、降低耦合、支持运行时分派与批量处理。实现依赖虚函数表(vtable)和虚指针(vptr),需注意虚析构函数、对象切片等陷阱。相比编译期多态(模板),运行期多态灵活性高但有调用开销。合理结合两者,可兼顾代码的灵活性与性能,是构建可扩展、低耦合系统的关键。

2402_85743155的博客 376

java框架大全

java框架大全

qq_39326137的博客 183

Java 多态 学习笔记

多态是面向对象编程的重要特性,指同一操作作用于不同对象时产生不同行为。其核心在于“父类引用指向子类对象”,结合方法重写实现运行时动态绑定。多态使代码更灵活、可扩展,如用Person p = new Student();统一处理各类人员注册,无需修改调用逻辑。但多态无法直接调用子类特有方法,需通过instanceof判断并强制转换。编译时看左边(类型),运行时看右边(实际对象),实现解耦与维护便利。

AA_AA114514的博客 349

SecureRandom做随机源,这个Java随机字符串工具类有3个方法

本文分享一款JDK17环境下的Java随机字符串工具类,内置3个开箱即用的方法,全部采用SecureRandom加密安全随机源,不存在弱随机、可预测、取模偏差等问题。工具类支持默认62字符集随机串、纯数字随机串、自定义字符集随机串三种生成模式,支持Unicode码点级别的字符集处理,兼容Emoji等增补字符,边界处理严格,异常信息明确,适合验证码、邀请码、盐值、随机口令、短链码等场景,源码可直接复制使用。

Java后端 | AI智能体应用实战派 | 电脑技能行家 294
上一篇: LWN大作:NFS 的早期时代!
下一篇: LWN: Fedora, FFmpeg, Firefox, Flatpak, Fusion!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值