0

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

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

4

2 回答 2

1

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

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

于 2016-04-28T12:15:40.927 回答
1

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

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

于 2016-04-28T12:18:41.720 回答