使用USB2附加的ext2音量改善小文件读取时间

时间:2011-10-09 00:14:30

标签: c linux performance ext2

我是一名比Linux程序员更有经验的Windows程序员。如果我遗漏了一些明显的东西,请道歉。

我需要在运行Linux的USB2连接的ext2卷上阅读> 10,000个小文件(~2-> 10k)。发行版是一个自定义并运行busybox。

我希望有关改进这些写入的提示。我正在做以下

handle = open(O_CREAT|O_RDWR)
read(handle, 2kBuffer)
close(handle);

因为我的读取很小,所以这一个read()倾向于在一次调用中完成工作

我能做些什么来改善表现吗?既然它是在USB2(可移动)磁盘上运行的Linux自定义发行版,那么我可能缺少任何明显的内核设置或挂载选项吗?

谢谢!

4 个答案:

答案 0 :(得分:2)

如果您只打算从中读取,我肯定会建议只读取文件。

除此之外,您是否尝试过并行执行多项操作?它加快了速度吗?您从文件中读取的数据实际上做了哪些工作?其他工作是否需要很长时间?

您有没有想过您的申请?

答案 1 :(得分:1)

挂载“atime”禁用的设备(您实际上不需要avery read()调用来导致元数据的写入)。请参阅noatime挂载选项。 open()调用还会在每个文件的基础上执行相同的O_NOATIME标记。

(虽然许多内核/发行版已经将“relatime”选项默认为一段时间,但主要产生的速度相同)

答案 2 :(得分:1)

由于从磁盘读取是块大小的(并且ext *不支持块子分配),如果你只是得到了一堆微小的文件,这些文件不能靠近自己填充块,将它们捆绑成档案会更好。如果你不能将相关文件组合在一起,这可能不是一个胜利。

考虑ext4? ext3中的dir_index选项是ext4中的标准选项,可以加速同一目录中包含大量文件的任何内容。它将元数据,目录和文件块更加连续地放置在磁盘上,并且大大减少了跟踪每个数据块所需的非数据块的数量(尽管对于大型文件而言比小型文件更重要)。有人建议将一个小文件的数据内联到它的inode中,但我不认为这是在上游。

如果你是受限制的(而不是带宽限制的),在读取任何文件之前调用fadvise(FADV_WILLNEED)可能会有所帮助。内核将此作为提示读入文件缓存。但是要小心:提前阅读比缓存更容易,而且浪费更慢。有人建议添加fincore以确定您的文件何时被驱逐,但我认为这也不是上游。

如果事实证明你受带宽约束,那么使用LZO或gzip压缩文件会有所帮助。使用这些压缩方法(而不是LZMA或bzip2),CPU应该比磁盘读取更快地解压缩。

答案 3 :(得分:0)

大多数发行版都非常糟糕,因为它们的块级缓存方式太低了。尝试设置

blockdev -setra 8192 /dev/yourdatasdev

它将使用更多的RAM,但额外的缓存几乎适用于任何情况。如果你有大量的RAM,使用更大的值,我还没有看到它的缺点,吞吐量和延迟只是越来越好,分配了更多的RAM。当然有“饱和”水平,但库存设置非常低(512),任何改进都会产生显着影响,而不会为这些缓冲区分配太多内存。

如果元数据访问速度慢下来,我喜欢使用愚蠢的技巧将updatedb放在crontab中,以短时间间隔运行,这样可以保持元数据缓存的温暖并预先加载所有有用的信息。< / p>