【发布时间】:2012-11-18 23:08:11
【问题描述】:
在覆盖文件中的数据之前,我想确定旧数据是否存储在磁盘上。它可能是一个非常大的文件(数 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 等等。
【问题讨论】:
-
只是一个问题:你为什么要写入你要丢弃的数据?
-
您可能还想在您的
fsync(2)系统调用之后使用sync(2)或syncfs(2)系统调用,并且您可能还需要谨慎使用sync_file_range(2)。 -
请注意,“默认”值(由操作系统内核定义,或由分发打包程序通过启动脚本定义)无法保证。特定系统可能具有完全不同的值有很多正当的原因,因为管理员已经以这种方式对其进行了调整。在不必做出这样的假设的情况下弄清楚如何解决您的问题可能会更好......
-
@NikosC。我正在写图书馆。无法控制应用程序调用什么方法的库。
-
@BasileStarynkevitch 您是否阅读了问题中的文章“大多数硬盘对您撒谎以进行 fsync”? fsync 和相关方法不是一个可靠的解决方案,我不想依赖它们。此外,它们并非在所有操作系统上都可用。
标签: file file-io filesystems data-persistence