【问题标题】:Why does fflush() takes variable amount of time flushing the same piece of data为什么 fflush() 需要不同的时间来刷新同一条数据
【发布时间】:2016-04-28 12:07:29
【问题描述】:

我有一个文件描述符,我总是向其中写入两个浮点数。请注意,我总是在向文件写入任何内容之前调用 rewind(),这意味着我总是在写入第一行。基本上,将其视为在文件中维护“当前状态”。写完后我也会调用 fflush() 。我在我的应用程序中遇到延迟峰值,当我检查时,我发现 fflush() 通常需要大约 2-3 微秒(是的,我有一个邪恶的快速服务器),但在其他时间(大约 6-7“正常写入-flush 周期”)我看到所花费的时间增加了数千次(15000+ 微秒)

你能告诉我在这种情况下我必须检查什么吗?如何修复/调试此问题?

【问题讨论】:

  • 嗯,您正在写入某种类型的存储,可能(您还没有说过)HDD。我能想到的两种本地持久存储机制(HDD 和 SSD)都将根据它们还需要做什么而具有不同的响应时间。 150000 秒仍然是一个非常短的时间
  • 使用内存映射文件有帮助吗?
  • @Wildling 使用内存映射文件有帮助吗? 从 Linux Torvalds 阅读 this postmmap() 不是某种让一切变得更快的魔法。

标签: c++ file fflush


【解决方案1】:

这取决于驱动器发生的其他情况。第一个瓶颈是当您的数据排队等待写入时,这将取决于操作系统(或其他数据源)对驱动器所做的其他事情。 相关,可能会有延迟获得对数据总线的独占控制。 如果它是磁驱动器而不是 SSD,那么物理写入头也需要时间移动到正确的磁道和扇区以执行写入。请注意,因为这是一个物理动作,所以需要更长的时间。

简而言之,除非您深入操作系统,否则无法保证请求的低级操作何时发生。

【讨论】:

    【解决方案2】:

    fflush() 不会将写入缓冲区刷新到磁盘。它将写缓冲区刷新到操作系统。操作系统可能并且可能确实使用它自己的缓冲区。将字节从一个缓冲区复制到另一个缓冲区非常快(与磁盘相比)。有时,当缓冲区已满或出于其他原因时,操作系统可能会将其自己的缓冲区刷新到磁盘。当数据真正写入磁盘时,您的程序必须等待很长时间。

    这是对正在发生的事情的非常抽象的看法。实际上,真正的操作系统可能不会从fflush() 返回,直到数据写入journal

    【讨论】:

    • 那么我有什么选择呢?使用内存映射文件会有帮助吗?
    • @Wildling 购买更快的磁盘,最好是ssd。不要调用fflush,或者如果你这样做,使用异步线程,这样延迟就无关紧要了。
    猜你喜欢
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 2021-09-10
    • 2017-01-18
    • 2010-11-19
    • 2013-07-16
    相关资源
    最近更新 更多