遍历文件系统的最快方法

The fastest way to iterate through file system

有时候需要递归遍历一个文件夹,读取里面所有文件的内容。

我使用 C++ 和 Linux。

文件夹内容是任意的,从十亿个小文件到十几个庞大的文件。

为了达到最高的阅读速度,我运行进退两难。 一方面,从一个线程执行所有读取几乎总是更快,因为对文件系统的并行访问会导致并发读取文件之间的头部抖动:

另一方面,出于两个原因,从一个线程顺序访问文件系统并没有达到预期的速度。

首先,完成上一个读取请求和启动下一个读取请求之间花费的时间丢失了。我尽量减少它,除了阅读本身之外,在阅读线程中什么都不做,但在用户和内核之间不断切换space它仍然是一些时间丢失,尤其是在上述数十亿个小文件的情况下。

其次,single-thread 读取不允许内核 and/or HDD 控制器对请求的扇区执行一些重新排序,这可以提高性能。

所以,我想实现两件事:

1) 例如LibUsb,我可以有几个待处理的读取请求,这些请求按顺序处理 在上一个请求完成和下一个请求启动之间没有暂停。是否可以为 FS 访问获得类似的东西?

2)是否可以同时向内核提交多个读请求,但是用某种方式标记它们,让内核知道这些请求没有个人 截止日期,并且应该最小化他们累积执行的总结时间

既然您正在使用 Linux,也许您应该尝试一下新的 io_uring 界面。它声称比传统的同步(线程池+阻塞 sycalls)或异步 libaio 方法更高效和更高效。

对于 1,io_uringIORING_SETUP_SQPOLL 标志似乎可以满足您的需求,只要您不断发送请求即可。