performance - SSD - 单个大磁盘读取与多个小磁盘读取

标签 performance filesystems batch-processing disk solid-state-drive

我正在开发一个项目,其中我使用文件系统作为数据库。我每天执行一个批处理作业,该作业将写入数万个小文件,然后从这些文件中读取。

这些文件可以完全装入机器的 RAM,但仍然有数十 GB。

各种问题:

  • 单个大读取是否比许多相同大小的小读取更快或更慢?
  • 我是否可以通过先将所有文件写入我的语言内的“内存中”FS,然后再批量写入磁盘来提高性能?
  • 同样的阅读问题。将整个文件夹加载到内存中的文件系统中,与调度散布着处理代码的许多小读取相比,是否更快?

最佳答案

Does a single large read tend to be faster or slower than many small reads of same size?

这取决于情况,但通常是的。

一方面,SSD 每秒可以执行的 IO 请求数量(请参阅 IOPS)是有限的。虽然与 HDD(尤其是新的 SSD)相比,SSD 的这个限制相当大,但这通常是有效读取许多小文件的限制。请注意,当前的高性能 NVMe SSD 可以达到约 300K IOPS。然而,文件系统需要对每个文件执行多个IO请求。因此,请记住,读取的小文件数量通常要少得多。

另一方面,读取巨大的缓冲区可能会更慢,因为操作系统通常需要执行缓冲区的内部副本,当缓冲区不适合高性能 SSD 上的 CPU 缓存时,这会带来巨大的开销。请注意,这非常依赖于用于读取目标文件的 API(请参阅 this 相关答案的第二部分)。大多数用于读/写文件的标准库实际上都是缓冲的,因此读取非常小的 block 并没有那么慢(由于额外的调用/操作,它仍然比中等大小的 block 慢)。但只有在顺序读/写时才可能进行缓冲。

Could I improve performance by first writing all files to an "in-memory" FS within my language and writing to disk later in a single batch?

可能不是。这高度依赖于操作系统的实现和应用程序的访问模式。如果写入是连续的,我预计快速 SSD 不会有巨大的速度提升,因为在 RAM 中写入+读取文件会增加开销,并且管理文件的成本会增加两倍。此外,请注意,某些操作系统限制 RAM 中 FS 的大小,并且可以保留此空间(需要调整并且通常需要高级权限)。此外,大多数操作系统倾向于将读/写文件缓存在 RAM 中(但比 RAM 中的文件系统效率明显更高)。 Windows 都是这种情况和 Linux默认情况下。

Same question for reads. Is it faster to load the whole folder into an in-memory FS vs dispatching many small reads interspersed with processing code?

大多数操作系统可以将读/写文件缓存在内存中,以便以后更快地读取它们。当进程请求内存时,操作系统负责释放缓存。你通常很难控制它的行为。如果文件已经被写入/读取并且您有足够的可用内存并且缓存缓冲区足够大,则不需要 RAM 中的 FS(因为它可能比缓存慢)。如果您不按顺序读取文件并且它们往往会从缓存中逐出,那么使用专用线程实现预取策略可能有助于加快读取速度。此外,映射文件和异步低级 API 也可能有助于在这种情况下更有效地实现这一点。


请注意,将许多小文件压缩为一个大文件可以显着提高性能,因为它大大减少了 FS 子系统的开销(打开系统调用、关闭系统调用、在关键情况下导致许多额外 IOPS 的递归目录获取等)。

关于performance - SSD - 单个大磁盘读取与多个小磁盘读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70910606/

相关文章:

c - 通过在文件/行自动终止 C 程序来测试耐久性?

linux - 命令在终端提示符下可用,但无处可寻

linux - 我如何计算出给定机器的功能有多强大?

performance - blazemeter 如何计算 hits/sec?

python - 如何在 Python 中使用 OpenCV 存储网络摄像头视频

linux - Debian下的sox批处理

vba - Excel VBA 未保存在当前目录中

java - 服务器重启期间的 Quartz 调度程序

c# - 优化加载和搜索速度 ASP.NET C#

C# 提高 SIMD Sum 的性能