LWN:提高 FUSE writeback 性能!

The FUSE BPF filesystem FUSEBPF是一种新型堆叠式文件系统框架,旨在提升FUSE(用户态文件系统)的性能。传统FUSE需要在用户态和内核态之间频繁切换,导致性能瓶颈。FUSEBPF通过在内核中使用BPF程序替代部分操作,大幅减少上下文切换。开发者Daniel Rosenberg在2023 Linux峰会上介绍,该方案允许BPF程序直接调用底层文件系统VFS,保留FUSE易用性的同时显著提升性能。目前该方案在Android中用于目录隐藏等场景,性能测试显示接近原生文件系统。开发团队正在解决凭据处理、操作码支持等遗留问题,并计划将 阅读详情

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

Improving FUSE writeback performance

By Jake Edge
May 6, 2025
LSFMM+BPF
Gemini-1.5-flash translation
https://lwn.net/Articles/1019522/

在 2025 年 Linux 存储、文件系统、内存管理和 BPF 峰会 (LSFMM+BPF) 上的一次文件系统 (filesystem) 和内存管理 (memory-management) 联合会议上,Joanne Koong 主持了一场关于改进用户空间文件系统 (Filesystem in Userspace - FUSE) 层回写 (writeback) 性能的讨论。回写 是将写入文件系统的数据实际刷写到磁盘 (disk) 的过程;它是将页缓存 (page cache) 中的脏页 (dirty pages) 写入存储介质的过程。当前的 FUSE 实现会分配不可移动内存 (unmovable memory),然后将脏数据复制到其中,再开始回写,这很慢;Koong 希望改变这种行为。会议结束后,她 发布了一组补丁集 (patch set),这组补丁集已被 FUSE 维护者 Miklos Szeredi 采纳。

Koong 首先描述了当前的 FUSE 回写操作。对于每个脏页,都会在不可移动内存区域 (unmovable memory zone) 中分配一个临时页 (page),并将数据复制到该临时页。之后,对这些临时页启动回写,而原始页的回写状态可以立即清除。额外的分配 (allocation) 和复制 (copying) 操作代价很高,但这是必需的,以确保在回写操作 (writeback operation) 进行期间,这些页不会移动。

她表示,基准测试 (benchmarks) 表明,在没有临时页的情况下,写操作 (writes) 的吞吐量 (throughput) 提高了约 45%。除此之外,消除复制简化了 FUSE 的内部机制 (internals)。目前有一个红黑树 (red-black tree) 用于跟踪临时页,该树可以被移除。这也使得 FUSE 转换为使用大 folio (large folios) 的过程更加清晰。

回溯到去年 11 月,她 发送了一个提议的解决方案 (proposed solution),该方案移除了临时页,这意味着回写状态 (writeback state) 不会再立即清除。为了避免死锁 (deadlocks),该补丁集添加了一个新的映射 (mapping) 标志 `AS_WRITEBACK_INDETERMINATE` ,文件系统可以在 inode (索引节点) 映射上设置该标志,表示回写可能需要不确定的时间才能完成;FUSE 将在其映射上设置此标志,这可以用于避免回写机制 (writeback machinery) 中的死锁。

Koong 说,该补丁集被拒绝了,主要是因为它可能允许有 bug (buggy) 或恶意的 (malicious) FUSE 服务通过不完成某些页的回写来无限期地阻碍迁移 (migration)。这会增加内存碎片 (memory fragmentation),并阻碍分配连续内存 (contiguous memory) 的尝试。分配临时页也会导致内存碎片,但这些页是在不可移动内存中创建的,其碎片化问题不如可移动内存 (movable memory) 那么严重。FUSE 的其他部分已经存在这个问题,包括预读 (readahead) 和直写 splicing (writethrough splicing)(使用 splice() ),但“我们不应该试图增加更多此类问题,而应该尽可能地消除它”。

讨论中提到了几种选项,但最有希望的想法——提供一种机制 (mechanism) 在需要迁移 (migrate) 页时取消回写 (cancel writeback)——行不通。她说,问题在于页可能已经被 spliced (spliced),对于这些页,回写是无法取消的。另一个可行的可能性是在可移动区域 (movable zone) 中划出一块专用区域,用于存放可能在不确定时间内不可移动的页。这将把碎片化的影响限制在该区域的内存范围。另外,对于行为不端的非特权 (unprivileged) FUSE 服务,如果它们不能及时完成回写或有太多页处于回写状态,可以直接杀死它们。

