5 分钟可以干什么?
一位 Linux 开发者表示,5 分钟可以开发两个补丁,给所有 Linux 用户带来 6% 的 I/O 性能提升。
缓存算法优化
Jens Axboe 是 IO_uring(用于存储设备异步 I/O 操作的 Linux 内核系统调用接口)的创建者和 Linux 块子系统维护者,近日他着手对缓存算法进行了一些更改,并在 Twitter 上第一时间向外界分享了最新成果,并表示,「多年来我一直在想的事情,今天终于做到了。这有点令人难过,因为这实际上是一个 5 分钟的工作,却最终带来了超过 6% 的改进。在完整的发行版风格内核配置上效果可能会更大。」
具体来看,Jens Axboe 的补丁似乎通过减少对 I/O 系统的查询次数来实现性能提升。
echo 1 > /sys/block/$DEV/queue/iostatsecho 2 > /sys/block/$DEV/queue/nomerges
由于默认情况下时间查询的性能开销较大,他在测试时通常会禁用 iostats。倘若不禁用 iostats,将损失大约 12% 的性能。
Jens Axboe 解释说:
查询当前时间是块层中每次 IO 成本最高的操作,而且根据内核配置设置,每次 IO 可能要做很多次。
实际上,没有一个调用者需要 nsec 的粒度。利用这一点,我们可以在插件中缓存当前时间,并假设任何时间检查在时间上都足够接近,因此精度上的轻微损失并不重要。
如果区块插件被刷新,例如在抢占或计划结束时,我们就会使缓存的时钟失效。
Axboe 最新开发的补丁其实非常简单,“只是将当前时间缓存在 struct blk_plug 结构中,前提是任何问题侧的时间查询都可以通过它获得足够的粒度。”
在 Axboe 的测试中,他发现在为问题侧时间查询提供一些基本缓存时, IOPS(用于电脑存储设备性能测试的量测方式)读数在打补丁前后的比较中提高了 6%。有趣的是,异步 I/O 接口开发人员暗示,Linux 用户在现实世界中可能会看到更大的收益。
「编码五分钟,调试 2 小时」
而对于 Jens Axboe 分享的“有点令人难过的是,这实际上是一个 5 分钟的工作”观点,也引发了不少开发者对「编码五分钟,调试 2 小时」的共鸣。
HN 上的一位 jl6 网友表示:
我想起了一个水管工被叫去修理漏水的故事。他更换了一个洗衣机零件并收取了 100 美元的费用。客户愤怒了:“那个洗衣机的零件才值一美元!”
水管工回答:“当然可以。我向您收取 1 美元的洗衣机零件费用,以及 99 美元的安装位置费用。”
也有不少用户表示:
5 分钟解决问题背后实则也可能花了很长时间,大家都知道编程中最困难的两件事之一是缓存失效。
我猜他在 I/O 子系统中的 5 分钟工作对于普通软件开发人员来说更像是 5 年。
不过,Jens Axboe 分享的 RFC 补丁很有可能在今年晚些时候与 Linux 6.9 一起用于上游。无论何时推出,免费获得额外性能对于 Linux 用户而言都是一件好事。
来源:
https://www.phoronix.com/news/Linux-Caching-Time-Block-IO
https://news.ycombinator.com/item?id=39016337