Linux 7.0 这波优化让你的 U 盘和 SD 卡快了 12.5%
在这个时间点,Linux 7.0 的合并窗口正进行得如火如荼。每天都有大量的代码涌入内核主线,而我今天要聊的,是一个看起来不起眼,但实际上会让很多普通用户受益的改动——exFAT 文件系统的性能优化。
说到 exFAT,大家肯定不陌生。你买的 U 盘、相机的 SD 卡,甚至 Steam Deck 的扩展存储,默认格式化通常都是 exFAT。
微软当年搞这个文件系统,主打的就是一个兼容性和简单,专门为了闪存介质设计。但也正是因为简单,它在 Linux 上的性能表现一直算不上顶尖,尤其是和 ext4 或者 xfs 这种原生文件系统相比。
不过,在即将到来的 Linux 7.0 内核中,exFAT 的顺序读取性能将迎来一次实打实的提升。
这次优化的核心在于引入了“多簇(Multi-Cluster)支持”。
为了让非技术背景的朋友也能听懂,我们得先简单聊聊之前的机制。在 Linux 7.0 之前,当你从 exFAT 格式的 U 盘里拷贝一个大文件时,内核驱动是比较老实的。
它往往是一个簇一个簇地去读取数据。虽然计算机处理速度很快,但这种“读一个、确认一个、再读下一个”的串行逻辑,在处理大量连续数据时,并不是最高效的。
这就好比你去超市买一箱可乐,如果一瓶一瓶地拿去收银台结账,效率肯定低;如果直接整箱搬过去扫码,速度自然就快了。
这次 Linux 7.0 的补丁,就是教内核学会了“整箱搬”。
新的补丁允许驱动程序在读取时进行多簇映射。具体来说,代码中引入了一个新的计数参数,让调用者可以一次性指定需要读取的簇的数量。
这听起来只是代码逻辑的一点小改动,但效果非常直观。通过减少 get_block 的调用次数,CPU 的开销降低了,I/O 的吞吐量上去了。
特别是在通过 sb_bread() 读取连续的 FAT 表项时,通过缓存缓冲头(buffer heads),极大地减少了底层调用的次数。
咱们用数据说话。
根据开发者 Chi Zhiling(来自国产操作系统麒麟 OS 团队)提供的测试数据,在 512 字节簇大小的场景下,读取性能从原来的 454 MB/s 提升到了 511 MB/s。
简单的数学计算告诉我们,这大约是 12.5% 的提升。
你可能会觉得 12.5% 听起来不算多,但在存储 I/O 领域,不需要升级硬件,纯粹靠改几行代码就能白捡 12.5% 的性能,这绝对属于“巨大”的胜利。
特别是对于那些使用低端 SD 卡或者老旧 U 盘的用户来说,这种顺序读取速度的提升,意味着你在拷贝照片、视频素材时,进度条跑完的时间会实实在在地缩短。
除了速度变快,这个补丁还优化了错误代码的处理逻辑,让文件系统在遇到问题时能反应得更准确。
值得一提的是,这次贡献代码的开发者 Chi Zhiling 来自麒麟 OS。看到国内的开发者在 Linux 内核核心文件系统层面的活跃贡献,确实是一件让人高兴的事情。
目前,这项改动已经并入 Linux 7.0 的代码库。这意味着,等到 Linux 7.0 正式发布并推送到各大发行版之后,你手里的 Fedora、Arch Linux,甚至是未来的 SteamOS 更新后,你插上 U 盘的那一刻,它就已经比以前更快了。
技术进步有时候就是这样,它不一定非得是惊天动地的新功能,往往就是这种在底层默默抠出来的 12.5%,日积月累,构成了我们越来越流畅的数字体验。
我已经迫不及待想在我的测试机上编译这个新内核,看看在实际的大文件拷贝中,能不能实现速度增益了。
信息来源:
- • https://lore.kernel.org/lkml/CAKYAXd-GBqxgaaFDMg_1Qz2Qa9VAbyuiZxs=HYtoP7OHh4zRFg@mail.gmail.com/