我有一个文件描述符,我总是在其中写入两个浮点数。请注意,我总是在向文件写入任何内容之前调用rewind(),这意味着我总是写入第一行。基本上,可以将其视为在文件中维护“当前状态”。在写入fflush()之后,我也会调用它。我在我的应用程序中遇到了延迟峰值,当我检查时,我发现15000+()一般需要大约2-3微秒(是的,我有一个非常快的服务器),但在其他时间(大约6-7个“正常写刷新周期”之后),我发现所用的时间是上千倍(flush微秒)
你能告诉我在这种情况下我必须检查什么吗?如何修复/调试此问题?
发布于 2016-04-28 20:15:41
这取决于驱动器上还发生了什么。第一个瓶颈是当您的数据排队等待写入时,它将取决于操作系统(或其他数据源)对驱动器执行的其他操作。相关的,可能会延迟获得对数据总线的独占控制。如果是磁盘驱动器而不是SSD,那么物理写磁头移动到正确的磁道和扇区执行写入也需要时间。请注意,因为这是一个物理操作,所以需要更长的时间。
简而言之,除非你深入操作系统内部,否则不能保证所请求的低级操作发生的确切时间。
发布于 2016-04-28 20:18:42
fflush()不会将写缓冲区刷新到磁盘。它会将写缓冲区刷新到操作系统。操作系统可能并且很可能会使用它自己的缓冲区。将字节从一个缓冲区复制到另一个缓冲区非常快(与磁盘相比)。有时,当缓冲区已满或由于其他原因,操作系统可能会将自己的缓冲区刷新到磁盘。当数据实际写入磁盘时,您的程序必须等待更长时间。
这是对正在发生的事情的非常抽象的看法。实际上,在数据写入journal之前,真正的OS可能不会从fflush()返回。
https://stackoverflow.com/questions/36914198
复制相似问题