Linux I/O 专家和 Meta 的块/IO_uring维护者 Jens Axboe 最近重新审视了他关于未缓存缓冲 I/O 的补丁。早在 2019 年,Axboe 就开始了“RWF_UNCACHED”工作,以解决页面缓存填满后性能吞吐量悬崖的问题。这项工作逐渐消失,但 Axboe 最近开始制作一组新的补丁来实现未缓存的缓冲 I/O,并且它们显示出非常有希望的结果。
Jens Axboe 今天在 Twitter/X 上发布了他在 2024 年为 Linux 开发非缓存缓冲 I/O 的工作:
“未缓存缓冲 IO 在中断 5 年后又回来了。现在更简单、更简洁。提升高达 65-75%,而我系统的 CPU 使用率只有一半。而且没有关于页面缓存的不可预测性的废话。
这些新补丁目前驻留在他的 buffered-uncached.2 Git 分支中。在添加 RWF_UNCACHED 标志的补丁中,他解释说:
“将 RWF_UNCACHED 添加为读取操作标志,这意味着在完成后,读取的任何数据都将从页面缓存中删除。使用页面缓存进行同步,并简单地修剪在操作完成时实例化的作品集。
…
您可以将未缓存的缓冲 IO 视为更具吸引力的 O_DIRECT 组合 – 它没有 O_DIRECT 的任何限制。是的,它会复制数据,但与常规缓冲 IO 不同,它不会在回收方面遇到页面缓存的不可预测性。例如,在具有 32 个驱动器的测试盒上,使用缓冲 IO 读取它们如下所示:读取 bs 65536,未缓存 0
1s:145945MB/sec
2s:158067MB/sec
3s:157007MB/sec
4s:148622MB/sec
5s:118824MB/sec
6s:70494MB/sec
7s:41754MB/sec
8s:90811MB/sec
9s:92204MB/sec
10s:95178MB/sec
11s:95488MB/sec
12 秒:95552MB/秒
13秒:96275MB/秒,很容易看到页面缓存填满的位置,性能从良好变为不稳定,最后以低得多的速率稳定下来。
…
如果在为缓冲读取设置RWF_UNCACHED的情况下运行相同的测试用例,则输出如下所示:读取 bs 65536,未缓存 0
1s:153144MB/sec
2s:156760MB/sec
3s:158110MB/sec
4s:158009MB/sec
5s:158043MB/sec
6s:157638MB/sec
7s:157999MB/sec
8s:158024MB/sec
9s:157764MB/sec
10s:157477MB/sec
11 秒:157417MB/秒
12秒:157455MB/秒
13秒:157233MB/秒
14秒:156692MB/秒,读取性能仅为 ~155GB/秒。
…
如果只有测试应用程序使用 CPU,则不会在主线程之外进行回收。性能不仅提高了 65%,而且还使用了一半的 CPU 来完成。
现在,这是一个漂亮的胜利。
另一个补丁增加了对缓冲写入的 RWF_UNCACHED 的支持:
“如果RWF_UNCACHED设置为写入,请使用 drop_writeback 标记正在写入的作品集。然后写回完成将删除页面。write_iter处理程序只需启动页面的写回,写回完成将处理其余的工作……该行为是完全可预测的,即使在页面缓存被脏数据完全填满之后,也会在整个过程中执行相同的操作。与正常的缓冲写入相比,它还提高了大约 75%,并且使用的 CPU 只有系统的一半。
这是一些非常伟大的工作,希望能以这些非常令人兴奋的结果进入主线 Linux 内核。
转自 Fresh Take On Linux Uncached Buffered I/O “RWF_UNCACHED” Nets 65~75% Improvement – Phoronix