0

我是一个比 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

4 回答 4

2

如果您只想从中读取文件,我绝对建议您以只读方式打开文件。

除此之外,您是否尝试过并行执行多个操作?它会加快速度吗?您实际上对从文件中读取的数据做了什么工作?其他工作是否需要大量时间?

您是否对您的应用程序进行了概要分析?

于 2011-10-09T15:05:34.297 回答
1

在禁用“ atime ”的情况下挂载设备(您真的不需要每次调用 read() 来导致写入元数据)。请参阅noatime挂载选项。open() 调用也需要一个 O_NOATIME 标志,在每个文件的基础上做同样的事情。

(虽然,许多内核/发行版已经将“relatime”选项默认设置了一段时间,产生了几乎相同的加速)

于 2011-10-09T00:55:13.567 回答
1

由于从磁盘读取的数据是块大小的(并且 ext* 不支​​持块子分配),如果您只是有一堆小文件,它们无法自行填充块,那么您将最好将它们捆绑到档案中。但是,如果您不能将相关文件组合在一起,这可能不是一个胜利。

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

如果您受搜索限制(而不是受带宽限制),则fadvise(FADV_WILLNEED)在读取其中任何一个文件之前调用一组文件可能会有所帮助。内核将此作为预读文件缓存的提示。但是要小心:提前读取超过缓存可以容纳的内容是浪费且速度较慢。有一个提案要添加fincore以确定您的文件何时被驱逐,但我认为这也不是上游。

如果事实证明您受到带宽的限制,使用 LZO 或 gzip 压缩文件会有所帮助。CPU 应该仍然比使用这些压缩方法(相对于 LZMA 或 bzip2)读取磁盘更快地解压缩。

于 2011-10-09T01:25:30.307 回答
0

大多数发行版都非常讨厌将其块级缓存设置得太低。尝试设置

blockdev -setra 8192 /dev/yourdatasdev

它将使用更多的 RAM,但额外的缓存几乎适用于任何情况。如果你有很多 RAM,使用更大的值,我还没有看到它的缺点,吞吐量和延迟会随着分配给它的更多 RAM 变得越来越好。当然有一个“饱和”级别,但是库存设置太低(512),以至于任何改进都会产生显着的效果,而不会为这些缓冲区分配太多内存。

如果是元数据访问减慢了您的速度,我喜欢使用一个愚蠢的技巧,即放入updatedbcrontab,以短时间间隔运行,以保持元数据缓存温暖并预加载所有有用的信息。

于 2011-10-09T16:55:26.323 回答