在覆盖文件中的数据之前,我想非常确定旧数据存储在磁盘上。它可能是一个非常大的文件(多GB),因此需要就地更新。通常写入将是2 MB或更大(我的计划是使用4 KB的块大小)。
而不是(或除了)调用fsync()之外,我想保留(不覆盖)磁盘上的旧数据,直到文件系统写入新数据。我不想依赖fsync()的主要原因是:most hard disks lie to you about doing an fsync.
所以我正在寻找的是文件系统,操作系统(例如Windows),硬盘驱动器的典型最大延迟是什么,直到数据写入磁盘,而不使用fsync或类似方法。如果可能,我想拥有真实世界的数字。我不是在寻找使用fsync的建议。
我知道没有100%可靠的方法,但我想更好地了解操作系统和文件系统在这方面的工作方式。
到目前为止我发现的是:30 seconds is / was the default for /proc/sys/vm/dirty_expire_centiseconds。然后“dirty pages are flushed (written) to disk ... (when) too much time has elapsed since a page has stayed dirty”(但在那里我找不到默认时间)。所以对于Linux来说,40秒似乎是安全的。但这适用于所有文件系统/磁盘吗?那么Windows,Android等等呢?我想得到适用于所有常见操作系统/文件系统/磁盘类型的答案,包括Windows,Android,常规硬盘,SSD等。
答案 0 :(得分:2)
让我以稍微不妥协的方式重申您的问题:您正试图控制其操作系统中的驱动程序无法控制的物理设备的行为。你想要做的事似乎是不可能的,如果你想要的是一个真正的保证,而不是一个很好的猜测。如果你想要的只是一个很好的猜测,那很好,但要注意这一点,并据此记录。
您可以使用正确的设备驱动程序解决此问题。例如,SCSI协议在其Force Unit Access (FUA)
和READ
命令中有WRITE
位,指示设备绕过任何内部缓存。即使数据最初写入缓冲,读取无缓冲应该能够验证它实际上是否存在。
答案 1 :(得分:2)
可靠地确保数据已同步的唯一方法是使用特定于操作系统的同步机制,并按PostgreSQL's Reliability Docs进行。
当操作系统向存储发送写入请求时 硬件,几乎没有什么可以确保数据到达 在一个真正的非易失性存储区域。相反,它是 管理员有责任确保所有存储空间 组件确保数据完整性。
所以不,没有真正可移植的解决方案,但是编写可移植包装器并部署可靠的解决方案是可能的(但很难)。
答案 2 :(得分:2)
首先感谢硬盘关于刷新数据的信息,这对我来说是新的。
现在解决您的问题:您希望确保您编写的所有数据都已写入磁盘(最低级别)。您说有两个部分需要控制:操作系统写入硬盘驱动器的时间以及硬盘驱动器写入磁盘的时间。
您唯一的解决方案是使用模糊逻辑计时器来估计何时写入数据。
在我看来,这是错误的方式。您可以控制操作系统何时写入硬盘驱动器,因此请使用它并控制它!那么只有躺着的硬盘才是你的问题。这个问题无法可靠地解决。我想,你应该告诉用户/管理员他在选择合适的硬盘时必须小心。当然,实施您提出的额外计时器可能是个好主意 我相信,你可以用不同的硬盘驱动器和Brad Fitzgerald的工具开始一系列测试,以便很好地估计硬盘驱动器何时会写入所有数据。但当然 - 如果硬盘想要撒谎,你永远无法确定数据是否真的已写入磁盘。
答案 3 :(得分:0)
为用户提供响应式系统需要很多缓存。
有cpu缓存,内核/文件系统内存缓存,磁盘驱动器内存缓存等。你问的是刷新所有缓存需要多长时间?
或者,另一种看待它的方法是,如果磁盘驱动器坏了会发生什么?所有刷新都不能保证读取或写入操作成功。
磁盘驱动器最终会变坏。您正在寻找的解决方案是如何拥有一个冗余的CPU /磁盘驱动器系统,以便系统能够在组件发生故障时继续运行。
您可以提高系统在RAID阵列和其他高可用性配置等硬件的帮助下继续工作的可能性。
就软件解决方案而言,我认为答案是,相信操作系统可以做到最佳。他们中的大多数经常冲洗缓冲区。
答案 4 :(得分:0)
这是一个古老的问题,但在2019年仍然适用。对于Windows,基于this,答案似乎是“至少每秒”:
为确保进行适当的刷新,缓存管理器每秒产生一个称为“惰性编写器”的进程。惰性写入器进程将最近未刷新的页面的八分之一排入磁盘。它会不断重新评估要刷新的数据量以获得最佳系统性能,如果需要写入更多数据,则会将更多数据排队。
需要明确的是,上面说的是每秒写入懒惰的写入器,这与每秒写入数据不同,但这是迄今为止我能找到的最好的方法搜索类似问题的答案(以我为例,我有一个Android应用程序,它可以将数据延迟写入磁盘,并且在间隔3秒时发现一些数据丢失,因此我将其减少到1秒看看是否有帮助...这可能会损害性能,但是如果您考虑恢复时间所花费的时间,丢失数据会使性能进一步下降。