2016-04-28 63 views
0

我有一个文件描述符,我总是写两个浮点数。请注意,在将任何内容写入文件之前,我总是调用rewind(),这意味着我总是写入第一行。基本上,把它看作是维护一个文件内的“当前状态”。写完之后我还会打电话给fflush()。我在应用程序中遇到延迟尖峰,当我检查时,我发现fflush()通常需要2-3微秒左右(是的,我有一个快速的服务器),但在其他时间(大约6-7“正常写入-flush循环“),我看到所用的时间是扣球高达数千次(15000+微秒)为什么fflush()花费可变的时间冲刷同一条数据

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

+3

好吧,你正在写某种存储,可能(你没有说)硬盘。我能想到的两种本地持久性存储机制(HDD和SSD)将根据他们必须做的事情而具有不同的响应时间。 150000 *微*秒仍然是*真的很短的时间*。 –

+0

会使用内存映射文件的帮助吗? – Chani

+0

@Wildling *将使用内存映射文件帮助?*阅读[本文](http://marc.info/?l=linux-kernel&m=95496636207616&w=2)Linux Torvalds。 'mmap()'是** NOT **一些使一切更快的魔法。 –

回答

1

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

总之,除非你是深,OS深处那么就没有究竟何时请求低一级的行动发生的保证。

1

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

这是关于发生了什么的非常抽象的视图。实际上,一个真正的操作系统可能不会从fflush()返回,直到数据被写入journal

+0

那么我在这里有什么选择?使用内存映射文件会有帮助吗? – Chani

+1

好吧,如果我处在这种情况下,我还会考虑在华尔街以外寻找另一份工作的选择,这种工作没有受到完全平庸的问题的影响,这些问题可以归结为毫无意义的毫微秒和纳秒。只是说。 –

+0

@Wildling最好购买更快的磁盘,ssd。不要调用'fflush',或者如果你这么做,请使用异步线程,以便延迟无关紧要。 – user2079303

相关问题