13

在覆盖文件中的数据之前,我想非常确定旧数据存储在磁盘上。它可能是一个非常大的文件(数 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、普通硬盘、SSD 等。

4

5 回答 5

3

让我用稍微有点不友好的术语重申您的问题:您正试图控制其在操作系统中的驱动程序无法控制的物理设备的行为。如果你想要的是一个实际的保证,而不是一个很好的猜测,那么你试图做的似乎是不可能的。如果您想要的只是一个很好的猜测,那很好,但请注意这一点并相应地记录。

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

于 2012-12-03T03:10:43.160 回答
2

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

当操作系统向存储硬件发送写请求时,它几乎无法确保数据已到达真正的非易失性存储区域。相反,确保所有存储组件确保数据完整性是管理员的责任。

所以不,没有真正可移植的解决方案,但是可以(但很难)编写可移植的包装器并部署可靠的解决方案。

于 2012-12-03T03:16:19.860 回答
2

首先感谢硬盘关于刷新数据的信息,这对我来说是新的。

现在解决您的问题:您要确保写入的所有数据都已写入磁盘(最低级别)。您是说需要控制两个部分:操作系统写入硬盘的时间和硬盘写入磁盘的时间。

您唯一的解决方案是使用模糊逻辑计时器来估计何时写入数据。

在我看来,这是错误的方式。您可以控制操作系统何时写入硬盘驱动器,因此请使用并控制它!那么只有说谎的硬盘是你的问题。这个问题不能可靠地解决。我认为,您应该告诉用户/管理员,他在选择正确的硬盘驱动器时必须小心。当然,实现您建议的附加计时器可能是个好主意。
我相信,您可以开始使用不同的硬盘驱动器和 Brad Fitzgerald 的工具进行一系列测试,以很好地估计硬盘驱动器何时会写入所有数据。但当然——如果硬盘想撒谎,你永远无法确定数据是否真的已写入磁盘。

于 2012-12-07T14:32:09.473 回答
1

为用户提供响应式系统涉及很多缓存。

有 cpu 缓存、内核/文件系统内存缓存、磁盘驱动器内存缓存等。您要问的是刷新所有缓存需要多长时间?

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

磁盘驱动器最终会变坏。您正在寻找的解决方案是如何拥有一个冗余的 cpu/磁盘驱动器系统,以便系统在组件故障后仍能继续工作。

您可以提高系统在 RAID 阵列和其他高可用性配置等硬件的帮助下继续工作的可能性。

就软件解决方案而言,我认为答案是,相信操作系统会做最优化的事情。他们中的大多数定期刷新缓冲区。

于 2012-12-07T21:26:21.473 回答
0

这是一个老问题,但在 2019 年仍然相关。对于 Windows,基于此,答案似乎是“至少每隔一秒” :

为了确保进行适量的刷新,缓存管理器每秒生成一个称为惰性写入器的进程。惰性写入器进程将最近未刷新的页面的八分之一排队以写入磁盘。它不断地重新评估要刷新的数据量以获得最佳系统性能,如果需要写入更多数据,它会将更多数据排队。

需要明确的是,上面说懒惰的作家每秒钟都会产生一次,这与每秒写出数据不同,但这是我迄今为止在寻找类似问题的答案时能找到的最好的(在我的情况是,我有一个 Android 应用程序可以将数据延迟写回磁盘,并且在使用 3 秒的间隔时我注意到一些数据丢失,所以我将把它减少到 1 秒,看看是否有帮助......它可能损害性能,但如果您考虑恢复数据所需的时间,那么丢失数据会更严重地损害性能)。

于 2019-09-02T19:42:27.923 回答