经过多少秒文件系统写缓冲区通常刷新?(After how many seconds are file

2019-08-03 09:04发布

在文件覆盖数据之前,我想是相当肯定的旧数据存储在磁盘上。 这是一个潜在的非常大的文件(GB多),所以就地需要更新。 通常写入将是2 MB或更大(我的计划是使用4 KB的块大小)。

代替(或补充)调用的fsync(),我想保留(未覆盖)磁盘上的旧数据,直到文件系统写新的数据。 主要的原因我不想依靠的fsync()是: 大多数硬盘骗你这样做的FSYNC。

所以,我正在寻找的是什么是一个文件系统,操作系统(如Windows)中,硬盘驱动器,直到数据被写入磁盘,而无需使用FSYNC或类似的方法典型的最大延迟。 我想如果可能的话,以具有真实世界的数字。 我不是在寻找建议使用FSYNC。

我知道有没有100%可靠的方式来做到这一点,但我想更好地了解操作系统和文件系统是如何在这方面的工作。

我发现迄今: 是/是30秒的/ proc / sys目录/ VM / dirty_expire_centiseconds默认 。 那么“ 脏页刷新(写入)到磁盘...(时)太多时间已经过去了,因为一个页面一直保持脏 ”(但我找不到默认的时间)。 因此,对于Linux的40秒似乎是在安全方面。 但是,这是真正的所有文件系统/磁盘? 什么有关Windows,Android和等? 我想获得一个适用于所有的普通操作系统/文件系统/磁盘类型,包括Windows,Android的,常规的硬盘,固态硬盘,等一个答案。

Answer 1:

让我只稍微严厉条款重申这个问题的方法:你试图控制该公司在操作系统中的驱动程序无法控制物理设备的行为。 你现在要做的似乎是不可能的,如果你想要的是一个实际的保障,而不是一个很好的猜测。 如果你想要的是一个相当不错的猜测,罚款,但相应地提防这和文档。

您可能能够使用正确的设备驱动程序来解决这个问题。 SCSI协议,例如,具有Force Unit Access (FUA)在其位READWRITE命令指示该设备绕过任何内部缓存。 即使数据最初写缓冲,读缓冲应该能够验证它实际上是在那里。



Answer 2:

可靠地确保数据已同步的唯一方法是使用操作系统特定同步机制,并按照PostgreSQL的可靠性文档 。

当操作系统发送一个写请求的存储硬件,还有什么可以做,以确保数据已经到达一个真正的非易失性存储区域。 相反,它是管理员的责任,确保所有存储组件确保数据的完整性。

所以,不,有没有真正的便携式解决方案,但它是可能的(但很难)编写可移植的包装和部署一个可靠的解决方案。



Answer 3:

首先感谢您的硬盘撒谎刷新数据的信息的,这是新的我。

现在您的问题:你想确保你写的所有数据已写入到磁盘(最低级别)。 您是说有两个部分,需要加以控制:时间当OS写入到硬盘,当硬盘写入磁盘的时间。

您的唯一的解决办法是使用一个模糊逻辑计时器当数据将被写入到估计。

在我看来,这是错误的方式。 您有关于当OS被写入到硬盘驱动器的控制,所以使用的可能性,并控制它! 那么只有躺在硬盘是你的问题。 这个问题不能可靠地解决。 我想,你应该告诉用户/管理员选择合适的硬盘驱动器的时候,他必须小心。 当然,这可能是一个好主意,你实现提出附加计时器。
我相信,这是由你来开始与不同的硬盘驱动器和布拉德·菲茨杰拉德的工具来获得时,硬盘将已经写了所有数据的良好估计测试一行。 不过,当然 - 如果硬盘驱动器要说谎,你永远不能保证数据确实已被写入到磁盘。



Answer 4:

有很多涉及给用户提供了响应系统高速缓存。

有CPU缓存,内核/文件系统内存缓存,磁盘驱动器内存缓存,等你问什么是如何长时间才能刷新所有缓存?

或者,另一种方式来看待它,如果磁盘驱动器变坏会发生什么? 所有的冲洗是不会保证成功读取或写入操作。

磁盘驱动器没有走坏,最终。 你正在寻找解决的办法是你怎么能有一个冗余CPU /硬盘驱动器系统,该系统生存的组件故障时仍能继续工作。

你可以改善的可能性,系统将跟上硬件的辅助工作,如RAID阵列和其他高可用性配置。

至于软件解决方案去,我想答案是,信任OS做最佳的事情。 他们中的大多数刷新缓冲区进行常规。



文章来源: After how many seconds are file system write buffers typically flushed?