David Hildenbrand 表示,曾有一些讨论建议禁止非特权 FUSE 服务使用 splicing ;“你不够值得信赖,不能让你这么做”。这将允许取消回写,但 Koong 不确定这是否是正确的方向。随后是一些快速进行且难以跟上的讨论,涉及避免可能导致死锁 (deadlock) 的各种边缘情况 (edge cases)。

Omar Sandoval 询问了直接杀死那些行为不端的非特权服务 (unprivileged servers) 的可行性,就像有人建议的那样。Koong 说这是一个合理的解决方案,尽管可能不向后兼容 (backward compatible),因为现有的服务没有预料到这一点。但她认为,作为一种保护机制 (protection mechanism),类似措施应该早就实施了。

Sandoval 询问了合理的超时 (timeout) 值应该设定为多少。这需要权衡;“如果你是一个 FUSE 服务,午餐时间出去了 30 分钟,我不在乎你的向后兼容性,你已经破坏了一切”。Hildenbrand 说这是一个难以解决的问题;任何选择的超时值有时都会太大或太小。有时数据足够重要,可以接受长时间等待,但例如 30 秒可能已经太长,无法阻碍分配 (allocation)。

他希望能找到一种简单的方法来处理页可以被迁移 (migrated) 的常见情况,这可能意味着禁止使用 splice() 。他想知道这种禁止 (prohibition) 会带来什么影响 (implication)。Koong 说可以对 FUSE 服务进行审计 (audited),检查是否使用了 splice() ,并与开发者 (developers) 讨论这个问题。Josef Bacik 表示,当非特权服务请求使用 splice() 时,内核 (kernel) 可以简单地回退到执行内部复制 (copy)。

他接着说,问题的症结似乎在于处于回写状态的内存的不可移动特性 (unmovable nature);如果能找到一种新方法,在不进行复制的情况下使用可移动内存 (movable memory),那将是理想的。“我们喜欢 splice() ,因为它更快,但这听起来我们需要发明一种新的零拷贝机制 (zero-copy mechanism),使用可移动内存”。

Jeff Layton 说,能够以非特权用户 (unprivileged user) 身份挂载 (mount) FUSE 文件系统 (FUSE filesystems) 使其问题重重;任何普通用户都可以启动一个服务,占用大量内存且处理不当。这正是系统 (system) 需要防范的;采取“严厉措施”如杀死服务 (server) 并非不合理。他建议找到一种方法来保持与现有服务 (servers) 的兼容性 (compatibility),并为新服务提供零拷贝机制 (zero-copy mechanism);在他看来,重写一些老的 FUSE 服务以利用新特性 (features) 并非不可能。Koong 表示同意,但她说这方面应该如何做由 Szeredi 决定;她不清楚他的想法是什么。

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

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

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

三种不同实现ublk的零拷贝I/O的方法 接收Fused命令的子系统必须对它有特殊的支持,具体来说,它必须能够找到slave命令的内核空间缓冲区,并在slave执行之前调用新函数 io_fused_cmd_provide_kbuf() 建立连接,这是对 io_uring 子系统的相当大的更改,并且还不完全清楚任何其他子系统是否能够利用它。不过,最大的价值可能来自于这样一个事实,即 BPF 程序可以访问内核提供的缓冲区,并可以直接将它们用于满足每个请求所需的任何 I/O,从而消除该数据的副本。块驱动程序可以移动相当多的数据,因此极大的避免复制。 阅读详情

相关推荐

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

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

weixin_49199313的博客 276

fs/fuse__fuse IO模式与文件元数据一致性问题

fuse用户态文件系统在不同的IO模式下性能差距较大,如何选择合适的IO模式,是一个重要的问题。

AlexanderGan的博客 1820

在macOS上使用GitHub的超详细指南

GitHub:免费的远程仓库,可用来托管自己的开源项目。它利用了Git强大的克隆和分支功能,让我们参与别人的开源项目和让别人参与自己的开源项目变得简单高效。

Mars的博客 3391

eBPF的发展演进---从石器时代到成为神(四)

一般认为,C语言是图灵完备的。这需要我们及早确定问题边界,提供面向问题的运行环境,才能更有效的提出平衡安全和可计算性的问题的方案,即:运行环境+必要的计算能力,构成完备的面向问题域的解决方案。定义一个安全的虚拟机,保证操作不逃逸,一个安全的运行时库,导出或者链接内核对象(Helper),在这个集合上,定义安全的操作,这样语言本身就可以不再受具体逻辑和访问对象的限制,做到语言本身的图灵完备。从另一个角度,就BPF目前的应用领域来说,输入是有限的、状态空间是有限的,因此在有限的输入下,图灵完备并不是必须。

统信软件的博客 912

