为什么fflush()需要花费不同的时间来刷新同一条数据

时间:2016-04-28 12:07:30

标签: c++ file fflush

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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