我有一个Linux应用程序,可以并行读取150-200个文件(4-10GB)。每个文件都是按顺序读取的,以小而不等的块为单位,通常每个块不到2K。
目前,我需要维持超过200 MB/s的读取速率。磁盘可以很好地处理这个请求。预计将需要超过1 GB/s(此时磁盘的性能无法达到)。
我们实现了两种不同的读取系统,都大量使用了posix_advise
:第一种是mmap
读取,在其中我们映射整个数据集并且按需读取。第二种是基于read()
/seek()
的系统。
两者都运作良好,但只适用于中等情况,read()
方法更好地管理我们的文件缓存,并且可以处理数百GB的文件,但速度受限,mmap
能够预先缓存数据,使得超过200MB/s的持续数据传输速率易于维护,但不能处理大型总数据集大小。
所以我的问题如下:
A: 在Linux上,read()
类型的文件I/O是否可以通过posix_advise
之外的进一步优化来实现?或者说,调整磁盘调度程序、虚拟内存管理器和posix_advise
调用是我们所期望的吗?
B: 是否有系统化的方法可以使mmap更好地处理非常大的映射数据?
Mmap-vs-reading-blocks是我正在处理的类似问题,并提供了一个良好的起点,解决这个问题,以及mmap-vs-read中的讨论。
mmap()
映射整个数据集时遇到了什么问题。只要您编译的是64位可执行文件,mmap()
应该可以轻松地映射数百GB的数据(无论多大)。 - caf