3.1使用Python读取excel的二维数据

要使用 Python 读取 Excel 的二维数据,可以使用 openpyxl 或 pandas 库。

kenshin1980的专栏 1032

基于IMU的纯惯性导航轨迹绘制实践与优化

本文深入探讨了基于IMU的纯惯性导航轨迹绘制实践。通过修改开源组合导航算法KF-GINS,屏蔽GPS更新并简化地球参数,实现了仅依赖IMU数据的轨迹解算。文章详细介绍了代码改造、轨迹可视化方法,并分析了误差累积的根本原因,为深入理解惯性导航原理与传感器融合的必要性提供了宝贵的实践经验。

ff678的博客 395

LWN:分层存储管理,fanotify, FUSE 等等!

关注了就能看到更多这么棒的文章哦~Hierarchical storage management, fanotify, FUSE, and moreBy Jake EdgeJuly 16, 2024LSFMM+BPFGemini-1.5-flash translationhttps://lwn.net/Articles/981392/Amir Goldstein 在 2024 年的Linux 存...

Linux News搬运工 2978

【AI Infra】Perfetto性能分析工具指南

Perfetto是一款开源性能分析工具,提供系统级和应用级的活动数据追踪功能。其界面分为四个区域:左侧操作区(包含Trace查看、SQL查询、预置分析等功能)、上方信息区、中间图形化展示区以及下方详细信息区。工具支持快捷键操作(w/s缩放、a/d移动、m标记等),并能高效处理大体积Trace文件。通过Timeline分析可发现性能瓶颈,如案例中update_actor耗时过高的问题,最终定位到CPU offloading导致的MemcpyH2D操作耗时过长,提出了优化方案。Perfetto相比Systrac

baiweizeng的博客 1506

Kernel源码笔记之文件系统:2. fuse——打开文件

fuse打开文件的流程

苟浩的博客 876

ASPICE标准快速掌握「总目录」

欢迎大家来到雪云飞星的《ASPICE标准快速掌握》,开始前博主先列出本专栏学习的大纲,同时这也可以作为大家学习ASPICE协议知识点的参考。本专栏可以帮助大家快速掌握如何在项目中使用ASPICE,ASPICE的学习通常仅需要半天时间左右,掌握方法后完全就可以结合快查表来指导具体项目的质量提升了。

雪云飞星的博客 3008

【YOLOv10改进[Backbone]】使用ADNet改进YOLOv10在噪声干扰下的目标检测效果(图像去噪)+ 含全部代码和详细修改方式 + 手撕结构图 + 全网首发

使用ADNet改进YOLOv10在噪声干扰下的目标检测效果(图像去噪)+ 含全部代码和详细修改方式 + 手撕结构图 + 全网首发 + 遥遥领先

静谧、淡雅 2857

FUSE 内核实现代码分析(二) 队列管理

fuse处理的请求和操作非常多,代码里有相当多的函数,如果采用从外到内

sunedy的专栏 2368

4.4 线上vs离线:使用 Langfuse 实现智能体的全方位无死角评估

本文介绍了如何利用Langfuse工具实现AI智能体的全方位评估,包括线上和离线两种评估方式。线上评估通过收集用户实时反馈(如点赞/点踩)来监控真实表现,而离线评估则通过创建标准化数据集进行批量测试和自动评分。文章详细演示了如何为"旅小智"AI应用添加反馈功能、创建评估数据集,并利用Langfuse SDK进行自动化评估和分析。通过这两种评估方式的结合,开发者可以建立数据驱动的AI质量保障体系,实现持续优化和版本迭代。

yonggeit的博客 3311

LWN:替换 congestion_wait()!

关注了就能看到更多这么棒的文章哦~Replacing congestion_wait()By Jonathan CorbetOctober 25, 2021DeepL assisted t...

Linux News搬运工 460

【PCIe 总线及设备入门学习专栏 3.2.2 -- PCIe 中什么是 SR-IOV】

SR-IOV(Single Root I/O Virtualization)是 PCIe 规范中的一种技术,允许物理 PCIe 设备(称为 Physical Function, PF)虚拟化为多个虚拟设备(称为 Virtual Functions, VFs),使多个操作系统或虚拟机能够共享同一个物理设备。SR-IOV:一种 PCIe 虚拟化技术,允许将一个物理 PCIe 设备虚拟化为多个虚拟设备。:物理设备的主要管理接口。:PF 的轻量级副本,分配给虚拟机或操作系统。

CodingCos的博客 1513

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...

FUSE 的 writeback cache

