【问题标题】:A question about cache of filesystem关于文件系统缓存的问题
【发布时间】:2010-10-17 12:46:03
【问题描述】:

当我在文件系统中读取一个大文件时,缓存可以提高速度吗? 手术?

我认为有两种不同的答案:

1.是的。因为缓存可以预取,所以性能得到了提升。

2.没有。因为从缓存读取的速度比从读取的速度快 磁盘,最后我们可以发现缓存没有帮助,所以读取速度也是 从磁盘读取的速度。

哪一个是正确的?我如何证明答案?

[编辑]

还有一个问题是:

我不确定的是 也就是说,当您打开缓存时,带宽将用于

1.预取

2.预取和读取

哪个是正确的?

如果你 关闭缓存,磁盘带宽仅用于读取。

如果我关闭缓存并随机访问磁盘,所需时间是否与打开缓存时顺序读取的时间相当?

【问题讨论】:

    标签: caching operating-system filesystems


    【解决方案1】:

    1 绝对正确。当您的代码正在处理它已经收到的数据时,操作系统可以从磁盘获取缓存。是的,磁盘很可能仍然是瓶颈——但你不会读、处理、读、处理、读、处理,而是读+处理、读+处理、读+处理。例如,假设我们的处理需要一半的阅读时间。代表页面向下的时间,我们可能会在没有预取的情况下进行这种活动:

    Read
    Read
    Process
    Read
    Read
    Process
    Read
    Read
    Process
    

    而使用预取,这被优化为:

    Read
    Read
    Read     Process
    Read
    Read     Process
    Read
             Process
    

    基本上总时间将是“读取整个文件的时间+处理最后一条数据的时间”而不是“读取整个文件的时间+处理整个文件的时间”。

    测试它很棘手 - 您需要有一个可以调整或关闭缓存的操作系统。另一种选择是更改您打开文件的方式 - 例如,在 .NET 中,如果您使用 FileOptions.SequentialScan 打开文件,则缓存更有可能做正确的事情。尝试使用或不使用该选项。

    这主要是关于预取 - 通用缓存(即使在将数据交付给应用程序之后仍保留数据)是另一回事,如果您想多次使用相同的数据,显然这是一个巨大的胜利。还有“介于两者之间的东西”,应用程序只请求了少量数据,但磁盘已读取整个块 - 操作系统不会主动预取尚未请求的块,但可以缓存整个块所以如果应用程序随后从同一块请求更多数据,它可以从缓存中返回该数据。

    【讨论】:

    • 是的,但现在我必须让我的大儿子在游泳后换衣服。稍后回来:)
    • @Jon Skeet..:但是处理最后一条数据的时间是否与预取下一条数据的时间相当?还有一个问题是:如果我关闭缓存,随机访问磁盘,所需要的时间是否可以与开启缓存的情况下顺序读取的时间相媲美?
    • @Jinx:这完全取决于您对数据的处理方式!如果你正在做一些复杂的加密,你最终可能会花费更多的时间来处理而不是阅读。如果只计算文本行数,处理时间会小于 IO。
    • 如果您需要随机访问磁盘(即不是从头到尾读取文件,而是四处跳转),那么缓存不太可能提供帮助。
    【解决方案2】:

    第一个答案是正确的。

    磁盘具有固定的基础性能 - 但该固定的基础性能在不同情况下会有所不同。当您读取较长的数据段时,您可以从驱动器获得更好的实际性能 - 例如。当你提前缓存时。因此,缓存允许驱动器真正提高其实际性能。

    【讨论】:

      【解决方案3】:

      如果文件比你的内存大,那肯定没办法。

      【讨论】:

        【解决方案4】:

        Jon Skeet 与 .NET 有一个关于此主题的 very interesting benchmark。基本结果是,预取会有所帮助,您必须执行的每个读取单元的处理越多。

        【讨论】:

          【解决方案5】:

          在一般情况下,使用缓存会更快。需要考虑的几点:

          • 磁盘上的数据按表面(也称为磁头)、磁道和块进行组织。磁盘需要一些时间来定位读取头,以便您可以开始读取磁道。现在你需要从那条轨道上走五个街区。不幸的是,您要求的顺序与它们出现在物理媒体上的顺序不同。缓存将通过将整个轨道读入内存(比您需要的块多得多),然后重新索引它们(当磁头开始读取时,它可能会在轨道上任何地方,而不是在第一个块的开始)。如果没有这个,您必须等到磁道的第一个块在磁头下方旋转并开始读取 -> 读取磁道的时间将有效加倍。因此,使用缓存,您可以按任意顺序读取磁道的块,并且在磁头到达磁道上方时立即开始读取。

          • 如果文件系统已满,操作系统将开始将您的数据压缩到各种空白空间中。想象一下,第 1 块在第 5 轨上,第 2 块在第 7 轨上,第 3 块又在第 5 轨上。如果没有缓存,您会浪费很多时间来定位磁头。使用缓存时,磁道 5 被读取,并在磁头进入磁道 7 时保存在 RAM 中,当您请求块 3 时,您会立即得到它。

          • 大文件需要大量的元数据,即文件的数据块在哪里。在这种情况下,缓存将在您读取文件时保持这些数据处于活动状态,从而避免更多的头部垃圾。

          • 缓存将允许其他程序在您占用磁盘时以有效的方式访问其数据。所以整体性能会更好。当您阅读时第二个程序开始写入时,这一点非常重要。在这种情况下,缓存会在中断您的读取之前收集一些写入。此外,大多数程序读取数据、处理数据然后将其写回。如果没有缓存,程序要么进入自己的方式,要么必须实现自己的缓存方案以避免头部垃圾。

          • 缓存允许操作系统重新排序磁盘 I/O。假设您在轨道 5、7 和 13 上有块,但文件顺序要求轨道 5、13 和 7。显然,在通往 13 的途中读取轨道 7 比一直到 13 然后回来更有效到 7.

          因此,虽然理论上,如果没有缓存,读取大量数据会更快,但只有当您的文件是磁盘上唯一的文件并且所有元数据都被完美排序时,这才是正确的,数据的物理布局是这样的一种读取头总是在第一个块的开头开始读取磁道的方式,等等。

          【讨论】:

            【解决方案6】:

            另一点:很可能,经常使用的文件甚至在开始读取其中一个之前就已经在缓存中。

            【讨论】:

              猜你喜欢
              • 2010-11-28
              • 1970-01-01
              • 1970-01-01
              • 2013-04-29
              • 1970-01-01
              • 2021-06-16
              • 1970-01-01
              • 2017-11-23
              • 1970-01-01
              相关资源
              最近更新 更多