但是,在实际生产中,我们发现 writeback cache 特性作用非常有限,原因是走 writecache 的写操作触发了内核 balance dirty page 的流程,使得本应该是响应时间非常短的写操作仍然会等较长时间才返回,这个问题在小的写入时尤其明显。FUSE 的解决方案是 writeback cache,即小写入写到缓存页即返回,由内核根据回刷策略推送至后端存储。FUSE 默认的写流程走的是 directIO 接口,使得每次写入长度较小时会有性能问题,因为每次的写请求都会被推送至后端存储。

大隐隐于野 598

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

LWN:FUSE 改用 folio 页集时出现的困扰!

关注了就能看到更多这么棒的文章哦~FUSE folio conversion confusionBy Daroc AldenFebruary 18, 2025Gemini-1.5-flash translationhttps://lwn.net/Articles/1008714/内核开发者们一直在努力将各种内部接口转换为使用folios(页集);虽然这个过程一直在进行,但由此引入的回归(regr...

Linux News搬运工 959

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

LWN: 利用eBPF实现的文件系统沙盒

Filesystem sandboxing with eBPFByJake EdgeNovember 6, 2019OSS EU原文来源:https://lwn.net...

Linux News搬运工 1589

LWN:2022 Linux存储、文件系统、内存管理以及BPF峰会!

关注了就能看到更多这么棒的文章哦~The 2022 Linux Storage, Filesystem, Memory-Management, and BPF SummitBy Jonathan CorbetMay 4, 2022DeepL assisted translationhttps://lwn.net/Articles/893733/Linux Storage,...

Linux News搬运工 737

FUSE文件系统

Fuse(filesystem in userspace),是一个用户空间的文件系统。通过fuse内核模块的支持,开发者只需要根据fuse提供的接口实现具体的文件操作就可以实现一个文件系...

内核工匠 1万+

中fuse_用户态文件系统框架FUSE的介绍及示例

了解Linux文件系统的同学都清楚,Linux的文件系统都是在内核态开发的。内核态开发最大的问题是涉及的内容比价多,调试不太方便。因此,很多应用都不太原因涉及内核态的开发。而fuse解决了文件系统必须在内核态的的难题。 它将文件系统的实现从内核态搬到了用户态,也就是我们可以在用户态实现一个文件系统。fuse有很多应用,比如与对象存储(例如S3等)结合,可以实现通过普通目录访问云对象存储的方式,简化...

weixin_39669769的博客 836

深入分析QEMU cache——虚拟机迁移需要注意writeback方式会造成数据丢失。

Cache 的一些基本概念 Cache 最先指的是高速缓存, 用于平衡 CPU 和内存之间的速度, 后来, 进一步发展为 一种技术, 用在速度相差较大的两种硬件之间, 用于协调两者数据传输速度差异的结构. 本文主要指的是协调内存和硬盘速度的 Cache. 在 Cache 和他的后端存储的数据同步一般有以下几种方式: Write through: 数据一旦在 Cache

Altynai0514的专栏 4814

linux中怎么看挂载文件系统,Linux中查看已挂载的文件系统类型的示例

Linux中查看已挂载的文件系统类型的示例发布时间:2021-02-10 13:23:31来源:亿速云阅读:99作者:小新栏目:服务器这篇文章将为大家详细讲解有关Linux中查看已挂载的文件系统类型的示例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在 Linux 中查看已挂载的文件系统类型有很多种方法可以在 Linux 中查看已挂载的文件系统类型,下面我将给出...

weixin_26803527的博客 818

BPF学习笔记(三)--BPF示例程序

上一篇文章中BPF的例子是以BCC的整体框架为基础,本篇介绍一下基于libbpf库函数为基础,结合内核中的bpf的sample为基础编写一个BPF的程序,本篇介绍是以《linux-observability-with-bpf》这本书第二章的例子为基础,由于内核版本的不同,本篇介绍是以Linux5.16内核为基础,Linux5.16内核中的接口函数与书中的给到的程序案例有较大的差别。2)随着bpf和内核版本的不断变化,参考本文时需要重点关注不同的内核版本、bpftool、gcc等各类工具的版本。

frankzfz的专栏 2967

read()/write()的生命旅程之四——第四章:writeback

第三章write()中已经提到要写的page加到了writeback queue后将有writeback thread将其真正写到block device上,而不是每一次写都直接写到media上。如果要绕过writeback机制直接写到media上,在open()的时候指定O_DIRECT即可。Writeback机制的好处总结起来主要是两点: 加快write()的响应速度。因为media的读

华的专栏 2577
上一篇: LWN:suspend 时冻结文件系统!
下一篇: LWN:FDP——更加自由的数据放置!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值